diff --git a/CustomKeyboard/KeyboardViewController.m b/CustomKeyboard/KeyboardViewController.m index a55d484..e018f82 100644 --- a/CustomKeyboard/KeyboardViewController.m +++ b/CustomKeyboard/KeyboardViewController.m @@ -6,11 +6,16 @@ // #import "KeyboardViewController.h" +#import "KBToolBar.h" +#import "KBKeyboardView.h" +#import "KBKey.h" static CGFloat KEYBOARDHEIGHT = 256; -@interface KeyboardViewController () -@property (nonatomic, strong) UIButton *nextKeyboardButton; +@interface KeyboardViewController () +@property (nonatomic, strong) UIButton *nextKeyboardButton; // 系统“下一个键盘”按钮(可选) +@property (nonatomic, strong) KBToolBar *topBar; +@property (nonatomic, strong) KBKeyboardView *keyboardView; @end @implementation KeyboardViewController @@ -18,7 +23,7 @@ static CGFloat KEYBOARDHEIGHT = 256; - (void)updateViewConstraints { [super updateViewConstraints]; - // Add custom view sizing constraints here + // 可在此添加自定义尺寸约束 } - (void)viewDidLoad { @@ -43,14 +48,29 @@ static CGFloat KEYBOARDHEIGHT = 256; - (void)setupUI { - CGFloat toolBarHeight = 40; - CGFloat bottom = 5; - CGFloat buttonSpace = 8; - CGFloat eachButtonHeight = (KEYBOARDHEIGHT - toolBarHeight - 10 - 8 * 3 - bottom) / 4; - - UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 30)]; - view.backgroundColor = [UIColor redColor]; - [self.view addSubview:view]; +// self.view.translatesAutoresizingMaskIntoConstraints = NO; + // 固定键盘整体高度 + [self.view.heightAnchor constraintEqualToConstant:KEYBOARDHEIGHT].active = YES; + + // 顶部栏 + self.topBar = [[KBToolBar alloc] init]; + self.topBar.delegate = self; + [self.view addSubview:self.topBar]; + [self.topBar mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.equalTo(self.view); + make.top.equalTo(self.view.mas_top).offset(6); + make.height.mas_equalTo(40); + }]; + + // 键盘区域 + self.keyboardView = [[KBKeyboardView alloc] init]; + self.keyboardView.delegate = self; + [self.view addSubview:self.keyboardView]; + [self.keyboardView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.equalTo(self.view); + make.top.equalTo(self.topBar.mas_bottom).offset(4); + make.bottom.equalTo(self.view.mas_bottom).offset(-4); + }]; } @@ -61,11 +81,11 @@ static CGFloat KEYBOARDHEIGHT = 256; } - (void)textWillChange:(id)textInput { - // The app is about to change the document's contents. Perform any preparation here. + // 文档内容即将变化,可在此做准备 } - (void)textDidChange:(id)textInput { - // The app has just changed the document's contents, the document context has been updated. + // 文档内容刚发生变化,环境已更新 UIColor *textColor = nil; if (self.textDocumentProxy.keyboardAppearance == UIKeyboardAppearanceDark) { @@ -76,4 +96,46 @@ static CGFloat KEYBOARDHEIGHT = 256; [self.nextKeyboardButton setTitleColor:textColor forState:UIControlStateNormal]; } +#pragma mark - KBToolBarDelegate + +- (void)toolBar:(KBToolBar *)toolBar didTapActionAtIndex:(NSInteger)index { + // 可根据业务透传或处理。示例:插入占位标记 [A1]..[A4] + NSString *placeholder = [NSString stringWithFormat:@"[A%ld]", (long)index+1]; + [self.textDocumentProxy insertText:placeholder]; +} + +- (void)toolBarDidTapSettings:(KBToolBar *)toolBar { + // 通常可通过 openURL 或宿主处理打开设置页。 + // 这里示例仅插入一个标记。 + [self.textDocumentProxy insertText:@"[settings]"]; +} + +#pragma mark - KBKeyboardViewDelegate + +- (void)keyboardView:(KBKeyboardView *)keyboard didTapKey:(KBKey *)key { + switch (key.type) { + case KBKeyTypeCharacter: + [self.textDocumentProxy insertText:key.output ?: key.title ?: @""]; break; + case KBKeyTypeBackspace: + [self.textDocumentProxy deleteBackward]; break; + case KBKeyTypeSpace: + [self.textDocumentProxy insertText:@" "]; break; + case KBKeyTypeReturn: + [self.textDocumentProxy insertText:@"\n"]; break; + case KBKeyTypeModeChange: { + // 切换 字母 <-> 数字 布局 + keyboard.layoutStyle = (keyboard.layoutStyle == KBKeyboardLayoutStyleLetters) ? KBKeyboardLayoutStyleNumbers : KBKeyboardLayoutStyleLetters; + [keyboard reloadKeys]; + } break; + case KBKeyTypeGlobe: + [self advanceToNextInputMode]; break; + case KBKeyTypeCustom: + // 自定义占位:切换语言或其它操作 + [self.textDocumentProxy insertText:@"[lang]"]; break; + case KBKeyTypeShift: + // Shift 已在 KBKeyboardView 内部处理 + break; + } +} + @end diff --git a/CustomKeyboard/Model/KBKey.h b/CustomKeyboard/Model/KBKey.h new file mode 100644 index 0000000..3a8c1ed --- /dev/null +++ b/CustomKeyboard/Model/KBKey.h @@ -0,0 +1,31 @@ +// +// KBKey.h +// CustomKeyboard +// +// 简单的键位数据模型,用于描述键盘上的一个键。 +// + +#import +#import + +typedef NS_ENUM(NSInteger, KBKeyType) { + KBKeyTypeCharacter = 0, // 普通字符输出 + KBKeyTypeBackspace, // 删除 + KBKeyTypeShift, // 大小写切换 + KBKeyTypeModeChange, // 模式切换(如 123/ABC) + KBKeyTypeSpace, // 空格 + KBKeyTypeReturn, // 回车/发送 + KBKeyTypeGlobe, // 系统地球键 + KBKeyTypeCustom // 自定义功能占位 +}; + +@interface KBKey : NSObject + +@property (nonatomic, assign) KBKeyType type; +@property (nonatomic, copy) NSString *title; // 显示标题 +@property (nonatomic, copy) NSString *output; // 字符键插入的文本 + ++ (instancetype)keyWithTitle:(NSString *)title output:(NSString *)output; ++ (instancetype)keyWithTitle:(NSString *)title type:(KBKeyType)type; + +@end diff --git a/CustomKeyboard/Model/KBKey.m b/CustomKeyboard/Model/KBKey.m new file mode 100644 index 0000000..92d2625 --- /dev/null +++ b/CustomKeyboard/Model/KBKey.m @@ -0,0 +1,27 @@ +// +// KBKey.m +// CustomKeyboard +// + +#import "KBKey.h" + +@implementation KBKey + ++ (instancetype)keyWithTitle:(NSString *)title output:(NSString *)output { + KBKey *k = [[KBKey alloc] init]; + k.type = KBKeyTypeCharacter; + k.title = title ?: @""; + k.output = output ?: title ?: @""; + return k; +} + ++ (instancetype)keyWithTitle:(NSString *)title type:(KBKeyType)type { + KBKey *k = [[KBKey alloc] init]; + k.type = type; + k.title = title ?: @""; + k.output = @""; + return k; +} + +@end + diff --git a/CustomKeyboard/PrefixHeader.pch b/CustomKeyboard/PrefixHeader.pch index b761eff..9beb21f 100644 --- a/CustomKeyboard/PrefixHeader.pch +++ b/CustomKeyboard/PrefixHeader.pch @@ -12,7 +12,7 @@ // You will also need to set the Prefix Header build setting of one or more of your targets to reference this file. #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width -#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.width +#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height #define imageNamed(s) [UIImage imageNamed:s] #import "Masonry.h" diff --git a/CustomKeyboard/View/KBKeyButton.h b/CustomKeyboard/View/KBKeyButton.h new file mode 100644 index 0000000..88ec368 --- /dev/null +++ b/CustomKeyboard/View/KBKeyButton.h @@ -0,0 +1,17 @@ +// +// KBKeyButton.h +// CustomKeyboard +// + +#import +@class KBKey; + +/// 自定义键按钮(UIButton 子类):圆角外观,按下高亮效果。 +@interface KBKeyButton : UIButton + +@property (nonatomic, strong) KBKey *key; + +/// 配置基础样式(背景、圆角等)。创建按钮时调用。 +- (void)applyDefaultStyle; + +@end diff --git a/CustomKeyboard/View/KBKeyButton.m b/CustomKeyboard/View/KBKeyButton.m new file mode 100644 index 0000000..259c064 --- /dev/null +++ b/CustomKeyboard/View/KBKeyButton.m @@ -0,0 +1,36 @@ +// +// KBKeyButton.m +// CustomKeyboard +// + +#import "KBKeyButton.h" +#import "KBKey.h" + +@implementation KBKeyButton + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self applyDefaultStyle]; + } + return self; +} + +- (void)applyDefaultStyle { + self.titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightSemibold]; // 字体样式 + [self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; + [self setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; + self.backgroundColor = [UIColor whiteColor]; + self.layer.cornerRadius = 6.0; // 圆角 + self.layer.masksToBounds = NO; + self.layer.shadowColor = [UIColor colorWithWhite:0 alpha:0.1].CGColor; // 阴影效果 + self.layer.shadowOpacity = 1.0; + self.layer.shadowOffset = CGSizeMake(0, 1); + self.layer.shadowRadius = 1.5; +} + +- (void)setHighlighted:(BOOL)highlighted { + [super setHighlighted:highlighted]; + self.alpha = highlighted ? 0.7 : 1.0; // 简单按压反馈 +} + +@end diff --git a/CustomKeyboard/View/KBKeyboardView.h b/CustomKeyboard/View/KBKeyboardView.h new file mode 100644 index 0000000..d81b3dc --- /dev/null +++ b/CustomKeyboard/View/KBKeyboardView.h @@ -0,0 +1,31 @@ +// +// KBKeyboardView.h +// CustomKeyboard +// +// 键盘主容器,内部管理按键行布局。 +// + +#import + +@class KBKeyboardView, KBKey; + +typedef NS_ENUM(NSInteger, KBKeyboardLayoutStyle) { + KBKeyboardLayoutStyleLetters = 0, + KBKeyboardLayoutStyleNumbers +}; + +@protocol KBKeyboardViewDelegate +@optional +/// 键被点击的回调 +- (void)keyboardView:(KBKeyboardView *)keyboard didTapKey:(KBKey *)key; +@end + +@interface KBKeyboardView : UIView + +@property (nonatomic, weak) id delegate; +@property (nonatomic, assign) KBKeyboardLayoutStyle layoutStyle; // 布局样式(字母/数字) +@property (nonatomic, assign, getter=isShiftOn) BOOL shiftOn; // 大小写状态 + +- (void)reloadKeys; // 当布局样式/大小写变化时调用 + +@end diff --git a/CustomKeyboard/View/KBKeyboardView.m b/CustomKeyboard/View/KBKeyboardView.m new file mode 100644 index 0000000..9b1dab4 --- /dev/null +++ b/CustomKeyboard/View/KBKeyboardView.m @@ -0,0 +1,255 @@ +// +// KBKeyboardView.m +// CustomKeyboard +// + +#import "KBKeyboardView.h" +#import "KBKeyButton.h" +#import "KBKey.h" + +@interface KBKeyboardView () +@property (nonatomic, strong) UIView *row1; +@property (nonatomic, strong) UIView *row2; +@property (nonatomic, strong) UIView *row3; +@property (nonatomic, strong) UIView *row4; +@property (nonatomic, strong) NSArray *> *keysForRows; +@end + +@implementation KBKeyboardView + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0]; + _layoutStyle = KBKeyboardLayoutStyleLetters; + _shiftOn = YES; // 初始使用大写,贴近截图效果 + [self buildBase]; + [self reloadKeys]; + } + return self; +} + +- (void)buildBase { + [self addSubview:self.row1]; + [self addSubview:self.row2]; + [self addSubview:self.row3]; + [self addSubview:self.row4]; + + CGFloat vSpacing = 8; + [self.row1 mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.mas_top).offset(8); + make.left.right.equalTo(self); + make.height.mas_equalTo(44); + }]; + [self.row2 mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.row1.mas_bottom).offset(vSpacing); + make.left.right.equalTo(self); + make.height.equalTo(self.row1); + }]; + [self.row3 mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.row2.mas_bottom).offset(vSpacing); + make.left.right.equalTo(self); + make.height.equalTo(self.row1); + }]; + [self.row4 mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.row3.mas_bottom).offset(vSpacing); + make.left.right.equalTo(self); + make.height.equalTo(self.row1); + make.bottom.equalTo(self.mas_bottom).offset(-6); + }]; +} + +- (void)reloadKeys { + // 移除旧按钮 + for (UIView *row in @[self.row1, self.row2, self.row3, self.row4]) { + [row.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + } + + self.keysForRows = [self buildKeysForCurrentLayout]; + [self buildRow:self.row1 withKeys:self.keysForRows[0]]; + // 第二行:字母布局时通过左右等宽占位让整行居中 + CGFloat row2Spacer = (self.layoutStyle == KBKeyboardLayoutStyleLetters) ? 0.5 : 0.0; + [self buildRow:self.row2 withKeys:self.keysForRows[1] edgeSpacerMultiplier:row2Spacer]; + [self buildRow:self.row3 withKeys:self.keysForRows[2]]; + [self buildRow:self.row4 withKeys:self.keysForRows[3]]; +} + +- (NSArray *> *)buildKeysForCurrentLayout { + if (self.layoutStyle == KBKeyboardLayoutStyleNumbers) { + // 数字/符号布局:3 行主键 + 底部控制行 + NSArray *r1 = @[ + [KBKey keyWithTitle:@"1" output:@"1"], [KBKey keyWithTitle:@"2" output:@"2"], [KBKey keyWithTitle:@"3" output:@"3"], + [KBKey keyWithTitle:@"4" output:@"4"], [KBKey keyWithTitle:@"5" output:@"5"], [KBKey keyWithTitle:@"6" output:@"6"], + [KBKey keyWithTitle:@"7" output:@"7"], [KBKey keyWithTitle:@"8" output:@"8"], [KBKey keyWithTitle:@"9" output:@"9"], [KBKey keyWithTitle:@"0" output:@"0"], + ]; + NSArray *r2 = @[ + [KBKey keyWithTitle:@"-" output:@"-"], [KBKey keyWithTitle:@"/" output:@"/"], [KBKey keyWithTitle:@":" output:@":"], + [KBKey keyWithTitle:@";" output:@";"], [KBKey keyWithTitle:@"(" output:@"("], [KBKey keyWithTitle:@")" output:@")"], + [KBKey keyWithTitle:@"$" output:@"$"], [KBKey keyWithTitle:@"&" output:@"&"], [KBKey keyWithTitle:@"@" output:@"@"], [KBKey keyWithTitle:@"\"" output:@"\""], + ]; + NSArray *r3 = @[ + [KBKey keyWithTitle:@"#+=" type:KBKeyTypeModeChange], + [KBKey keyWithTitle:@"," output:@","], [KBKey keyWithTitle:@"." output:@"."], [KBKey keyWithTitle:@"?" output:@"?"], + [KBKey keyWithTitle:@"!" output:@"!"], [KBKey keyWithTitle:@"'" output:@"'"], + [KBKey keyWithTitle:@"⌫" type:KBKeyTypeBackspace], + ]; + NSArray *r4 = @[ + [KBKey keyWithTitle:@"ABC" type:KBKeyTypeModeChange], + [KBKey keyWithTitle:@"," output:@","], + [KBKey keyWithTitle:@"space" type:KBKeyTypeSpace], + [KBKey keyWithTitle:@"中/英" type:KBKeyTypeCustom], + [KBKey keyWithTitle:@"发送" type:KBKeyTypeReturn], + ]; + return @[r1, r2, r3, r4]; + } + + // 字母布局(QWERTY) + NSArray *r1 = @[ @"Q", @"W", @"E", @"R", @"T", @"Y", @"U", @"I", @"O", @"P" ]; + NSArray *r2 = @[ @"A", @"S", @"D", @"F", @"G", @"H", @"J", @"K", @"L" ]; + NSArray *r3chars = @[ @"Z", @"X", @"C", @"V", @"B", @"N", @"M" ]; + + NSMutableArray *row1 = [NSMutableArray arrayWithCapacity:r1.count]; + for (NSString *s in r1) { [row1 addObject:[KBKey keyWithTitle:s output:(self.shiftOn ? s : s.lowercaseString)]]; } + + NSMutableArray *row2 = [NSMutableArray arrayWithCapacity:r2.count]; + for (NSString *s in r2) { [row2 addObject:[KBKey keyWithTitle:s output:(self.shiftOn ? s : s.lowercaseString)]]; } + + NSMutableArray *row3 = [NSMutableArray array]; + [row3 addObject:[KBKey keyWithTitle:@"⇧" type:KBKeyTypeShift]]; + for (NSString *s in r3chars) { [row3 addObject:[KBKey keyWithTitle:s output:(self.shiftOn ? s : s.lowercaseString)]]; } + [row3 addObject:[KBKey keyWithTitle:@"⌫" type:KBKeyTypeBackspace]]; + + NSArray *row4 = @[ [KBKey keyWithTitle:@"123" type:KBKeyTypeModeChange], + [KBKey keyWithTitle:@"," output:@","], + [KBKey keyWithTitle:@"space" type:KBKeyTypeSpace], + [KBKey keyWithTitle:@"中/英" type:KBKeyTypeCustom], + [KBKey keyWithTitle:@"发送" type:KBKeyTypeReturn] ]; + + return @[row1.copy, row2.copy, row3.copy, row4]; +} + +- (void)buildRow:(UIView *)row withKeys:(NSArray *)keys { + [self buildRow:row withKeys:keys edgeSpacerMultiplier:0.0]; +} + +- (void)buildRow:(UIView *)row withKeys:(NSArray *)keys edgeSpacerMultiplier:(CGFloat)edgeSpacerMultiplier { + CGFloat hInset = 6; // 行左右内边距 + CGFloat spacing = 6; // 键与键之间的间距 + UIView *previous = nil; + UIView *leftSpacer = nil; + UIView *rightSpacer = nil; + if (edgeSpacerMultiplier > 0.0) { + leftSpacer = [UIView new]; + rightSpacer = [UIView new]; + leftSpacer.backgroundColor = [UIColor clearColor]; + rightSpacer.backgroundColor = [UIColor clearColor]; + [row addSubview:leftSpacer]; + [row addSubview:rightSpacer]; + [leftSpacer mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(row.mas_left).offset(hInset); + make.centerY.equalTo(row); + make.height.mas_equalTo(1); + }]; + [rightSpacer mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.equalTo(row.mas_right).offset(-hInset); + make.centerY.equalTo(row); + make.height.mas_equalTo(1); + }]; + } + for (NSInteger i = 0; i < keys.count; i++) { + KBKey *key = keys[i]; + KBKeyButton *btn = [[KBKeyButton alloc] init]; + btn.key = key; + [btn setTitle:key.title forState:UIControlStateNormal]; + [btn addTarget:self action:@selector(onKeyTapped:) forControlEvents:UIControlEventTouchUpInside]; + [row addSubview:btn]; + + [btn mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.bottom.equalTo(row); + if (previous) { + make.left.equalTo(previous.mas_right).offset(spacing); + } else { + if (leftSpacer) { + make.left.equalTo(leftSpacer.mas_right).offset(spacing); + } else { + make.left.equalTo(row.mas_left).offset(hInset); + } + } + }]; + + // 宽度规则:字符键等宽;特殊键按倍数放大 + if (key.type == KBKeyTypeCharacter) { + if (previous && previous != nil) { + if (((KBKeyButton *)previous).key.type == KBKeyTypeCharacter) { + [btn mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.equalTo(previous); + }]; + } + } + } else { + // special keys: give 1.5x of a character key by deferring constraint equalities after loop + } + + previous = btn; + } + // 右侧使用内边距或右占位 + [previous mas_makeConstraints:^(MASConstraintMaker *make) { + if (rightSpacer) { + make.right.equalTo(rightSpacer.mas_left).offset(-spacing); + } else { + make.right.equalTo(row.mas_right).offset(-hInset); + } + }]; + + // 第二遍:以首个字符键为基准,统一设置特殊键宽度倍数 + KBKeyButton *firstChar = nil; + for (KBKeyButton *b in row.subviews) { + if ([b isKindOfClass:[KBKeyButton class]] && b.key.type == KBKeyTypeCharacter) { firstChar = b; break; } + } + if (firstChar) { + for (KBKeyButton *b in row.subviews) { + if (![b isKindOfClass:[KBKeyButton class]]) continue; + if (b.key.type == KBKeyTypeCharacter) continue; + CGFloat multiplier = 1.5; + if (b.key.type == KBKeyTypeSpace) multiplier = 4.0; + if (b.key.type == KBKeyTypeReturn) multiplier = 1.8; + if (b.key.type == KBKeyTypeModeChange || b.key.type == KBKeyTypeGlobe || b.key.type == KBKeyTypeShift || b.key.type == KBKeyTypeBackspace) { + multiplier = 1.5; + } + [b mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.equalTo(firstChar).multipliedBy(multiplier); + }]; + } + // 如果有左右占位,则把占位宽度设置为字符键宽度的一定倍数,以实现整体居中 + if (leftSpacer && rightSpacer) { + [leftSpacer mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.equalTo(firstChar).multipliedBy(edgeSpacerMultiplier); + }]; + [rightSpacer mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.equalTo(firstChar).multipliedBy(edgeSpacerMultiplier); + }]; + } + } +} + +#pragma mark - Actions + +- (void)onKeyTapped:(KBKeyButton *)sender { + KBKey *key = sender.key; + if (key.type == KBKeyTypeShift) { + self.shiftOn = !self.shiftOn; + [self reloadKeys]; + return; + } + if ([self.delegate respondsToSelector:@selector(keyboardView:didTapKey:)]) { + [self.delegate keyboardView:self didTapKey:key]; + } +} + +#pragma mark - Lazy + +- (UIView *)row1 { if (!_row1) _row1 = [UIView new]; return _row1; } +- (UIView *)row2 { if (!_row2) _row2 = [UIView new]; return _row2; } +- (UIView *)row3 { if (!_row3) _row3 = [UIView new]; return _row3; } +- (UIView *)row4 { if (!_row4) _row4 = [UIView new]; return _row4; } + +@end diff --git a/CustomKeyboard/View/KBToolBar.h b/CustomKeyboard/View/KBToolBar.h index e48a19c..44934d1 100644 --- a/CustomKeyboard/View/KBToolBar.h +++ b/CustomKeyboard/View/KBToolBar.h @@ -9,8 +9,28 @@ NS_ASSUME_NONNULL_BEGIN +@class KBToolBar; + +@protocol KBToolBarDelegate +@optional +/// 左侧 4 个功能按钮点击(index: 0~3) +- (void)toolBar:(KBToolBar *)toolBar didTapActionAtIndex:(NSInteger)index; +/// 右侧设置按钮点击 +- (void)toolBarDidTapSettings:(KBToolBar *)toolBar; +@end + +/// 顶部工具栏:左侧 4 个按钮,右侧 1 个设置按钮。 @interface KBToolBar : UIView +@property (nonatomic, weak, nullable) id delegate; + +/// 左侧 4 个按钮的标题。默认值:@[@"Item1", @"Item2", @"Item3", @"Item4"]。 +@property (nonatomic, copy) NSArray *leftButtonTitles; + +/// 暴露按钮以便外部定制(只读;首次访问时懒加载创建) +@property (nonatomic, strong, readonly) NSArray *leftButtons; +@property (nonatomic, strong, readonly) UIButton *settingsButton; + @end NS_ASSUME_NONNULL_END diff --git a/CustomKeyboard/View/KBToolBar.m b/CustomKeyboard/View/KBToolBar.m index dbea27a..bd27167 100644 --- a/CustomKeyboard/View/KBToolBar.m +++ b/CustomKeyboard/View/KBToolBar.m @@ -7,15 +7,139 @@ #import "KBToolBar.h" +@interface KBToolBar () +@property (nonatomic, strong) UIView *leftContainer; +@property (nonatomic, strong) NSArray *leftButtonsInternal; +@property (nonatomic, strong) UIButton *settingsButtonInternal; +@end + @implementation KBToolBar - (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { - + self.backgroundColor = [UIColor clearColor]; + _leftButtonTitles = @[@"Item1", @"Item2", @"Item3", @"Item4"]; // 默认标题 + [self setupUI]; } return self; } +#pragma mark - Public + +- (NSArray *)leftButtons { + return self.leftButtonsInternal; +} + +- (UIButton *)settingsButton { + return self.settingsButtonInternal; +} + +- (void)setLeftButtonTitles:(NSArray *)leftButtonTitles { + _leftButtonTitles = [leftButtonTitles copy]; + // Update titles if buttons already exist + [self.leftButtonsInternal enumerateObjectsUsingBlock:^(UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (idx < self.leftButtonTitles.count) { + [obj setTitle:self.leftButtonTitles[idx] forState:UIControlStateNormal]; + } + }]; +} + +#pragma mark - 视图搭建 + +- (void)setupUI { + [self addSubview:self.leftContainer]; + [self addSubview:self.settingsButtonInternal]; + + // 右侧设置按钮 + [self.settingsButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.equalTo(self.mas_right).offset(-12); + make.centerY.equalTo(self.mas_centerY); + make.width.height.mas_equalTo(32); + }]; + + // 左侧容器占用剩余空间 + [self.leftContainer mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.mas_left).offset(12); + make.right.equalTo(self.settingsButtonInternal.mas_left).offset(-12); + make.centerY.equalTo(self.mas_centerY); + make.height.mas_equalTo(32); + }]; + + // 在左侧容器中创建 4 个等宽按钮 + NSMutableArray *buttons = [NSMutableArray arrayWithCapacity:4]; + UIView *previous = nil; + for (NSInteger i = 0; i < 4; i++) { + UIButton *btn = [self buildActionButtonAtIndex:i]; + [self.leftContainer addSubview:btn]; + [buttons addObject:btn]; + [btn mas_makeConstraints:^(MASConstraintMaker *make) { + if (previous) { + make.left.equalTo(previous.mas_right).offset(8); + make.width.equalTo(previous); + } else { + make.left.equalTo(self.leftContainer.mas_left); + } + make.top.bottom.equalTo(self.leftContainer); + }]; + previous = btn; + } + // 最后一个按钮贴右侧 + [previous mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.equalTo(self.leftContainer.mas_right); + }]; + self.leftButtonsInternal = buttons.copy; +} + +- (UIButton *)buildActionButtonAtIndex:(NSInteger)idx { + UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem]; + btn.layer.cornerRadius = 16; + btn.layer.masksToBounds = YES; + btn.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9]; + btn.titleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; + NSString *title = (idx < self.leftButtonTitles.count) ? self.leftButtonTitles[idx] : [NSString stringWithFormat:@"Item%ld", (long)(idx+1)]; + [btn setTitle:title forState:UIControlStateNormal]; + [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; + btn.tag = idx; + [btn addTarget:self action:@selector(onLeftAction:) forControlEvents:UIControlEventTouchUpInside]; + return btn; +} + +#pragma mark - Actions + +- (void)onLeftAction:(UIButton *)sender { + if ([self.delegate respondsToSelector:@selector(toolBar:didTapActionAtIndex:)]) { + [self.delegate toolBar:self didTapActionAtIndex:sender.tag]; + } +} + +- (void)onSettings { + if ([self.delegate respondsToSelector:@selector(toolBarDidTapSettings:)]) { + [self.delegate toolBarDidTapSettings:self]; + } +} + +#pragma mark - Lazy + +- (UIView *)leftContainer { + if (!_leftContainer) { + _leftContainer = [[UIView alloc] init]; + _leftContainer.backgroundColor = [UIColor clearColor]; + } + return _leftContainer; +} + +- (UIButton *)settingsButtonInternal { + if (!_settingsButtonInternal) { + _settingsButtonInternal = [UIButton buttonWithType:UIButtonTypeSystem]; + _settingsButtonInternal.layer.cornerRadius = 16; + _settingsButtonInternal.layer.masksToBounds = YES; + _settingsButtonInternal.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9]; + [_settingsButtonInternal setTitle:@"⚙︎" forState:UIControlStateNormal]; // 简单的齿轮符号 + [_settingsButtonInternal setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; + [_settingsButtonInternal addTarget:self action:@selector(onSettings) forControlEvents:UIControlEventTouchUpInside]; + } + return _settingsButtonInternal; +} @end diff --git a/Podfile b/Podfile index 1bcc590..9e93db3 100644 --- a/Podfile +++ b/Podfile @@ -20,5 +20,5 @@ target 'keyBoard' do pod 'MJExtension', '3.4.2' pod 'MJRefresh', '3.7.9' pod 'SDWebImage', '5.21.1' - + pod 'LookinServer', :configurations => ['Debug'] end diff --git a/Podfile.lock b/Podfile.lock index ff55f71..fcf4160 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -15,6 +15,9 @@ PODS: - AFNetworking/UIKit (4.0.1): - AFNetworking/NSURLSession - Bugly (2.6.1) + - LookinServer (1.2.8): + - LookinServer/Core (= 1.2.8) + - LookinServer/Core (1.2.8) - Masonry (1.1.0) - MJExtension (3.4.2) - MJRefresh (3.7.9) @@ -25,6 +28,7 @@ PODS: DEPENDENCIES: - AFNetworking (= 4.0.1) - Bugly (= 2.6.1) + - LookinServer - Masonry (= 1.1.0) - MJExtension (= 3.4.2) - MJRefresh (= 3.7.9) @@ -34,6 +38,7 @@ SPEC REPOS: https://github.com/CocoaPods/Specs.git: - AFNetworking - Bugly + - LookinServer - Masonry - MJExtension - MJRefresh @@ -42,11 +47,12 @@ SPEC REPOS: SPEC CHECKSUMS: AFNetworking: 3bd23d814e976cd148d7d44c3ab78017b744cd58 Bugly: 217ac2ce5f0f2626d43dbaa4f70764c953a26a31 + LookinServer: 1b2b61c6402ae29fa22182d48f5cd067b4e99e80 Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8 MJRefresh: ff9e531227924c84ce459338414550a05d2aea78 SDWebImage: f29024626962457f3470184232766516dee8dfea -PODFILE CHECKSUM: b3c72fe500149c35040cdd73c1d91fe05777bc5f +PODFILE CHECKSUM: 4f2fbf9a7c2f24c74f9f26aba9933db3ee43ff84 COCOAPODS: 1.16.2 diff --git a/Pods/LookinServer/LICENSE b/Pods/LookinServer/LICENSE new file mode 100644 index 0000000..eeb2b2b --- /dev/null +++ b/Pods/LookinServer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) [2023] [LI KAI] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Pods/LookinServer/README.md b/Pods/LookinServer/README.md new file mode 100644 index 0000000..548ceff --- /dev/null +++ b/Pods/LookinServer/README.md @@ -0,0 +1,73 @@ +![Preview](https://cdn.lookin.work/public/style/images/independent/homepage/preview_en_1x.jpg "Preview") + +# Introduction +You can inspect and modify views in iOS app via Lookin, just like UI Inspector in Xcode, or another app called Reveal. + +Official Website:https://lookin.work/ + +# Integration Guide +To use Lookin macOS app, you need to integrate LookinServer (iOS Framework of Lookin) into your iOS project. + +> **Warning** +> 1. Never integrate LookinServer in Release building configuration. +> 2. Do not use versions earlier than 1.0.6, as it contains a critical bug that could lead to online incidents in your project: https://qxh1ndiez2w.feishu.cn/wiki/Z9SpwT7zWiqvYvkBe7Lc6Disnab + +## via CocoaPods: +### Swift Project +`pod 'LookinServer', :subspecs => ['Swift'], :configurations => ['Debug']` +### Objective-C Project +`pod 'LookinServer', :configurations => ['Debug']` +## via Swift Package Manager: +`https://github.com/QMUI/LookinServer/` + +# Repository +LookinServer: https://github.com/QMUI/LookinServer + +macOS app: https://github.com/hughkli/Lookin/ + +# Tips +- How to display custom information in Lookin: https://bytedance.larkoffice.com/docx/TRridRXeUoErMTxs94bcnGchnlb +- How to display more member variables in Lookin: https://bytedance.larkoffice.com/docx/CKRndHqdeoub11xSqUZcMlFhnWe +- How to turn on Swift optimization for Lookin: https://bytedance.larkoffice.com/docx/GFRLdzpeKoakeyxvwgCcZ5XdnTb +- Documentation Collection: https://bytedance.larkoffice.com/docx/Yvv1d57XQoe5l0xZ0ZRc0ILfnWb + +# Acknowledgements +https://qxh1ndiez2w.feishu.cn/docx/YIFjdE4gIolp3hxn1tGckiBxnWf + +--- +# 简介 +Lookin 可以查看与修改 iOS App 里的 UI 对象,类似于 Xcode 自带的 UI Inspector 工具,或另一款叫做 Reveal 的软件。 + +官网:https://lookin.work/ + +# 安装 LookinServer Framework +如果这是你的 iOS 项目第一次使用 Lookin,则需要先把 LookinServer 这款 iOS Framework 集成到你的 iOS 项目中。 + +> **Warning** +> +> 1. 不要在 AppStore 模式下集成 LookinServer。 +> 2. 不要使用早于 1.0.6 的版本,因为它包含一个严重 Bug,可能导致线上事故: https://qxh1ndiez2w.feishu.cn/wiki/Z9SpwT7zWiqvYvkBe7Lc6Disnab +## 通过 CocoaPods: + +### Swift 项目 +`pod 'LookinServer', :subspecs => ['Swift'], :configurations => ['Debug']` +### Objective-C 项目 +`pod 'LookinServer', :configurations => ['Debug']` + +## 通过 Swift Package Manager: +`https://github.com/QMUI/LookinServer/` + +# 源代码仓库 + +iOS 端 LookinServer:https://github.com/QMUI/LookinServer + +macOS 端软件:https://github.com/hughkli/Lookin/ + +# 技巧 +- 如何在 Lookin 中展示自定义信息: https://bytedance.larkoffice.com/docx/TRridRXeUoErMTxs94bcnGchnlb +- 如何在 Lookin 中展示更多成员变量: https://bytedance.larkoffice.com/docx/CKRndHqdeoub11xSqUZcMlFhnWe +- 如何为 Lookin 开启 Swift 优化: https://bytedance.larkoffice.com/docx/GFRLdzpeKoakeyxvwgCcZ5XdnTb +- 文档汇总:https://bytedance.larkoffice.com/docx/Yvv1d57XQoe5l0xZ0ZRc0ILfnWb + +# 鸣谢 +https://qxh1ndiez2w.feishu.cn/docx/YIFjdE4gIolp3hxn1tGckiBxnWf diff --git a/Pods/LookinServer/Src/Base/LookinIvarTrace.h b/Pods/LookinServer/Src/Base/LookinIvarTrace.h new file mode 100644 index 0000000..3904385 --- /dev/null +++ b/Pods/LookinServer/Src/Base/LookinIvarTrace.h @@ -0,0 +1,40 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinIvarTrace.h +// Lookin +// +// Created by Li Kai on 2019/4/30. +// https://lookin.work +// + +#import + +extern NSString *const LookinIvarTraceRelationValue_Self; + +/// 如果 hostClassName 和 ivarName 均 equal,则认为两个 LookinIvarTrace 对象彼此 equal +/// 比如 A 是 B 的 superview,且 A 的 "_stageView" 指向 B,则 B 会有一个 LookinIvarTrace:hostType 为 “superview”,hostClassName 为 A 的 class,ivarName 为 “_stageView” +@interface LookinIvarTrace : NSObject + +/// 该值可能是 "superview"、"superlayer"、“self” 或 nil +@property(nonatomic, copy) NSString *relation; + +@property(nonatomic, copy) NSString *hostClassName; + +@property(nonatomic, copy) NSString *ivarName; + +#pragma mark - No Coding + +#if TARGET_OS_IPHONE +@property(nonatomic, weak) id hostObject; +#endif + +@end + +@interface NSObject (LookinServerTrace) + +@property(nonatomic, copy) NSArray *lks_ivarTraces; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Base/LookinIvarTrace.m b/Pods/LookinServer/Src/Base/LookinIvarTrace.m new file mode 100644 index 0000000..e272d47 --- /dev/null +++ b/Pods/LookinServer/Src/Base/LookinIvarTrace.m @@ -0,0 +1,70 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinIvarTrace.m +// Lookin +// +// Created by Li Kai on 2019/4/30. +// https://lookin.work +// + +#import "LookinIvarTrace.h" + +NSString *const LookinIvarTraceRelationValue_Self = @"self"; + +@implementation LookinIvarTrace + +#pragma mark - Equal + +- (NSUInteger)hash { + return self.hostClassName.hash ^ self.ivarName.hash; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[LookinIvarTrace class]]) { + return NO; + } + LookinIvarTrace *comparedObj = object; + if ([self.hostClassName isEqualToString:comparedObj.hostClassName] && [self.ivarName isEqualToString:comparedObj.ivarName]) { + return YES; + } + return NO; +} + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinIvarTrace *newTrace = [[LookinIvarTrace allocWithZone:zone] init]; + newTrace.relation = self.relation; + newTrace.hostClassName = self.hostClassName; + newTrace.ivarName = self.ivarName; + return newTrace; +} + +#pragma mark - + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.relation forKey:@"relation"]; + [aCoder encodeObject:self.hostClassName forKey:@"hostClassName"]; + [aCoder encodeObject:self.ivarName forKey:@"ivarName"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.relation = [aDecoder decodeObjectForKey:@"relation"]; + self.hostClassName = [aDecoder decodeObjectForKey:@"hostClassName"]; + self.ivarName = [aDecoder decodeObjectForKey:@"ivarName"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/CALayer+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/CALayer+LookinServer.h new file mode 100644 index 0000000..83584a9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/CALayer+LookinServer.h @@ -0,0 +1,41 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIView+LookinMobile.h +// WeRead +// +// Created by Li Kai on 2018/11/30. +// Copyright © 2018 tencent. All rights reserved. +// + +#import "LookinDefines.h" +#import "TargetConditionals.h" +#import + +@interface CALayer (LookinServer) + +/// 如果 myView.layer == myLayer,则 myLayer.lks_hostView 会返回 myView +@property(nonatomic, readonly, weak) UIView *lks_hostView; + +- (UIWindow *)lks_window; + +- (CGRect)lks_frameInWindow:(UIWindow *)window; + +- (UIImage *)lks_groupScreenshotWithLowQuality:(BOOL)lowQuality; +/// 当没有 sublayers 时,该方法返回 nil +- (UIImage *)lks_soloScreenshotWithLowQuality:(BOOL)lowQuality; + +/// 获取和该对象有关的对象的 Class 层级树 +- (NSArray *> *)lks_relatedClassChainList; + +- (NSArray *)lks_selfRelation; + +@property(nonatomic, strong) UIColor *lks_backgroundColor; +@property(nonatomic, strong) UIColor *lks_borderColor; +@property(nonatomic, strong) UIColor *lks_shadowColor; +@property(nonatomic, assign) CGFloat lks_shadowOffsetWidth; +@property(nonatomic, assign) CGFloat lks_shadowOffsetHeight; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/CALayer+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/CALayer+LookinServer.m new file mode 100644 index 0000000..233734d --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/CALayer+LookinServer.m @@ -0,0 +1,233 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIView+LookinMobile.m +// WeRead +// +// Created by Li Kai on 2018/11/30. +// Copyright © 2018 tencent. All rights reserved. +// + +#import "CALayer+LookinServer.h" +#import "LKS_HierarchyDisplayItemsMaker.h" +#import "LookinDisplayItem.h" +#import +#import "LKS_ConnectionManager.h" +#import "LookinIvarTrace.h" +#import "LookinServerDefines.h" +#import "UIColor+LookinServer.h" +#import "LKS_MultiplatformAdapter.h" + +@implementation CALayer (LookinServer) + +- (UIWindow *)lks_window { + CALayer *layer = self; + while (layer) { + UIView *hostView = layer.lks_hostView; + if (hostView.window) { + return hostView.window; + } else if ([hostView isKindOfClass:[UIWindow class]]) { + return (UIWindow *)hostView; + } + layer = layer.superlayer; + } + return nil; +} + +- (CGRect)lks_frameInWindow:(UIWindow *)window { + UIWindow *selfWindow = [self lks_window]; + if (!selfWindow) { + return CGRectZero; + } + + CGRect rectInSelfWindow = [selfWindow.layer convertRect:self.frame fromLayer:self.superlayer]; + CGRect rectInWindow = [window convertRect:rectInSelfWindow fromWindow:selfWindow]; + return rectInWindow; +} + +#pragma mark - Host View + +- (UIView *)lks_hostView { + if (self.delegate && [self.delegate isKindOfClass:UIView.class]) { + UIView *view = (UIView *)self.delegate; + if (view.layer == self) { + return view; + } + } + return nil; +} + +#pragma mark - Screenshot + +- (UIImage *)lks_groupScreenshotWithLowQuality:(BOOL)lowQuality { + + CGFloat screenScale = [LKS_MultiplatformAdapter mainScreenScale]; + CGFloat pixelWidth = self.frame.size.width * screenScale; + CGFloat pixelHeight = self.frame.size.height * screenScale; + if (pixelWidth <= 0 || pixelHeight <= 0) { + return nil; + } + + CGFloat renderScale = lowQuality ? 1 : 0; + CGFloat maxLength = MAX(pixelWidth, pixelHeight); + if (maxLength > LookinNodeImageMaxLengthInPx) { + // 确保最终绘制出的图片长和宽都不能超过 LookinNodeImageMaxLengthInPx + // 如果算出的 renderScale 大于 1 则取 1,因为似乎用 1 渲染的速度要比一个别的奇怪的带小数点的数字要更快 + renderScale = MIN(screenScale * LookinNodeImageMaxLengthInPx / maxLength, 1); + } + + CGSize contextSize = self.frame.size; + if (contextSize.width <= 0 || contextSize.height <= 0 || contextSize.width > 20000 || contextSize.height > 20000) { + NSLog(@"LookinServer - Failed to capture screenshot. Invalid context size: %@ x %@", @(contextSize.width), @(contextSize.height)); + return nil; + } + UIGraphicsBeginImageContextWithOptions(contextSize, NO, renderScale); + CGContextRef context = UIGraphicsGetCurrentContext(); + if (self.lks_hostView && !self.lks_hostView.lks_isChildrenViewOfTabBar) { + [self.lks_hostView drawViewHierarchyInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height) afterScreenUpdates:YES]; + } else { + [self renderInContext:context]; + } + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return image; +} + +- (UIImage *)lks_soloScreenshotWithLowQuality:(BOOL)lowQuality { + if (!self.sublayers.count) { + return nil; + } + + CGFloat screenScale = [LKS_MultiplatformAdapter mainScreenScale]; + CGFloat pixelWidth = self.frame.size.width * screenScale; + CGFloat pixelHeight = self.frame.size.height * screenScale; + if (pixelWidth <= 0 || pixelHeight <= 0) { + return nil; + } + + CGFloat renderScale = lowQuality ? 1 : 0; + CGFloat maxLength = MAX(pixelWidth, pixelHeight); + if (maxLength > LookinNodeImageMaxLengthInPx) { + // 确保最终绘制出的图片长和宽都不能超过 LookinNodeImageMaxLengthInPx + // 如果算出的 renderScale 大于 1 则取 1,因为似乎用 1 渲染的速度要比一个别的奇怪的带小数点的数字要更快 + renderScale = MIN(screenScale * LookinNodeImageMaxLengthInPx / maxLength, 1); + } + + if (self.sublayers.count) { + NSArray *sublayers = [self.sublayers copy]; + NSMutableArray *visibleSublayers = [NSMutableArray arrayWithCapacity:sublayers.count]; + [sublayers enumerateObjectsUsingBlock:^(__kindof CALayer * _Nonnull sublayer, NSUInteger idx, BOOL * _Nonnull stop) { + if (!sublayer.hidden) { + sublayer.hidden = YES; + [visibleSublayers addObject:sublayer]; + } + }]; + + CGSize contextSize = self.frame.size; + if (contextSize.width <= 0 || contextSize.height <= 0 || contextSize.width > 20000 || contextSize.height > 20000) { + NSLog(@"LookinServer - Failed to capture screenshot. Invalid context size: %@ x %@", @(contextSize.width), @(contextSize.height)); + return nil; + } + + UIGraphicsBeginImageContextWithOptions(contextSize, NO, renderScale); + CGContextRef context = UIGraphicsGetCurrentContext(); + if (self.lks_hostView && !self.lks_hostView.lks_isChildrenViewOfTabBar) { + [self.lks_hostView drawViewHierarchyInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height) afterScreenUpdates:YES]; + } else { + [self renderInContext:context]; + } + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + [visibleSublayers enumerateObjectsUsingBlock:^(CALayer * _Nonnull sublayer, NSUInteger idx, BOOL * _Nonnull stop) { + sublayer.hidden = NO; + }]; + + return image; + } + return nil; +} + +- (NSArray *> *)lks_relatedClassChainList { + NSMutableArray *array = [NSMutableArray arrayWithCapacity:2]; + if (self.lks_hostView) { + [array addObject:[CALayer lks_getClassListOfObject:self.lks_hostView endingClass:@"UIView"]]; + UIViewController* vc = [self.lks_hostView lks_findHostViewController]; + if (vc) { + [array addObject:[CALayer lks_getClassListOfObject:vc endingClass:@"UIViewController"]]; + } + } else { + [array addObject:[CALayer lks_getClassListOfObject:self endingClass:@"CALayer"]]; + } + return array.copy; +} + ++ (NSArray *)lks_getClassListOfObject:(id)object endingClass:(NSString *)endingClass { + NSArray *completedList = [object lks_classChainList]; + NSUInteger endingIdx = [completedList indexOfObject:endingClass]; + if (endingIdx != NSNotFound) { + completedList = [completedList subarrayWithRange:NSMakeRange(0, endingIdx + 1)]; + } + return completedList; +} + +- (NSArray *)lks_selfRelation { + NSMutableArray *array = [NSMutableArray array]; + NSMutableArray *ivarTraces = [NSMutableArray array]; + if (self.lks_hostView) { + UIViewController* vc = [self.lks_hostView lks_findHostViewController]; + if (vc) { + [array addObject:[NSString stringWithFormat:@"(%@ *).view", NSStringFromClass(vc.class)]]; + + [ivarTraces addObjectsFromArray:vc.lks_ivarTraces]; + } + [ivarTraces addObjectsFromArray:self.lks_hostView.lks_ivarTraces]; + } else { + [ivarTraces addObjectsFromArray:self.lks_ivarTraces]; + } + if (ivarTraces.count) { + [array addObjectsFromArray:[ivarTraces lookin_map:^id(NSUInteger idx, LookinIvarTrace *value) { + return [NSString stringWithFormat:@"(%@ *) -> %@", value.hostClassName, value.ivarName]; + }]]; + } + return array.count ? array.copy : nil; +} + +- (UIColor *)lks_backgroundColor { + return [UIColor lks_colorWithCGColor:self.backgroundColor]; +} +- (void)setLks_backgroundColor:(UIColor *)lks_backgroundColor { + self.backgroundColor = lks_backgroundColor.CGColor; +} + +- (UIColor *)lks_borderColor { + return [UIColor lks_colorWithCGColor:self.borderColor]; +} +- (void)setLks_borderColor:(UIColor *)lks_borderColor { + self.borderColor = lks_borderColor.CGColor; +} + +- (UIColor *)lks_shadowColor { + return [UIColor lks_colorWithCGColor:self.shadowColor]; +} +- (void)setLks_shadowColor:(UIColor *)lks_shadowColor { + self.shadowColor = lks_shadowColor.CGColor; +} + +- (CGFloat)lks_shadowOffsetWidth { + return self.shadowOffset.width; +} +- (void)setLks_shadowOffsetWidth:(CGFloat)lks_shadowOffsetWidth { + self.shadowOffset = CGSizeMake(lks_shadowOffsetWidth, self.shadowOffset.height); +} + +- (CGFloat)lks_shadowOffsetHeight { + return self.shadowOffset.height; +} +- (void)setLks_shadowOffsetHeight:(CGFloat)lks_shadowOffsetHeight { + self.shadowOffset = CGSizeMake(self.shadowOffset.width, lks_shadowOffsetHeight); +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/NSObject+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/NSObject+LookinServer.h new file mode 100644 index 0000000..94d40f5 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/NSObject+LookinServer.h @@ -0,0 +1,41 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSObject+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/4/21. +// https://lookin.work +// + +#import "LookinDefines.h" +#import + +@class LookinIvarTrace; + +@interface NSObject (LookinServer) + +#pragma mark - oid + +/// 如果 oid 不存在则会创建新的 oid +- (unsigned long)lks_registerOid; + +/// 0 表示不存在 +@property(nonatomic, assign) unsigned long lks_oid; + ++ (NSObject *)lks_objectWithOid:(unsigned long)oid; + +#pragma mark - trace + +@property(nonatomic, copy) NSString *lks_specialTrace; + ++ (void)lks_clearAllObjectsTraces; + +/** + 获取当前对象的 Class 层级树,如 @[@"UIView", @"UIResponder", @"NSObject"]。未 demangle,有 Swift Module Name + */ +- (NSArray *)lks_classChainList; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/NSObject+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/NSObject+LookinServer.m new file mode 100644 index 0000000..c8e170b --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/NSObject+LookinServer.m @@ -0,0 +1,99 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSObject+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/4/21. +// https://lookin.work +// + +#import "NSObject+Lookin.h" +#import "NSObject+LookinServer.h" +#import "LookinServerDefines.h" +#import "LKS_ObjectRegistry.h" +#import + +@implementation NSObject (LookinServer) + +#pragma mark - oid + +- (unsigned long)lks_registerOid { + if (!self.lks_oid) { + unsigned long oid = [[LKS_ObjectRegistry sharedInstance] addObject:self]; + self.lks_oid = oid; + } + return self.lks_oid; +} + +- (void)setLks_oid:(unsigned long)lks_oid { + [self lookin_bindObject:@(lks_oid) forKey:@"lks_oid"]; +} + +- (unsigned long)lks_oid { + NSNumber *number = [self lookin_getBindObjectForKey:@"lks_oid"]; + return [number unsignedLongValue]; +} + ++ (NSObject *)lks_objectWithOid:(unsigned long)oid { + return [[LKS_ObjectRegistry sharedInstance] objectWithOid:oid]; +} + +#pragma mark - trace + +- (void)setLks_ivarTraces:(NSArray *)lks_ivarTraces { + [self lookin_bindObject:lks_ivarTraces.copy forKey:@"lks_ivarTraces"]; + + if (lks_ivarTraces) { + [[NSObject lks_allObjectsWithTraces] addPointer:(void *)self]; + } +} + +- (NSArray *)lks_ivarTraces { + return [self lookin_getBindObjectForKey:@"lks_ivarTraces"]; +} + +- (void)setLks_specialTrace:(NSString *)lks_specialTrace { + [self lookin_bindObject:lks_specialTrace forKey:@"lks_specialTrace"]; + if (lks_specialTrace) { + [[NSObject lks_allObjectsWithTraces] addPointer:(void *)self]; + } +} +- (NSString *)lks_specialTrace { + return [self lookin_getBindObjectForKey:@"lks_specialTrace"]; +} + ++ (void)lks_clearAllObjectsTraces { + [[[NSObject lks_allObjectsWithTraces] allObjects] enumerateObjectsUsingBlock:^(NSObject * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + obj.lks_ivarTraces = nil; + obj.lks_specialTrace = nil; + }]; + [NSObject lks_allObjectsWithTraces].count = 0; +} + ++ (NSPointerArray *)lks_allObjectsWithTraces { + static dispatch_once_t onceToken; + static NSPointerArray *lks_allObjectsWithTraces = nil; + dispatch_once(&onceToken,^{ + lks_allObjectsWithTraces = [NSPointerArray weakObjectsPointerArray]; + }); + return lks_allObjectsWithTraces; +} + +- (NSArray *)lks_classChainList { + NSMutableArray *classChainList = [NSMutableArray array]; + Class currentClass = self.class; + + while (currentClass) { + NSString *currentClassName = NSStringFromClass(currentClass); + if (currentClassName) { + [classChainList addObject:currentClassName]; + } + currentClass = [currentClass superclass]; + } + return classChainList.copy; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIBlurEffect+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UIBlurEffect+LookinServer.h new file mode 100644 index 0000000..1623a8d --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIBlurEffect+LookinServer.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIBlurEffect+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/10/8. +// https://lookin.work +// + +#import + +@interface UIBlurEffect (LookinServer) + +/// 该 number 包装的对象是 UIBlurEffectStyle,之所以用 NSNumber 是因为想把 0 和 nil 区分开,毕竟这里是在 hook 系统,稳一点好。 +/// 该方法的实现需要 Hook,因此若定义了 LOOKIN_SERVER_DISABLE_HOOK 宏,则属性会返回 nil +@property(nonatomic, strong) NSNumber *lks_effectStyleNumber; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIBlurEffect+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UIBlurEffect+LookinServer.m new file mode 100644 index 0000000..ddc36ac --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIBlurEffect+LookinServer.m @@ -0,0 +1,57 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIBlurEffect+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/10/8. +// https://lookin.work +// + +#import "UIBlurEffect+LookinServer.h" +#import "NSObject+Lookin.h" +#import + +@implementation UIBlurEffect (LookinServer) + +#ifdef LOOKIN_SERVER_DISABLE_HOOK + +- (void)setLks_effectStyleNumber:(NSNumber *)lks_effectStyleNumber { +} + +- (NSNumber *)lks_effectStyleNumber { + return nil; +} + +#else + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + Method oriMethod = class_getClassMethod([self class], @selector(effectWithStyle:)); + Method newMethod = class_getClassMethod([self class], @selector(lks_effectWithStyle:)); + method_exchangeImplementations(oriMethod, newMethod); + }); +} + ++ (UIBlurEffect *)lks_effectWithStyle:(UIBlurEffectStyle)style { + id effect = [self lks_effectWithStyle:style]; + if ([effect respondsToSelector:@selector(setLks_effectStyleNumber:)]) { + [effect setLks_effectStyleNumber:@(style)]; + } + return effect; +} + +- (void)setLks_effectStyleNumber:(NSNumber *)lks_effectStyleNumber { + [self lookin_bindObject:lks_effectStyleNumber forKey:@"lks_effectStyleNumber"]; +} + +- (NSNumber *)lks_effectStyleNumber { + return [self lookin_getBindObjectForKey:@"lks_effectStyleNumber"]; +} + +#endif /* LOOKIN_SERVER_DISABLE_HOOK */ + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIColor+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UIColor+LookinServer.h new file mode 100644 index 0000000..9b4133f --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIColor+LookinServer.h @@ -0,0 +1,26 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIColor+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/6/5. +// https://lookin.work +// + +#import + +@interface UIColor (LookinServer) + +- (NSArray *)lks_rgbaComponents; ++ (instancetype)lks_colorFromRGBAComponents:(NSArray *)components; + +- (NSString *)lks_rgbaString; +- (NSString *)lks_hexString; + +/// will check if the argument is a real CGColor ++ (UIColor *)lks_colorWithCGColor:(CGColorRef)cgColor; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIColor+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UIColor+LookinServer.m new file mode 100644 index 0000000..ce1aea9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIColor+LookinServer.m @@ -0,0 +1,183 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIColor+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/6/5. +// https://lookin.work +// + +#import "UIColor+LookinServer.h" + +@implementation UIColor (LookinServer) + +- (NSArray *)lks_rgbaComponents { + CGFloat r, g, b, a; + CGColorRef cgColor = [self CGColor]; + const CGFloat *components = CGColorGetComponents(cgColor); + if (CGColorGetNumberOfComponents(cgColor) == 4) { + r = components[0]; + g = components[1]; + b = components[2]; + a = components[3]; + } else if (CGColorGetNumberOfComponents(cgColor) == 2) { + r = components[0]; + g = components[0]; + b = components[0]; + a = components[1]; + } else if (CGColorGetNumberOfComponents(cgColor) == 1) { + r = components[0]; + g = components[0]; + b = components[0]; + a = components[0]; + } else { + r = 0; + g = 0; + b = 0; + a = 0; + NSAssert(NO, @""); + } + NSArray *rgba = @[@(r), @(g), @(b), @(a)]; + return rgba; +} + ++ (instancetype)lks_colorFromRGBAComponents:(NSArray *)components { + if (!components) { + return nil; + } + if (components.count != 4) { + NSAssert(NO, @""); + return nil; + } + UIColor *color = [UIColor colorWithRed:components[0].doubleValue green:components[1].doubleValue blue:components[2].doubleValue alpha:components[3].doubleValue]; + return color; +} + +- (NSString *)lks_rgbaString { + CGFloat r, g, b, a; + CGColorRef cgColor = [self CGColor]; + const CGFloat *components = CGColorGetComponents(cgColor); + if (CGColorGetNumberOfComponents(cgColor) == 4) { + r = components[0]; + g = components[1]; + b = components[2]; + a = components[3]; + } else if (CGColorGetNumberOfComponents(cgColor) == 2) { + r = components[0]; + g = components[0]; + b = components[0]; + a = components[1]; + } else { + r = 0; + g = 0; + b = 0; + a = 0; + NSAssert(NO, @""); + } + + if (a >= 1) { + return [NSString stringWithFormat:@"(%.0f, %.0f, %.0f)", r * 255, g * 255, b * 255]; + } else { + return [NSString stringWithFormat:@"(%.0f, %.0f, %.0f, %.2f)", r * 255, g * 255, b * 255, a]; + } +} + +- (NSString *)lks_hexString { + CGFloat r, g, b, a; + CGColorRef cgColor = [self CGColor]; + const CGFloat *components = CGColorGetComponents(cgColor); + if (CGColorGetNumberOfComponents(cgColor) == 4) { + r = components[0]; + g = components[1]; + b = components[2]; + a = components[3]; + } else if (CGColorGetNumberOfComponents(cgColor) == 2) { + r = components[0]; + g = components[0]; + b = components[0]; + a = components[1]; + } else { + r = 0; + g = 0; + b = 0; + a = 0; + NSAssert(NO, @""); + } + + NSInteger red = r * 255; + NSInteger green = g * 255; + NSInteger blue = b * 255; + NSInteger alpha = a * 255; + + return [[NSString stringWithFormat:@"#%@%@%@%@", + [UIColor _alignColorHexStringLength:[UIColor _hexStringWithInteger:alpha]], + [UIColor _alignColorHexStringLength:[UIColor _hexStringWithInteger:red]], + [UIColor _alignColorHexStringLength:[UIColor _hexStringWithInteger:green]], + [UIColor _alignColorHexStringLength:[UIColor _hexStringWithInteger:blue]]] lowercaseString]; +} + +// 对于色值只有单位数的,在前面补一个0,例如“F”会补齐为“0F” ++ (NSString *)_alignColorHexStringLength:(NSString *)hexString { + return hexString.length < 2 ? [@"0" stringByAppendingString:hexString] : hexString; +} + ++ (NSString *)_hexStringWithInteger:(NSInteger)integer { + NSString *hexString = @""; + NSInteger remainder = 0; + for (NSInteger i = 0; i < 9; i++) { + remainder = integer % 16; + integer = integer / 16; + NSString *letter = [self _hexLetterStringWithInteger:remainder]; + hexString = [letter stringByAppendingString:hexString]; + if (integer == 0) { + break; + } + + } + return hexString; +} + ++ (NSString *)_hexLetterStringWithInteger:(NSInteger)integer { + NSAssert(integer < 16, @"要转换的数必须是16进制里的个位数,也即小于16,但你传给我是%@", @(integer)); + + NSString *letter = nil; + switch (integer) { + case 10: + letter = @"A"; + break; + case 11: + letter = @"B"; + break; + case 12: + letter = @"C"; + break; + case 13: + letter = @"D"; + break; + case 14: + letter = @"E"; + break; + case 15: + letter = @"F"; + break; + default: + letter = [[NSString alloc]initWithFormat:@"%@", @(integer)]; + break; + } + return letter; +} + ++ (UIColor *)lks_colorWithCGColor:(CGColorRef)cgColor { + if (!cgColor) { + return nil; + } + if (CFGetTypeID(cgColor) != CGColorGetTypeID()) { + return nil; + } + return [UIColor colorWithCGColor:cgColor]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIImage+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UIImage+LookinServer.h new file mode 100644 index 0000000..cf7f6ff --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIImage+LookinServer.h @@ -0,0 +1,22 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIImage+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/5/14. +// https://lookin.work +// + +#import + +@interface UIImage (LookinServer) + +/// 该方法的实现需要 Hook,因此若定义了 LOOKIN_SERVER_DISABLE_HOOK 宏,则属性会返回 nil +@property(nonatomic, copy) NSString *lks_imageSourceName; + +- (NSData *)lookin_data; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIImage+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UIImage+LookinServer.m new file mode 100644 index 0000000..97f8264 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIImage+LookinServer.m @@ -0,0 +1,95 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIImage+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/5/14. +// https://lookin.work +// + +#import +#import "UIImage+LookinServer.h" +#import "LookinServerDefines.h" + +@implementation UIImage (LookinServer) + +#ifdef LOOKIN_SERVER_DISABLE_HOOK + +- (void)setLks_imageSourceName:(NSString *)lks_imageSourceName { +} + +- (NSString *)lks_imageSourceName { + return nil; +} + +#else + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + Method oriMethod = class_getClassMethod([self class], @selector(imageNamed:)); + Method newMethod = class_getClassMethod([self class], @selector(lks_imageNamed:)); + method_exchangeImplementations(oriMethod, newMethod); + + oriMethod = class_getClassMethod([self class], @selector(imageWithContentsOfFile:)); + newMethod = class_getClassMethod([self class], @selector(lks_imageWithContentsOfFile:)); + method_exchangeImplementations(oriMethod, newMethod); + + oriMethod = class_getClassMethod([self class], @selector(imageNamed:inBundle:compatibleWithTraitCollection:)); + newMethod = class_getClassMethod([self class], @selector(lks_imageNamed:inBundle:compatibleWithTraitCollection:)); + method_exchangeImplementations(oriMethod, newMethod); + + if (@available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)) { + oriMethod = class_getClassMethod([self class], @selector(imageNamed:inBundle:withConfiguration:)); + newMethod = class_getClassMethod([self class], @selector(lks_imageNamed:inBundle:withConfiguration:)); + method_exchangeImplementations(oriMethod, newMethod); + } + }); +} + ++ (nullable UIImage *)lks_imageNamed:(NSString *)name inBundle:(nullable NSBundle *)bundle withConfiguration:(nullable UIImageConfiguration *)configuration API_AVAILABLE(ios(13.0),tvos(13.0),watchos(6.0)) +{ + UIImage *image = [self lks_imageNamed:name inBundle:bundle withConfiguration:configuration]; + image.lks_imageSourceName = name; + return image; +} + ++ (nullable UIImage *)lks_imageNamed:(NSString *)name inBundle:(nullable NSBundle *)bundle compatibleWithTraitCollection:(nullable UITraitCollection *)traitCollection API_AVAILABLE(ios(8.0)) +{ + UIImage *image = [self lks_imageNamed:name inBundle:bundle compatibleWithTraitCollection:traitCollection]; + image.lks_imageSourceName = name; + return image; +} + ++ (UIImage *)lks_imageNamed:(NSString *)name { + UIImage *image = [self lks_imageNamed:name]; + image.lks_imageSourceName = name; + return image; +} + ++ (UIImage *)lks_imageWithContentsOfFile:(NSString *)path { + UIImage *image = [self lks_imageWithContentsOfFile:path]; + + NSString *fileName = [[path componentsSeparatedByString:@"/"].lastObject componentsSeparatedByString:@"."].firstObject; + image.lks_imageSourceName = fileName; + return image; +} + +- (void)setLks_imageSourceName:(NSString *)lks_imageSourceName { + [self lookin_bindObject:lks_imageSourceName.copy forKey:@"lks_imageSourceName"]; +} + +- (NSString *)lks_imageSourceName { + return [self lookin_getBindObjectForKey:@"lks_imageSourceName"]; +} + +#endif /* LOOKIN_SERVER_DISABLE_HOOK */ + +- (NSData *)lookin_data { + return UIImagePNGRepresentation(self); +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIImageView+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UIImageView+LookinServer.h new file mode 100644 index 0000000..6da9028 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIImageView+LookinServer.h @@ -0,0 +1,20 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIImageView+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/9/18. +// https://lookin.work +// + +#import + +@interface UIImageView (LookinServer) + +- (NSString *)lks_imageSourceName; +- (NSNumber *)lks_imageViewOidIfHasImage; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIImageView+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UIImageView+LookinServer.m new file mode 100644 index 0000000..76e83cf --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIImageView+LookinServer.m @@ -0,0 +1,31 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIImageView+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/9/18. +// https://lookin.work +// + +#import "UIImageView+LookinServer.h" +#import "UIImage+LookinServer.h" +#import "NSObject+LookinServer.h" + +@implementation UIImageView (LookinServer) + +- (NSString *)lks_imageSourceName { + return self.image.lks_imageSourceName; +} + +- (NSNumber *)lks_imageViewOidIfHasImage { + if (!self.image) { + return nil; + } + unsigned long oid = [self lks_registerOid]; + return @(oid); +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UILabel+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UILabel+LookinServer.h new file mode 100644 index 0000000..92c9294 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UILabel+LookinServer.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UILabel+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/2/26. +// https://lookin.work +// + +#import + +@interface UILabel (LookinServer) + +@property(nonatomic, assign) CGFloat lks_fontSize; + +- (NSString *)lks_fontName; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UILabel+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UILabel+LookinServer.m new file mode 100644 index 0000000..b7b9f70 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UILabel+LookinServer.m @@ -0,0 +1,29 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UILabel+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/2/26. +// https://lookin.work +// + +#import "UILabel+LookinServer.h" + +@implementation UILabel (LookinServer) + +- (CGFloat)lks_fontSize { + return self.font.pointSize; +} +- (void)setLks_fontSize:(CGFloat)lks_fontSize { + UIFont *font = [self.font fontWithSize:lks_fontSize]; + self.font = font; +} + +- (NSString *)lks_fontName { + return self.font.fontName; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UITableView+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UITableView+LookinServer.h new file mode 100644 index 0000000..881fa36 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UITableView+LookinServer.h @@ -0,0 +1,19 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UITableView+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/9/5. +// https://lookin.work +// + +#import + +@interface UITableView (LookinServer) + +- (NSArray *)lks_numberOfRows; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UITableView+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UITableView+LookinServer.m new file mode 100644 index 0000000..3788e3f --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UITableView+LookinServer.m @@ -0,0 +1,29 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UITableView+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/9/5. +// https://lookin.work +// + +#import "UITableView+LookinServer.h" +#import "LookinServerDefines.h" + +@implementation UITableView (LookinServer) + +- (NSArray *)lks_numberOfRows { + NSUInteger sectionsCount = MIN(self.numberOfSections, 10); + NSArray *rowsCount = [NSArray lookin_arrayWithCount:sectionsCount block:^id(NSUInteger idx) { + return @([self numberOfRowsInSection:idx]); + }]; + if (rowsCount.count == 0) { + return nil; + } + return rowsCount; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UITextField+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UITextField+LookinServer.h new file mode 100644 index 0000000..429c30b --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UITextField+LookinServer.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UITextField+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/2/26. +// https://lookin.work +// + +#import + +@interface UITextField (LookinServer) + +@property(nonatomic, assign) CGFloat lks_fontSize; + +- (NSString *)lks_fontName; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UITextField+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UITextField+LookinServer.m new file mode 100644 index 0000000..9e07a76 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UITextField+LookinServer.m @@ -0,0 +1,29 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UITextField+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/2/26. +// https://lookin.work +// + +#import "UITextField+LookinServer.h" + +@implementation UITextField (LookinServer) + +- (CGFloat)lks_fontSize { + return self.font.pointSize; +} +- (void)setLks_fontSize:(CGFloat)lks_fontSize { + UIFont *font = [self.font fontWithSize:lks_fontSize]; + self.font = font; +} + +- (NSString *)lks_fontName { + return self.font.fontName; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UITextView+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UITextView+LookinServer.h new file mode 100644 index 0000000..e36b2ab --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UITextView+LookinServer.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UITextView+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/2/26. +// https://lookin.work +// + +#import + +@interface UITextView (LookinServer) + +@property(nonatomic, assign) CGFloat lks_fontSize; + +- (NSString *)lks_fontName; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UITextView+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UITextView+LookinServer.m new file mode 100644 index 0000000..bd81a8b --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UITextView+LookinServer.m @@ -0,0 +1,29 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UITextView+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/2/26. +// https://lookin.work +// + +#import "UITextView+LookinServer.h" + +@implementation UITextView (LookinServer) + +- (CGFloat)lks_fontSize { + return self.font.pointSize; +} +- (void)setLks_fontSize:(CGFloat)lks_fontSize { + UIFont *font = [self.font fontWithSize:lks_fontSize]; + self.font = font; +} + +- (NSString *)lks_fontName { + return self.font.fontName; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIView+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UIView+LookinServer.h new file mode 100644 index 0000000..eca36a1 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIView+LookinServer.h @@ -0,0 +1,44 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIView+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/3/19. +// https://lookin.work +// + +#import "LookinDefines.h" +#import + +@interface UIView (LookinServer) + +/// 如果 myViewController.view = myView,则可以通过 myView 的 lks_findHostViewController 方法找到 myViewController +- (UIViewController *)lks_findHostViewController; + +/// 是否是 UITabBar 的 childrenView,如果是的话,则截图时需要强制使用 renderInContext: 的方式而非 drawViewHierarchyInRect:afterScreenUpdates: 否则在 iOS 13 上获取到的图像是空的不知道为什么 +@property(nonatomic, assign) BOOL lks_isChildrenViewOfTabBar; + +/// point 是相对于 receiver 自身的坐标系 +- (UIView *)lks_subviewAtPoint:(CGPoint)point preferredClasses:(NSArray *)preferredClasses; + +- (CGFloat)lks_bestWidth; +- (CGFloat)lks_bestHeight; +- (CGSize)lks_bestSize; + +@property(nonatomic, assign) float lks_horizontalContentHuggingPriority; +@property(nonatomic, assign) float lks_verticalContentHuggingPriority; + +@property(nonatomic, assign) float lks_horizontalContentCompressionResistancePriority; +@property(nonatomic, assign) float lks_verticalContentCompressionResistancePriority; + +/// 遍历全局的 view 并给他们设置 lks_involvedRawConstraints 属性 ++ (void)lks_rebuildGlobalInvolvedRawConstraints; +/// 该属性保存了牵扯到当前 view 的所有 constraints,包括那些没有生效的 +@property(nonatomic, strong) NSMutableArray *lks_involvedRawConstraints; + +- (NSArray *> *)lks_constraints; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIView+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UIView+LookinServer.m new file mode 100644 index 0000000..9cfa5f3 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIView+LookinServer.m @@ -0,0 +1,215 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIView+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/3/19. +// https://lookin.work +// + +#import "UIView+LookinServer.h" +#import +#import "LookinObject.h" +#import "LookinAutoLayoutConstraint.h" +#import "LookinServerDefines.h" +#import "LKS_MultiplatformAdapter.h" + +@implementation UIView (LookinServer) + +- (UIViewController *)lks_findHostViewController { + UIResponder *responder = [self nextResponder]; + if (!responder) { + return nil; + } + if (![responder isKindOfClass:[UIViewController class]]) { + return nil; + } + UIViewController *viewController = (UIViewController *)responder; + if (viewController.view != self) { + return nil; + } + return viewController; +} + +- (UIView *)lks_subviewAtPoint:(CGPoint)point preferredClasses:(NSArray *)preferredClasses { + BOOL isPreferredClassForSelf = [preferredClasses lookin_any:^BOOL(Class obj) { + return [self isKindOfClass:obj]; + }]; + if (isPreferredClassForSelf) { + return self; + } + + UIView *targetView = [self.subviews lookin_lastFiltered:^BOOL(__kindof UIView *obj) { + if (obj.hidden || obj.alpha <= 0.01) { + return NO; + } + BOOL contains = CGRectContainsPoint(obj.frame, point); + return contains; + }]; + + if (!targetView) { + return self; + } + + CGPoint newPoint = [targetView convertPoint:point fromView:self]; + targetView = [targetView lks_subviewAtPoint:newPoint preferredClasses:preferredClasses]; + return targetView; +} + +- (CGSize)lks_bestSize { + return [self sizeThatFits:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)]; +} + +- (CGFloat)lks_bestWidth { + return self.lks_bestSize.width; +} + +- (CGFloat)lks_bestHeight { + return self.lks_bestSize.height; +} + +- (void)setLks_isChildrenViewOfTabBar:(BOOL)lks_isChildrenViewOfTabBar { + [self lookin_bindBOOL:lks_isChildrenViewOfTabBar forKey:@"lks_isChildrenViewOfTabBar"]; +} +- (BOOL)lks_isChildrenViewOfTabBar { + return [self lookin_getBindBOOLForKey:@"lks_isChildrenViewOfTabBar"]; +} + +- (void)setLks_verticalContentHuggingPriority:(float)lks_verticalContentHuggingPriority { + [self setContentHuggingPriority:lks_verticalContentHuggingPriority forAxis:UILayoutConstraintAxisVertical]; +} +- (float)lks_verticalContentHuggingPriority { + return [self contentHuggingPriorityForAxis:UILayoutConstraintAxisVertical]; +} + +- (void)setLks_horizontalContentHuggingPriority:(float)lks_horizontalContentHuggingPriority { + [self setContentHuggingPriority:lks_horizontalContentHuggingPriority forAxis:UILayoutConstraintAxisHorizontal]; +} +- (float)lks_horizontalContentHuggingPriority { + return [self contentHuggingPriorityForAxis:UILayoutConstraintAxisHorizontal]; +} + +- (void)setLks_verticalContentCompressionResistancePriority:(float)lks_verticalContentCompressionResistancePriority { + [self setContentCompressionResistancePriority:lks_verticalContentCompressionResistancePriority forAxis:UILayoutConstraintAxisVertical]; +} +- (float)lks_verticalContentCompressionResistancePriority { + return [self contentCompressionResistancePriorityForAxis:UILayoutConstraintAxisVertical]; +} + +- (void)setLks_horizontalContentCompressionResistancePriority:(float)lks_horizontalContentCompressionResistancePriority { + [self setContentCompressionResistancePriority:lks_horizontalContentCompressionResistancePriority forAxis:UILayoutConstraintAxisHorizontal]; +} +- (float)lks_horizontalContentCompressionResistancePriority { + return [self contentCompressionResistancePriorityForAxis:UILayoutConstraintAxisHorizontal]; +} + ++ (void)lks_rebuildGlobalInvolvedRawConstraints { + [[LKS_MultiplatformAdapter allWindows] enumerateObjectsUsingBlock:^(__kindof UIWindow * _Nonnull window, NSUInteger idx, BOOL * _Nonnull stop) { + [self lks_removeInvolvedRawConstraintsForViewsRootedByView:window]; + }]; + [[LKS_MultiplatformAdapter allWindows] enumerateObjectsUsingBlock:^(__kindof UIWindow * _Nonnull window, NSUInteger idx, BOOL * _Nonnull stop) { + [self lks_addInvolvedRawConstraintsForViewsRootedByView:window]; + }]; +} + ++ (void)lks_addInvolvedRawConstraintsForViewsRootedByView:(UIView *)rootView { + [rootView.constraints enumerateObjectsUsingBlock:^(__kindof NSLayoutConstraint * _Nonnull constraint, NSUInteger idx, BOOL * _Nonnull stop) { + UIView *firstView = constraint.firstItem; + if ([firstView isKindOfClass:[UIView class]] && ![firstView.lks_involvedRawConstraints containsObject:constraint]) { + if (!firstView.lks_involvedRawConstraints) { + firstView.lks_involvedRawConstraints = [NSMutableArray array]; + } + [firstView.lks_involvedRawConstraints addObject:constraint]; + } + + UIView *secondView = constraint.secondItem; + if ([secondView isKindOfClass:[UIView class]] && ![secondView.lks_involvedRawConstraints containsObject:constraint]) { + if (!secondView.lks_involvedRawConstraints) { + secondView.lks_involvedRawConstraints = [NSMutableArray array]; + } + [secondView.lks_involvedRawConstraints addObject:constraint]; + } + }]; + + [rootView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull subview, NSUInteger idx, BOOL * _Nonnull stop) { + [self lks_addInvolvedRawConstraintsForViewsRootedByView:subview]; + }]; +} + ++ (void)lks_removeInvolvedRawConstraintsForViewsRootedByView:(UIView *)rootView { + [rootView.lks_involvedRawConstraints removeAllObjects]; + [rootView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull subview, NSUInteger idx, BOOL * _Nonnull stop) { + [self lks_removeInvolvedRawConstraintsForViewsRootedByView:subview]; + }]; +} + +- (void)setLks_involvedRawConstraints:(NSMutableArray *)lks_involvedRawConstraints { + [self lookin_bindObject:lks_involvedRawConstraints forKey:@"lks_involvedRawConstraints"]; +} + +- (NSMutableArray *)lks_involvedRawConstraints { + return [self lookin_getBindObjectForKey:@"lks_involvedRawConstraints"]; +} + +- (NSArray *)lks_constraints { + /** + - lks_involvedRawConstraints 保存了牵扯到了 self 的所有的 constraints(包括未生效的,但不包括 inactive 的,整个产品逻辑都是直接忽略 inactive 的 constraints) + - 通过 constraintsAffectingLayoutForAxis 可以拿到会影响 self 布局的所有已生效的 constraints(这里称之为 effectiveConstraints) + - 很多情况下,一条 constraint 会出现在 effectiveConstraints 里但不会出现在 lks_involvedRawConstraints 里,比如: + · UIWindow 拥有 minX, minY, width, height 四个 effectiveConstraints,但 lks_involvedRawConstraints 为空,因为它的 constraints 属性为空(这一点不知道为啥,但 Xcode Inspector 和 Reveal 确实也不会显示这四个 constraints) + · 如果设置了 View1 的 center 和 superview 的 center 保持一致,则 superview 的 width 和 height 也会出现在 effectiveConstraints 里,但不会出现在 lks_involvedRawConstraints 里(这点可以理解,毕竟这种场景下 superview 的 width 和 height 确实会影响到 View1) + */ + NSMutableArray *effectiveConstraints = [NSMutableArray array]; + [effectiveConstraints addObjectsFromArray:[self constraintsAffectingLayoutForAxis:UILayoutConstraintAxisHorizontal]]; + [effectiveConstraints addObjectsFromArray:[self constraintsAffectingLayoutForAxis:UILayoutConstraintAxisVertical]]; + + NSArray *lookinConstraints = [self.lks_involvedRawConstraints lookin_map:^id(NSUInteger idx, __kindof NSLayoutConstraint *constraint) { + BOOL isEffective = [effectiveConstraints containsObject:constraint]; + if ([constraint isActive]) { + // trying to get firstItem or secondItem of an inactive constraint may cause dangling-pointer crash + // https://github.com/QMUI/LookinServer/issues/86 + LookinConstraintItemType firstItemType = [self _lks_constraintItemTypeForItem:constraint.firstItem]; + LookinConstraintItemType secondItemType = [self _lks_constraintItemTypeForItem:constraint.secondItem]; + LookinAutoLayoutConstraint *lookinConstraint = [LookinAutoLayoutConstraint instanceFromNSConstraint:constraint isEffective:isEffective firstItemType:firstItemType secondItemType:secondItemType]; + return lookinConstraint; + } + return nil; + }]; + return lookinConstraints.count ? lookinConstraints : nil; +} + +- (LookinConstraintItemType)_lks_constraintItemTypeForItem:(id)item { + if (!item) { + return LookinConstraintItemTypeNil; + } + if (item == self) { + return LookinConstraintItemTypeSelf; + } + if (item == self.superview) { + return LookinConstraintItemTypeSuper; + } + + // 在 runtime 时,这里会遇到的 UILayoutGuide 和 _UILayoutGuide 居然是 UIView 的子类,不知道是看错了还是有什么玄机,所以在判断是否是 UIView 之前要先判断这个 + if (@available(iOS 9.0, *)) { + if ([item isKindOfClass:[UILayoutGuide class]]) { + return LookinConstraintItemTypeLayoutGuide; + } + } + + NSString *className = NSStringFromClass([item class]); + if ([className hasSuffix:@"_UILayoutGuide"]) { + return LookinConstraintItemTypeLayoutGuide; + } + + if ([item isKindOfClass:[UIView class]]) { + return LookinConstraintItemTypeView; + } + + NSAssert(NO, @""); + return LookinConstraintItemTypeUnknown; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIViewController+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UIViewController+LookinServer.h new file mode 100644 index 0000000..1cab2a6 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIViewController+LookinServer.h @@ -0,0 +1,19 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIViewController+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/4/22. +// https://lookin.work +// + +#import + +@interface UIViewController (LookinServer) + ++ (UIViewController *)lks_visibleViewController; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIViewController+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UIViewController+LookinServer.m new file mode 100644 index 0000000..2833eab --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIViewController+LookinServer.m @@ -0,0 +1,48 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIViewController+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/4/22. +// https://lookin.work +// + +#import "UIViewController+LookinServer.h" +#import "UIView+LookinServer.h" +#import +#import "LKS_MultiplatformAdapter.h" + +@implementation UIViewController (LookinServer) + ++ (nullable UIViewController *)lks_visibleViewController { + + UIViewController *rootViewController = [LKS_MultiplatformAdapter keyWindow].rootViewController; + UIViewController *visibleViewController = [rootViewController lks_visibleViewControllerIfExist]; + return visibleViewController; +} + +- (UIViewController *)lks_visibleViewControllerIfExist { + + if (self.presentedViewController) { + return [self.presentedViewController lks_visibleViewControllerIfExist]; + } + + if ([self isKindOfClass:[UINavigationController class]]) { + return [((UINavigationController *)self).visibleViewController lks_visibleViewControllerIfExist]; + } + + if ([self isKindOfClass:[UITabBarController class]]) { + return [((UITabBarController *)self).selectedViewController lks_visibleViewControllerIfExist]; + } + + if (self.isViewLoaded && !self.view.hidden && self.view.alpha > 0.01) { + return self; + } else { + return nil; + } +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIVisualEffectView+LookinServer.h b/Pods/LookinServer/Src/Main/Server/Category/UIVisualEffectView+LookinServer.h new file mode 100644 index 0000000..697d840 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIVisualEffectView+LookinServer.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIVisualEffectView+LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/10/8. +// https://lookin.work +// + +#import + +@interface UIVisualEffectView (LookinServer) + +- (void)setLks_blurEffectStyleNumber:(NSNumber *)lks_blurEffectStyleNumber; + +- (NSNumber *)lks_blurEffectStyleNumber; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Category/UIVisualEffectView+LookinServer.m b/Pods/LookinServer/Src/Main/Server/Category/UIVisualEffectView+LookinServer.m new file mode 100644 index 0000000..df06b10 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Category/UIVisualEffectView+LookinServer.m @@ -0,0 +1,33 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// UIVisualEffectView+LookinServer.m +// LookinServer +// +// Created by Li Kai on 2019/10/8. +// https://lookin.work +// + +#import "UIVisualEffectView+LookinServer.h" +#import "UIBlurEffect+LookinServer.h" + +@implementation UIVisualEffectView (LookinServer) + +- (void)setLks_blurEffectStyleNumber:(NSNumber *)lks_blurEffectStyleNumber { + UIBlurEffectStyle style = [lks_blurEffectStyleNumber integerValue]; + UIBlurEffect *effect = [UIBlurEffect effectWithStyle:style]; + self.effect = effect; +} + +- (NSNumber *)lks_blurEffectStyleNumber { + UIVisualEffect *effect = self.effect; + if (![effect isKindOfClass:[UIBlurEffect class]]) { + return nil; + } + UIBlurEffect *blurEffect = (UIBlurEffect *)effect; + return blurEffect.lks_effectStyleNumber; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/LKS_ConnectionManager.h b/Pods/LookinServer/Src/Main/Server/Connection/LKS_ConnectionManager.h new file mode 100644 index 0000000..684127b --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/LKS_ConnectionManager.h @@ -0,0 +1,29 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// Lookin.h +// Lookin +// +// Created by Li Kai on 2018/8/5. +// https://lookin.work +// + +#import + +extern NSString *const LKS_ConnectionDidEndNotificationName; + +@class LookinConnectionResponseAttachment; + +@interface LKS_ConnectionManager : NSObject + ++ (instancetype)sharedInstance; + +@property(nonatomic, assign) BOOL applicationIsActive; + +- (void)respond:(LookinConnectionResponseAttachment *)data requestType:(uint32_t)requestType tag:(uint32_t)tag; + +- (void)pushData:(NSObject *)data type:(uint32_t)type; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/LKS_ConnectionManager.m b/Pods/LookinServer/Src/Main/Server/Connection/LKS_ConnectionManager.m new file mode 100644 index 0000000..c992c7f --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/LKS_ConnectionManager.m @@ -0,0 +1,268 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinServer.m +// LookinServer +// +// Created by Li Kai on 2018/8/5. +// https://lookin.work +// + +#import "LKS_ConnectionManager.h" +#import "Lookin_PTChannel.h" +#import "LKS_RequestHandler.h" +#import "LookinConnectionResponseAttachment.h" +#import "LKS_ExportManager.h" +#import "LookinServerDefines.h" +#import "LKS_TraceManager.h" +#import "LKS_MultiplatformAdapter.h" + +NSString *const LKS_ConnectionDidEndNotificationName = @"LKS_ConnectionDidEndNotificationName"; + +@interface LKS_ConnectionManager () + +@property(nonatomic, weak) Lookin_PTChannel *peerChannel_; + +@property(nonatomic, strong) LKS_RequestHandler *requestHandler; + +@end + +@implementation LKS_ConnectionManager + ++ (instancetype)sharedInstance { + static LKS_ConnectionManager *sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[LKS_ConnectionManager alloc] init]; + }); + return sharedInstance; +} + ++ (void)load { + // 触发 init 方法 + [LKS_ConnectionManager sharedInstance]; +} + +- (instancetype)init { + if (self = [super init]) { + NSLog(@"LookinServer - Will launch. Framework version: %@", LOOKIN_SERVER_READABLE_VERSION); + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleApplicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleWillResignActiveNotification) name:UIApplicationWillResignActiveNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleLocalInspect:) name:@"Lookin_2D" object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleLocalInspect:) name:@"Lookin_3D" object:nil]; + [[NSNotificationCenter defaultCenter] addObserverForName:@"Lookin_Export" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { + [[LKS_ExportManager sharedInstance] exportAndShare]; + }]; + [[NSNotificationCenter defaultCenter] addObserverForName:@"Lookin_RelationSearch" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { + [[LKS_TraceManager sharedInstance] addSearchTarger:note.object]; + }]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleGetLookinInfo:) name:@"GetLookinInfo" object:nil]; + + self.requestHandler = [LKS_RequestHandler new]; + } + return self; +} + +- (void)_handleWillResignActiveNotification { + self.applicationIsActive = NO; + + if (self.peerChannel_ && ![self.peerChannel_ isConnected]) { + [self.peerChannel_ close]; + self.peerChannel_ = nil; + } +} + +- (void)_handleApplicationDidBecomeActive { + self.applicationIsActive = YES; + [self searchPortToListenIfNoConnection]; +} + +- (void)searchPortToListenIfNoConnection { + if ([self.peerChannel_ isConnected]) { + NSLog(@"LookinServer - Abort to search ports. Already has connected channel."); + return; + } + NSLog(@"LookinServer - Searching port to listen..."); + [self.peerChannel_ close]; + self.peerChannel_ = nil; + + if ([self isiOSAppOnMac]) { + [self _tryToListenOnPortFrom:LookinSimulatorIPv4PortNumberStart to:LookinSimulatorIPv4PortNumberEnd current:LookinSimulatorIPv4PortNumberStart]; + } else { + [self _tryToListenOnPortFrom:LookinUSBDeviceIPv4PortNumberStart to:LookinUSBDeviceIPv4PortNumberEnd current:LookinUSBDeviceIPv4PortNumberStart]; + } +} + +- (BOOL)isiOSAppOnMac { +#if TARGET_OS_SIMULATOR + return YES; +#else + if (@available(iOS 14.0, *)) { + // isiOSAppOnMac 这个 API 看似在 iOS 14.0 上可用,但其实在 iOS 14 beta 上是不存在的、有 unrecognized selector 问题,因此这里要用 respondsToSelector 做一下保护 + NSProcessInfo *info = [NSProcessInfo processInfo]; + if ([info respondsToSelector:@selector(isiOSAppOnMac)]) { + return [info isiOSAppOnMac]; + } else if ([info respondsToSelector:@selector(isMacCatalystApp)]) { + return [info isMacCatalystApp]; + } else { + return NO; + } + } + if (@available(iOS 13.0, tvOS 13.0, *)) { + return [NSProcessInfo processInfo].isMacCatalystApp; + } + return NO; +#endif +} + +- (void)_tryToListenOnPortFrom:(int)fromPort to:(int)toPort current:(int)currentPort { + Lookin_PTChannel *channel = [Lookin_PTChannel channelWithDelegate:self]; + channel.targetPort = currentPort; + [channel listenOnPort:currentPort IPv4Address:INADDR_LOOPBACK callback:^(NSError *error) { + if (error) { + if (error.code == 48) { + // 该地址已被占用 + } else { + // 未知失败 + } + + if (currentPort < toPort) { + // 尝试下一个端口 + NSLog(@"LookinServer - 127.0.0.1:%d is unavailable(%@). Will try anothor address ...", currentPort, error); + [self _tryToListenOnPortFrom:fromPort to:toPort current:(currentPort + 1)]; + } else { + // 所有端口都尝试完毕,全部失败 + NSLog(@"LookinServer - 127.0.0.1:%d is unavailable(%@).", currentPort, error); + NSLog(@"LookinServer - Connect failed in the end."); + } + + } else { + // 成功 + NSLog(@"LookinServer - Connected successfully on 127.0.0.1:%d", currentPort); + // 此时 peerChannel_ 状态为 listening + self.peerChannel_ = channel; + } + }]; +} + +- (void)dealloc { + if (self.peerChannel_) { + [self.peerChannel_ close]; + } + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)respond:(LookinConnectionResponseAttachment *)data requestType:(uint32_t)requestType tag:(uint32_t)tag { + [self _sendData:data frameOfType:requestType tag:tag]; +} + +- (void)pushData:(NSObject *)data type:(uint32_t)type { + [self _sendData:data frameOfType:type tag:0]; +} + +- (void)_sendData:(NSObject *)data frameOfType:(uint32_t)frameOfType tag:(uint32_t)tag { + if (self.peerChannel_) { + NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:data]; + dispatch_data_t payload = [archivedData createReferencingDispatchData]; + + [self.peerChannel_ sendFrameOfType:frameOfType tag:tag withPayload:payload callback:^(NSError *error) { + if (error) { + } + }]; + } +} + +#pragma mark - Lookin_PTChannelDelegate + +- (BOOL)ioFrameChannel:(Lookin_PTChannel*)channel shouldAcceptFrameOfType:(uint32_t)type tag:(uint32_t)tag payloadSize:(uint32_t)payloadSize { + if (channel != self.peerChannel_) { + return NO; + } else if ([self.requestHandler canHandleRequestType:type]) { + return YES; + } else { + [channel close]; + return NO; + } +} + +- (void)ioFrameChannel:(Lookin_PTChannel*)channel didReceiveFrameOfType:(uint32_t)type tag:(uint32_t)tag payload:(Lookin_PTData*)payload { + id object = nil; + if (payload) { + id unarchivedObject = [NSKeyedUnarchiver unarchiveObjectWithData:[NSData dataWithContentsOfDispatchData:payload.dispatchData]]; + if ([unarchivedObject isKindOfClass:[LookinConnectionAttachment class]]) { + LookinConnectionAttachment *attachment = (LookinConnectionAttachment *)unarchivedObject; + object = attachment.data; + } else { + object = unarchivedObject; + } + } + [self.requestHandler handleRequestType:type tag:tag object:object]; +} + +/// 当 Client 端链接成功时,该方法会被调用,然后 channel 的状态会变成 connected +- (void)ioFrameChannel:(Lookin_PTChannel*)channel didAcceptConnection:(Lookin_PTChannel*)otherChannel fromAddress:(Lookin_PTAddress*)address { + NSLog(@"LookinServer - channel:%@, acceptConnection:%@", channel.debugTag, otherChannel.debugTag); + + Lookin_PTChannel *previousChannel = self.peerChannel_; + + otherChannel.targetPort = address.port; + self.peerChannel_ = otherChannel; + + [previousChannel cancel]; +} + +/// 当连接过 Lookin 客户端,然后 Lookin 客户端又被关闭时,会走到这里 +- (void)ioFrameChannel:(Lookin_PTChannel*)channel didEndWithError:(NSError*)error { + if (self.peerChannel_ != channel) { + // Client 端第一次连接上时,之前 listen 的 port 会被 Peertalk 内部 cancel(并在 didAcceptConnection 方法里给业务抛一个新建的 connected 状态的 channel),那个被 cancel 的 channel 会走到这里 + NSLog(@"LookinServer - Ignore channel%@ end.", channel.debugTag); + return; + } + // Client 端关闭时,会走到这里 + NSLog(@"LookinServer - channel%@ DidEndWithError:%@", channel.debugTag, error); + + [[NSNotificationCenter defaultCenter] postNotificationName:LKS_ConnectionDidEndNotificationName object:self]; + [self searchPortToListenIfNoConnection]; +} + +#pragma mark - Handler + +- (void)_handleLocalInspect:(NSNotification *)note { + UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Lookin" message:@"Failed to run local inspection. The feature has been removed. Please use the computer version of Lookin or consider SDKs like FLEX for similar functionality." preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; + [alertController addAction:okAction]; + UIWindow *keyWindow = [LKS_MultiplatformAdapter keyWindow]; + UIViewController *rootViewController = [keyWindow rootViewController]; + [rootViewController presentViewController:alertController animated:YES completion:nil]; + + NSLog(@"LookinServer - Failed to run local inspection. The feature has been removed. Please use the computer version of Lookin or consider SDKs like FLEX for similar functionality."); +} + +- (void)handleGetLookinInfo:(NSNotification *)note { + NSDictionary* userInfo = note.userInfo; + if (!userInfo) { + return; + } + NSMutableDictionary* infoWrapper = userInfo[@"infos"]; + if (![infoWrapper isKindOfClass:[NSMutableDictionary class]]) { + NSLog(@"LookinServer - GetLookinInfo failed. Params invalid."); + return; + } + infoWrapper[@"lookinServerVersion"] = LOOKIN_SERVER_READABLE_VERSION; +} + +@end + +/// 这个类使得用户可以通过 NSClassFromString(@"Lookin") 来判断 LookinServer 是否被编译进了项目里 + +@interface Lookin : NSObject + +@end + +@implementation Lookin + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/LKS_RequestHandler.h b/Pods/LookinServer/Src/Main/Server/Connection/LKS_RequestHandler.h new file mode 100644 index 0000000..52ebe71 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/LKS_RequestHandler.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_RequestHandler.h +// LookinServer +// +// Created by Li Kai on 2019/1/15. +// https://lookin.work +// + +#import + +@interface LKS_RequestHandler : NSObject + +- (BOOL)canHandleRequestType:(uint32_t)requestType; + +- (void)handleRequestType:(uint32_t)requestType tag:(uint32_t)tag object:(id)object; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/LKS_RequestHandler.m b/Pods/LookinServer/Src/Main/Server/Connection/LKS_RequestHandler.m new file mode 100644 index 0000000..c9d1572 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/LKS_RequestHandler.m @@ -0,0 +1,558 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_RequestHandler.m +// LookinServer +// +// Created by Li Kai on 2019/1/15. +// https://lookin.work +// + +#import "LKS_RequestHandler.h" +#import "NSObject+LookinServer.h" +#import "UIImage+LookinServer.h" +#import "LKS_ConnectionManager.h" +#import "LookinConnectionResponseAttachment.h" +#import "LookinAttributeModification.h" +#import "LookinDisplayItemDetail.h" +#import "LookinHierarchyInfo.h" +#import "LookinServerDefines.h" +#import +#import "LookinObject.h" +#import "LookinAppInfo.h" +#import "LKS_AttrGroupsMaker.h" +#import "LKS_InbuiltAttrModificationHandler.h" +#import "LKS_CustomAttrModificationHandler.h" +#import "LKS_AttrModificationPatchHandler.h" +#import "LKS_HierarchyDetailsHandler.h" +#import "LookinStaticAsyncUpdateTask.h" + +@interface LKS_RequestHandler () + +@property(nonatomic, strong) NSMutableSet *activeDetailHandlers; + +@end + +@implementation LKS_RequestHandler { + NSSet *_validRequestTypes; +} + +- (instancetype)init { + if (self = [super init]) { + _validRequestTypes = [NSSet setWithObjects:@(LookinRequestTypePing), + @(LookinRequestTypeApp), + @(LookinRequestTypeHierarchy), + @(LookinRequestTypeInbuiltAttrModification), + @(LookinRequestTypeCustomAttrModification), + @(LookinRequestTypeAttrModificationPatch), + @(LookinRequestTypeHierarchyDetails), + @(LookinRequestTypeFetchObject), + @(LookinRequestTypeAllAttrGroups), + @(LookinRequestTypeAllSelectorNames), + @(LookinRequestTypeInvokeMethod), + @(LookinRequestTypeFetchImageViewImage), + @(LookinRequestTypeModifyRecognizerEnable), + @(LookinPush_CanceHierarchyDetails), + nil]; + + self.activeDetailHandlers = [NSMutableSet set]; + } + return self; +} + +- (BOOL)canHandleRequestType:(uint32_t)requestType { + if ([_validRequestTypes containsObject:@(requestType)]) { + return YES; + } + return NO; +} + +- (void)handleRequestType:(uint32_t)requestType tag:(uint32_t)tag object:(id)object { + if (requestType == LookinRequestTypePing) { + LookinConnectionResponseAttachment *responseAttachment = [LookinConnectionResponseAttachment new]; + // 当 app 处于后台时,可能可以执行代码也可能不能执行代码,如果运气好了可以执行代码,则这里直接主动使用 appIsInBackground 标识 app 处于后台,不要让 Lookin 客户端傻傻地等待超时了 + if (![LKS_ConnectionManager sharedInstance].applicationIsActive) { + responseAttachment.appIsInBackground = YES; + } + [[LKS_ConnectionManager sharedInstance] respond:responseAttachment requestType:requestType tag:tag]; + + } else if (requestType == LookinRequestTypeApp) { + // 请求可用设备信息 + if (![object isKindOfClass:[NSDictionary class]]) { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + return; + } + NSDictionary *params = object; + BOOL needImages = ((NSNumber *)params[@"needImages"]).boolValue; + NSArray *localIdentifiers = params[@"local"]; + + LookinAppInfo *appInfo = [LookinAppInfo currentInfoWithScreenshot:needImages icon:needImages localIdentifiers:localIdentifiers]; + + LookinConnectionResponseAttachment *responseAttachment = [LookinConnectionResponseAttachment new]; + responseAttachment.data = appInfo; + [[LKS_ConnectionManager sharedInstance] respond:responseAttachment requestType:requestType tag:tag]; + + } else if (requestType == LookinRequestTypeHierarchy) { + // 从 LookinClient 1.0.4 开始有这个参数,之前是 nil + NSString *clientVersion = nil; + if ([object isKindOfClass:[NSDictionary class]]) { + NSDictionary *params = object; + NSString *version = params[@"clientVersion"]; + if ([version isKindOfClass:[NSString class]]) { + clientVersion = version; + } + } + + LookinConnectionResponseAttachment *responseAttachment = [LookinConnectionResponseAttachment new]; + responseAttachment.data = [LookinHierarchyInfo staticInfoWithLookinVersion:clientVersion]; + [[LKS_ConnectionManager sharedInstance] respond:responseAttachment requestType:requestType tag:tag]; + + } else if (requestType == LookinRequestTypeInbuiltAttrModification) { + // 请求修改某个属性 + [LKS_InbuiltAttrModificationHandler handleModification:object completion:^(LookinDisplayItemDetail *data, NSError *error) { + LookinConnectionResponseAttachment *attachment = [LookinConnectionResponseAttachment new]; + if (error) { + attachment.error = error; + } else { + attachment.data = data; + } + [[LKS_ConnectionManager sharedInstance] respond:attachment requestType:requestType tag:tag]; + }]; + + } else if (requestType == LookinRequestTypeCustomAttrModification) { + BOOL succ = [LKS_CustomAttrModificationHandler handleModification:object]; + if (succ) { + [self _submitResponseWithData:nil requestType:requestType tag:tag]; + } else { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + } + + } else if (requestType == LookinRequestTypeAttrModificationPatch) { + NSArray *tasks = object; + NSUInteger dataTotalCount = tasks.count; + [LKS_InbuiltAttrModificationHandler handlePatchWithTasks:tasks block:^(LookinDisplayItemDetail *data) { + LookinConnectionResponseAttachment *attrAttachment = [LookinConnectionResponseAttachment new]; + attrAttachment.data = data; + attrAttachment.dataTotalCount = dataTotalCount; + attrAttachment.currentDataCount = 1; + [[LKS_ConnectionManager sharedInstance] respond:attrAttachment requestType:LookinRequestTypeAttrModificationPatch tag:tag]; + }]; + + } else if (requestType == LookinRequestTypeHierarchyDetails) { + NSArray *packages = object; + NSUInteger responsesDataTotalCount = [packages lookin_reduceInteger:^NSInteger(NSInteger accumulator, NSUInteger idx, LookinStaticAsyncUpdateTasksPackage *package) { + accumulator += package.tasks.count; + return accumulator; + } initialAccumlator:0]; + + LKS_HierarchyDetailsHandler *handler = [LKS_HierarchyDetailsHandler new]; + [self.activeDetailHandlers addObject:handler]; + + [handler startWithPackages:packages block:^(NSArray *details) { + LookinConnectionResponseAttachment *attachment = [LookinConnectionResponseAttachment new]; + attachment.data = details; + attachment.dataTotalCount = responsesDataTotalCount; + attachment.currentDataCount = details.count; + [[LKS_ConnectionManager sharedInstance] respond:attachment requestType:LookinRequestTypeHierarchyDetails tag:tag]; + + } finishedBlock:^{ + [self.activeDetailHandlers removeObject:handler]; + }]; + + } else if (requestType == LookinRequestTypeFetchObject) { + unsigned long oid = ((NSNumber *)object).unsignedLongValue; + NSObject *object = [NSObject lks_objectWithOid:oid]; + LookinObject *lookinObj = [LookinObject instanceWithObject:object]; + + LookinConnectionResponseAttachment *attach = [LookinConnectionResponseAttachment new]; + attach.data = lookinObj; + [[LKS_ConnectionManager sharedInstance] respond:attach requestType:requestType tag:tag]; + + } else if (requestType == LookinRequestTypeAllAttrGroups) { + unsigned long oid = ((NSNumber *)object).unsignedLongValue; + CALayer *layer = (CALayer *)[NSObject lks_objectWithOid:oid]; + if (![layer isKindOfClass:[CALayer class]]) { + [self _submitResponseWithError:LookinErr_ObjNotFound requestType:LookinRequestTypeAllAttrGroups tag:tag]; + return; + } + + NSArray *list = [LKS_AttrGroupsMaker attrGroupsForLayer:layer]; + [self _submitResponseWithData:list requestType:LookinRequestTypeAllAttrGroups tag:tag]; + + } else if (requestType == LookinRequestTypeAllSelectorNames) { + if (![object isKindOfClass:[NSDictionary class]]) { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + return; + } + NSDictionary *params = object; + Class targetClass = NSClassFromString(params[@"className"]); + BOOL hasArg = [(NSNumber *)params[@"hasArg"] boolValue]; + if (!targetClass) { + NSString *errorMsg = [NSString stringWithFormat:LKS_Localized(@"Didn't find the class named \"%@\". Please input another class and try again."), object]; + [self _submitResponseWithError:LookinErrorMake(errorMsg, @"") requestType:requestType tag:tag]; + return; + } + + NSArray *selNames = [self _methodNameListForClass:targetClass hasArg:hasArg]; + [self _submitResponseWithData:selNames requestType:requestType tag:tag]; + + } else if (requestType == LookinRequestTypeInvokeMethod) { + if (![object isKindOfClass:[NSDictionary class]]) { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + return; + } + NSDictionary *param = object; + unsigned long oid = [param[@"oid"] unsignedLongValue]; + NSString *text = param[@"text"]; + if (!text.length) { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + return; + } + NSObject *targerObj = [NSObject lks_objectWithOid:oid]; + if (!targerObj) { + [self _submitResponseWithError:LookinErr_ObjNotFound requestType:requestType tag:tag]; + return; + } + + SEL targetSelector = NSSelectorFromString(text); + if (targetSelector && [targerObj respondsToSelector:targetSelector]) { + NSString *resultDescription; + NSObject *resultObject; + NSError *error; + [self _handleInvokeWithObject:targerObj selector:targetSelector resultDescription:&resultDescription resultObject:&resultObject error:&error]; + if (error) { + [self _submitResponseWithError:error requestType:requestType tag:tag]; + return; + } + NSMutableDictionary *responseData = [NSMutableDictionary dictionaryWithCapacity:2]; + if (resultDescription) { + responseData[@"description"] = resultDescription; + } + if (resultObject) { + responseData[@"object"] = resultObject; + } + [self _submitResponseWithData:responseData requestType:requestType tag:tag]; + } else { + NSString *errMsg = [NSString stringWithFormat:LKS_Localized(@"%@ doesn't have an instance method called \"%@\"."), NSStringFromClass(targerObj.class), text]; + [self _submitResponseWithError:LookinErrorMake(errMsg, @"") requestType:requestType tag:tag]; + } + + } else if (requestType == LookinPush_CanceHierarchyDetails) { + [self.activeDetailHandlers enumerateObjectsUsingBlock:^(LKS_HierarchyDetailsHandler * _Nonnull handler, BOOL * _Nonnull stop) { + [handler cancel]; + }]; + [self.activeDetailHandlers removeAllObjects]; + + } else if (requestType == LookinRequestTypeFetchImageViewImage) { + if (![object isKindOfClass:[NSNumber class]]) { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + return; + } + unsigned long imageViewOid = [(NSNumber *)object unsignedLongValue]; + UIImageView *imageView = (UIImageView *)[NSObject lks_objectWithOid:imageViewOid]; + if (!imageView) { + [self _submitResponseWithError:LookinErr_ObjNotFound requestType:requestType tag:tag]; + return; + } + if (![imageView isKindOfClass:[UIImageView class]]) { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + return; + } + UIImage *image = imageView.image; + NSData *imageData = [image lookin_data]; + [self _submitResponseWithData:imageData requestType:requestType tag:tag]; + + } else if (requestType == LookinRequestTypeModifyRecognizerEnable) { + if (![object isKindOfClass:[NSDictionary class]]) { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + return; + } + NSDictionary *params = object; + unsigned long recognizerOid = ((NSNumber *)params[@"oid"]).unsignedLongValue; + BOOL shouldBeEnabled = ((NSNumber *)params[@"enable"]).boolValue; + + UIGestureRecognizer *recognizer = (UIGestureRecognizer *)[NSObject lks_objectWithOid:recognizerOid]; + if (!recognizer) { + [self _submitResponseWithError:LookinErr_ObjNotFound requestType:requestType tag:tag]; + return; + } + if (![recognizer isKindOfClass:[UIGestureRecognizer class]]) { + [self _submitResponseWithError:LookinErr_Inner requestType:requestType tag:tag]; + return; + } + recognizer.enabled = shouldBeEnabled; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // dispatch 以确保拿到的 enabled 是比较新的 + [self _submitResponseWithData:@(recognizer.enabled) requestType:requestType tag:tag]; + }); + } +} + +- (NSArray *)_methodNameListForClass:(Class)aClass hasArg:(BOOL)hasArg { + NSSet *prefixesToVoid = [NSSet setWithObjects:@"_", @"CA_", @"cpl", @"mf_", @"vs_", @"pep_", @"isNS", @"avkit_", @"PG_", @"px_", @"pl_", @"nsli_", @"pu_", @"pxg_", nil]; + NSMutableArray *array = [NSMutableArray array]; + + Class currentClass = aClass; + while (currentClass) { + NSString *className = NSStringFromClass(currentClass); + BOOL isSystemClass = ([className hasPrefix:@"UI"] || [className hasPrefix:@"CA"] || [className hasPrefix:@"NS"]); + + unsigned int methodCount = 0; + Method *methods = class_copyMethodList(currentClass, &methodCount); + for (unsigned int i = 0; i < methodCount; i++) { + NSString *selName = NSStringFromSelector(method_getName(methods[i])); + + if (!hasArg && [selName containsString:@":"]) { + continue; + } + + if (isSystemClass) { + BOOL invalid = [prefixesToVoid lookin_any:^BOOL(NSString *prefix) { + return [selName hasPrefix:prefix]; + }]; + if (invalid) { + continue; + } + } + if (selName.length && ![array containsObject:selName]) { + [array addObject:selName]; + } + } + if (methods) free(methods); + currentClass = [currentClass superclass]; + } + + return [array lookin_sortedArrayByStringLength]; +} + +- (void)_handleInvokeWithObject:(NSObject *)obj selector:(SEL)selector resultDescription:(NSString **)description resultObject:(LookinObject **)resultObject error:(NSError **)error { + NSMethodSignature *signature = [obj methodSignatureForSelector:selector]; + if (signature.numberOfArguments > 2) { + *error = LookinErrorMake(LKS_Localized(@"Lookin doesn't support invoking methods with arguments yet."), @""); + return; + } + + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setTarget:obj]; + [invocation setSelector:selector]; + [invocation invoke]; + + const char *returnType = [signature methodReturnType]; + + + if (strcmp(returnType, @encode(void)) == 0) { + //void, do nothing + *description = LookinStringFlag_VoidReturn; + + } else if (strcmp(returnType, @encode(char)) == 0) { + char charValue; + [invocation getReturnValue:&charValue]; + *description = [NSString stringWithFormat:@"%@", @(charValue)]; + + } else if (strcmp(returnType, @encode(int)) == 0) { + int intValue; + [invocation getReturnValue:&intValue]; + if (intValue == INT_MAX) { + *description = @"INT_MAX"; + } else if (intValue == INT_MIN) { + *description = @"INT_MIN"; + } else { + *description = [NSString stringWithFormat:@"%@", @(intValue)]; + } + + } else if (strcmp(returnType, @encode(short)) == 0) { + short shortValue; + [invocation getReturnValue:&shortValue]; + if (shortValue == SHRT_MAX) { + *description = @"SHRT_MAX"; + } else if (shortValue == SHRT_MIN) { + *description = @"SHRT_MIN"; + } else { + *description = [NSString stringWithFormat:@"%@", @(shortValue)]; + } + + } else if (strcmp(returnType, @encode(long)) == 0) { + long longValue; + [invocation getReturnValue:&longValue]; + if (longValue == NSNotFound) { + *description = @"NSNotFound"; + } else if (longValue == LONG_MAX) { + *description = @"LONG_MAX"; + } else if (longValue == LONG_MIN) { + *description = @"LONG_MAX"; + } else { + *description = [NSString stringWithFormat:@"%@", @(longValue)]; + } + + } else if (strcmp(returnType, @encode(long long)) == 0) { + long long longLongValue; + [invocation getReturnValue:&longLongValue]; + if (longLongValue == LLONG_MAX) { + *description = @"LLONG_MAX"; + } else if (longLongValue == LLONG_MIN) { + *description = @"LLONG_MIN"; + } else { + *description = [NSString stringWithFormat:@"%@", @(longLongValue)]; + } + + } else if (strcmp(returnType, @encode(unsigned char)) == 0) { + unsigned char ucharValue; + [invocation getReturnValue:&ucharValue]; + if (ucharValue == UCHAR_MAX) { + *description = @"UCHAR_MAX"; + } else { + *description = [NSString stringWithFormat:@"%@", @(ucharValue)]; + } + + } else if (strcmp(returnType, @encode(unsigned int)) == 0) { + unsigned int uintValue; + [invocation getReturnValue:&uintValue]; + if (uintValue == UINT_MAX) { + *description = @"UINT_MAX"; + } else { + *description = [NSString stringWithFormat:@"%@", @(uintValue)]; + } + + } else if (strcmp(returnType, @encode(unsigned short)) == 0) { + unsigned short ushortValue; + [invocation getReturnValue:&ushortValue]; + if (ushortValue == USHRT_MAX) { + *description = @"USHRT_MAX"; + } else { + *description = [NSString stringWithFormat:@"%@", @(ushortValue)]; + } + + } else if (strcmp(returnType, @encode(unsigned long)) == 0) { + unsigned long ulongValue; + [invocation getReturnValue:&ulongValue]; + if (ulongValue == ULONG_MAX) { + *description = @"ULONG_MAX"; + } else { + *description = [NSString stringWithFormat:@"%@", @(ulongValue)]; + } + + } else if (strcmp(returnType, @encode(unsigned long long)) == 0) { + unsigned long long ulongLongValue; + [invocation getReturnValue:&ulongLongValue]; + if (ulongLongValue == ULONG_LONG_MAX) { + *description = @"ULONG_LONG_MAX"; + } else { + *description = [NSString stringWithFormat:@"%@", @(ulongLongValue)]; + } + + } else if (strcmp(returnType, @encode(float)) == 0) { + float floatValue; + [invocation getReturnValue:&floatValue]; + if (floatValue == FLT_MAX) { + *description = @"FLT_MAX"; + } else if (floatValue == FLT_MIN) { + *description = @"FLT_MIN"; + } else { + *description = [NSString stringWithFormat:@"%@", @(floatValue)]; + } + + } else if (strcmp(returnType, @encode(double)) == 0) { + double doubleValue; + [invocation getReturnValue:&doubleValue]; + if (doubleValue == DBL_MAX) { + *description = @"DBL_MAX"; + } else if (doubleValue == DBL_MIN) { + *description = @"DBL_MIN"; + } else { + *description = [NSString stringWithFormat:@"%@", @(doubleValue)]; + } + + } else if (strcmp(returnType, @encode(BOOL)) == 0) { + BOOL boolValue; + [invocation getReturnValue:&boolValue]; + *description = boolValue ? @"YES" : @"NO"; + + } else if (strcmp(returnType, @encode(SEL)) == 0) { + SEL selValue; + [invocation getReturnValue:&selValue]; + *description = [NSString stringWithFormat:@"SEL(%@)", NSStringFromSelector(selValue)]; + + } else if (strcmp(returnType, @encode(Class)) == 0) { + Class classValue; + [invocation getReturnValue:&classValue]; + *description = [NSString stringWithFormat:@"<%@>", NSStringFromClass(classValue)]; + + } else if (strcmp(returnType, @encode(CGPoint)) == 0) { + CGPoint targetValue; + [invocation getReturnValue:&targetValue]; + *description = NSStringFromCGPoint(targetValue); + + } else if (strcmp(returnType, @encode(CGVector)) == 0) { + CGVector targetValue; + [invocation getReturnValue:&targetValue]; + *description = NSStringFromCGVector(targetValue); + + } else if (strcmp(returnType, @encode(CGSize)) == 0) { + CGSize targetValue; + [invocation getReturnValue:&targetValue]; + *description = NSStringFromCGSize(targetValue); + + } else if (strcmp(returnType, @encode(CGRect)) == 0) { + CGRect rectValue; + [invocation getReturnValue:&rectValue]; + *description = NSStringFromCGRect(rectValue); + + } else if (strcmp(returnType, @encode(CGAffineTransform)) == 0) { + CGAffineTransform rectValue; + [invocation getReturnValue:&rectValue]; + *description = NSStringFromCGAffineTransform(rectValue); + + } else if (strcmp(returnType, @encode(UIEdgeInsets)) == 0) { + UIEdgeInsets targetValue; + [invocation getReturnValue:&targetValue]; + *description = NSStringFromUIEdgeInsets(targetValue); + + } else if (strcmp(returnType, @encode(UIOffset)) == 0) { + UIOffset targetValue; + [invocation getReturnValue:&targetValue]; + *description = NSStringFromUIOffset(targetValue); + + } else { + if (@available(iOS 11.0, tvOS 11.0, *)) { + if (strcmp(returnType, @encode(NSDirectionalEdgeInsets)) == 0) { + NSDirectionalEdgeInsets targetValue; + [invocation getReturnValue:&targetValue]; + *description = NSStringFromDirectionalEdgeInsets(targetValue); + return; + } + } + + NSString *argType_string = [[NSString alloc] lookin_safeInitWithUTF8String:returnType]; + if ([argType_string hasPrefix:@"@"] || [argType_string hasPrefix:@"^{"]) { + __unsafe_unretained id returnObjValue; + [invocation getReturnValue:&returnObjValue]; + + if (returnObjValue) { + *description = [NSString stringWithFormat:@"%@", returnObjValue]; + + LookinObject *parsedLookinObj = [LookinObject instanceWithObject:returnObjValue]; + *resultObject = parsedLookinObj; + } else { + *description = @"nil"; + } + } else { + *description = [NSString stringWithFormat:LKS_Localized(@"%@ was invoked successfully, but Lookin can't parse the return value:%@"), NSStringFromSelector(selector), argType_string]; + } + } +} + +- (void)_submitResponseWithError:(NSError *)error requestType:(uint32_t)requestType tag:(uint32_t)tag { + LookinConnectionResponseAttachment *attachment = [LookinConnectionResponseAttachment new]; + attachment.error = error; + [[LKS_ConnectionManager sharedInstance] respond:attachment requestType:requestType tag:tag]; +} + +- (void)_submitResponseWithData:(NSObject *)data requestType:(uint32_t)requestType tag:(uint32_t)tag { + LookinConnectionResponseAttachment *attachment = [LookinConnectionResponseAttachment new]; + attachment.data = data; + [[LKS_ConnectionManager sharedInstance] respond:attachment requestType:requestType tag:tag]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_AttrModificationPatchHandler.h b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_AttrModificationPatchHandler.h new file mode 100644 index 0000000..d1b621b --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_AttrModificationPatchHandler.h @@ -0,0 +1,26 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_AttrModificationPatchHandler.h +// LookinServer +// +// Created by Li Kai on 2019/6/12. +// https://lookin.work +// + +#import + +@class LookinDisplayItemDetail; + +@interface LKS_AttrModificationPatchHandler : NSObject + +/** + @param oids 数组内 idx 较小的应该为 displayItems 里的 subItem,idx 较大的应该为 superItem + @param lowImageQuality 是否采用低图像质量 + @param block 该 block 会被多次调用,其中 tasksTotalCount 是总的调用次数(即可被用来作为 TotalResponseCount) + */ ++ (void)handleLayerOids:(NSArray *)oids lowImageQuality:(BOOL)lowImageQuality block:(void (^)(LookinDisplayItemDetail *detail, NSUInteger tasksTotalCount, NSError *error))block; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_AttrModificationPatchHandler.m b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_AttrModificationPatchHandler.m new file mode 100644 index 0000000..bc1cbcd --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_AttrModificationPatchHandler.m @@ -0,0 +1,51 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_AttrModificationPatchHandler.m +// LookinServer +// +// Created by Li Kai on 2019/6/12. +// https://lookin.work +// + +#import "LKS_AttrModificationPatchHandler.h" +#import "LookinDisplayItemDetail.h" +#import "LookinServerDefines.h" + +@implementation LKS_AttrModificationPatchHandler + ++ (void)handleLayerOids:(NSArray *)oids lowImageQuality:(BOOL)lowImageQuality block:(void (^)(LookinDisplayItemDetail *detail, NSUInteger tasksTotalCount, NSError *error))block { + if (!block) { + NSAssert(NO, @""); + return; + } + if (![oids isKindOfClass:[NSArray class]]) { + block(nil, 1, LookinErr_Inner); + return; + } + + [oids enumerateObjectsUsingBlock:^(NSNumber * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + unsigned long oid = [obj unsignedLongValue]; + LookinDisplayItemDetail *detail = [LookinDisplayItemDetail new]; + detail.displayItemOid = oid; + + CALayer *layer = (CALayer *)[NSObject lks_objectWithOid:oid]; + if (![layer isKindOfClass:[CALayer class]]) { + block(nil, idx + 1, LookinErr_ObjNotFound); + *stop = YES; + return; + } + + if (idx == 0) { + detail.soloScreenshot = [layer lks_soloScreenshotWithLowQuality:lowImageQuality]; + detail.groupScreenshot = [layer lks_groupScreenshotWithLowQuality:lowImageQuality]; + } else { + detail.groupScreenshot = [layer lks_groupScreenshotWithLowQuality:lowImageQuality]; + } + block(detail, oids.count, nil); + }]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_CustomAttrModificationHandler.h b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_CustomAttrModificationHandler.h new file mode 100644 index 0000000..a35c899 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_CustomAttrModificationHandler.h @@ -0,0 +1,19 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LKS_CustomAttrModificationHandler.h +// LookinServer +// +// Created by likaimacbookhome on 2023/11/4. +// + +#import +#import "LookinCustomAttrModification.h" + +@interface LKS_CustomAttrModificationHandler : NSObject + +/// 返回值表示是否修改成功(有成功调用 setter block 就算成功) ++ (BOOL)handleModification:(LookinCustomAttrModification *)modification; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_CustomAttrModificationHandler.m b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_CustomAttrModificationHandler.m new file mode 100644 index 0000000..1935ef5 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_CustomAttrModificationHandler.m @@ -0,0 +1,155 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LKS_CustomAttrModificationHandler.m +// LookinServer +// +// Created by likaimacbookhome on 2023/11/4. +// + +#import "LKS_CustomAttrModificationHandler.h" +#import "LKS_CustomAttrSetterManager.h" +#import "UIColor+LookinServer.h" + +@implementation LKS_CustomAttrModificationHandler + ++ (BOOL)handleModification:(LookinCustomAttrModification *)modification { + if (!modification || modification.customSetterID.length == 0) { + return NO; + } + switch (modification.attrType) { + case LookinAttrTypeNSString: { + NSString *newValue = modification.value; + if (newValue != nil && ![newValue isKindOfClass:[NSString class]]) { + // nil 是合法的 + return NO; + } + LKS_StringSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getStringSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + setter(newValue); + return YES; + } + + case LookinAttrTypeDouble: { + NSNumber *newValue = modification.value; + if (![newValue isKindOfClass:[NSNumber class]]) { + return NO; + } + LKS_NumberSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getNumberSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + setter(newValue); + return YES; + } + + case LookinAttrTypeBOOL: { + NSNumber *newValue = modification.value; + if (![newValue isKindOfClass:[NSNumber class]]) { + return NO; + } + LKS_BoolSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getBoolSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + setter(newValue.boolValue); + return YES; + } + + case LookinAttrTypeUIColor: { + LKS_ColorSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getColorSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + + NSArray *newValue = modification.value; + if (newValue == nil) { + // nil 是合法的 + setter(nil); + return YES; + } + if (![newValue isKindOfClass:[NSArray class]]) { + return NO; + } + UIColor *color = [UIColor lks_colorFromRGBAComponents:newValue]; + if (!color) { + return NO; + } + setter(color); + return YES; + } + + case LookinAttrTypeEnumString: { + NSString *newValue = modification.value; + if (![newValue isKindOfClass:[NSString class]]) { + return NO; + } + LKS_EnumSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getEnumSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + setter(newValue); + return YES; + } + + case LookinAttrTypeCGRect: { + NSValue *newValue = modification.value; + if (![newValue isKindOfClass:[NSValue class]]) { + return NO; + } + LKS_RectSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getRectSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + setter(newValue.CGRectValue); + return YES; + } + + case LookinAttrTypeCGSize: { + NSValue *newValue = modification.value; + if (![newValue isKindOfClass:[NSValue class]]) { + return NO; + } + LKS_SizeSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getSizeSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + setter(newValue.CGSizeValue); + return YES; + } + + case LookinAttrTypeCGPoint: { + NSValue *newValue = modification.value; + if (![newValue isKindOfClass:[NSValue class]]) { + return NO; + } + LKS_PointSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getPointSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + setter(newValue.CGPointValue); + return YES; + } + + case LookinAttrTypeUIEdgeInsets: { + NSValue *newValue = modification.value; + if (![newValue isKindOfClass:[NSValue class]]) { + return NO; + } + LKS_InsetsSetter setter = [[LKS_CustomAttrSetterManager sharedInstance] getInsetsSetterWithID:modification.customSetterID]; + if (!setter) { + return NO; + } + setter(newValue.UIEdgeInsetsValue); + return YES; + } + + default: + return NO; + } +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_HierarchyDetailsHandler.h b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_HierarchyDetailsHandler.h new file mode 100644 index 0000000..0f2c56f --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_HierarchyDetailsHandler.h @@ -0,0 +1,30 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_HierarchyDetailsHandler.h +// LookinServer +// +// Created by Li Kai on 2019/6/20. +// https://lookin.work +// + +#import + +@class LookinDisplayItemDetail, LookinStaticAsyncUpdateTasksPackage; + +typedef void (^LKS_HierarchyDetailsHandler_ProgressBlock)(NSArray *details); +typedef void (^LKS_HierarchyDetailsHandler_FinishBlock)(void); + +@interface LKS_HierarchyDetailsHandler : NSObject + +/// packages 会按照 idx 从小到大的顺序被执行 +/// 全部任务完成时,finishBlock 会被调用 +/// 如果调用了 cancel,则 finishBlock 不会被执行 +- (void)startWithPackages:(NSArray *)packages block:(LKS_HierarchyDetailsHandler_ProgressBlock)progressBlock finishedBlock:(LKS_HierarchyDetailsHandler_FinishBlock)finishBlock; + +/// 取消所有任务 +- (void)cancel; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_HierarchyDetailsHandler.m b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_HierarchyDetailsHandler.m new file mode 100644 index 0000000..28999f9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_HierarchyDetailsHandler.m @@ -0,0 +1,148 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_HierarchyDetailsHandler.m +// LookinServer +// +// Created by Li Kai on 2019/6/20. +// https://lookin.work +// + +#import "LKS_HierarchyDetailsHandler.h" +#import "LookinDisplayItemDetail.h" +#import "LKS_AttrGroupsMaker.h" +#import "LookinStaticAsyncUpdateTask.h" +#import "LKS_ConnectionManager.h" +#import "LookinServerDefines.h" +#import "LKS_CustomAttrGroupsMaker.h" +#import "LKS_HierarchyDisplayItemsMaker.h" + +@interface LKS_HierarchyDetailsHandler () + +@property(nonatomic, strong) NSMutableArray *taskPackages; +/// 标识哪些 oid 已经拉取过 attrGroups 了 +@property(nonatomic, strong) NSMutableSet *attrGroupsSyncedOids; + +@property(nonatomic, copy) LKS_HierarchyDetailsHandler_ProgressBlock progressBlock; +@property(nonatomic, copy) LKS_HierarchyDetailsHandler_FinishBlock finishBlock; + +@end + +@implementation LKS_HierarchyDetailsHandler + +- (instancetype)init { + if (self = [super init]) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_handleConnectionDidEnd:) name:LKS_ConnectionDidEndNotificationName object:nil]; + + self.attrGroupsSyncedOids = [NSMutableSet set]; + } + return self; +} + +- (void)startWithPackages:(NSArray *)packages block:(LKS_HierarchyDetailsHandler_ProgressBlock)progressBlock finishedBlock:(LKS_HierarchyDetailsHandler_FinishBlock)finishBlock { + if (!progressBlock || !finishBlock) { + NSAssert(NO, @""); + return; + } + if (!packages.count) { + finishBlock(); + return; + } + self.taskPackages = [packages mutableCopy]; + self.progressBlock = progressBlock; + self.finishBlock = finishBlock; + + [UIView lks_rebuildGlobalInvolvedRawConstraints]; + + [self _dequeueAndHandlePackage]; +} + +- (void)cancel { + [self.taskPackages removeAllObjects]; +} + +- (void)_dequeueAndHandlePackage { + dispatch_async(dispatch_get_main_queue(), ^{ + LookinStaticAsyncUpdateTasksPackage *package = self.taskPackages.firstObject; + if (!package) { + self.finishBlock(); + return; + } + // NSLog(@"LookinServer - will handle tasks, count: %@", @(tasks.count)); + NSArray *details = [package.tasks lookin_map:^id(NSUInteger idx, LookinStaticAsyncUpdateTask *task) { + LookinDisplayItemDetail *itemDetail = [LookinDisplayItemDetail new]; + itemDetail.displayItemOid = task.oid; + + id object = [NSObject lks_objectWithOid:task.oid]; + if (!object || ![object isKindOfClass:[CALayer class]]) { + itemDetail.failureCode = -1; + return itemDetail; + } + + CALayer *layer = object; + + if (task.taskType == LookinStaticAsyncUpdateTaskTypeSoloScreenshot) { + UIImage *image = [layer lks_soloScreenshotWithLowQuality:NO]; + itemDetail.soloScreenshot = image; + } else if (task.taskType == LookinStaticAsyncUpdateTaskTypeGroupScreenshot) { + UIImage *image = [layer lks_groupScreenshotWithLowQuality:NO]; + itemDetail.groupScreenshot = image; + } + + BOOL shouldMakeAttr = [self queryIfShouldMakeAttrsFromTask:task]; + if (shouldMakeAttr) { + itemDetail.attributesGroupList = [LKS_AttrGroupsMaker attrGroupsForLayer:layer]; + + NSString *version = task.clientReadableVersion; + if (version.length > 0 && [version lookin_numbericOSVersion] >= 10004) { + LKS_CustomAttrGroupsMaker *maker = [[LKS_CustomAttrGroupsMaker alloc] initWithLayer:layer]; + [maker execute]; + itemDetail.customAttrGroupList = [maker getGroups]; + itemDetail.customDisplayTitle = [maker getCustomDisplayTitle]; + itemDetail.danceUISource = [maker getDanceUISource]; + } + [self.attrGroupsSyncedOids addObject:@(task.oid)]; + } + + if (task.needBasisVisualInfo) { + itemDetail.frameValue = [NSValue valueWithCGRect:layer.frame]; + itemDetail.boundsValue = [NSValue valueWithCGRect:layer.bounds]; + itemDetail.hiddenValue = [NSNumber numberWithBool:layer.isHidden]; + itemDetail.alphaValue = @(layer.opacity); + } + + if (task.needSubitems) { + itemDetail.subitems = [LKS_HierarchyDisplayItemsMaker subitemsOfLayer:layer]; + } + + return itemDetail; + }]; + self.progressBlock(details); + + [self.taskPackages removeObjectAtIndex:0]; + [self _dequeueAndHandlePackage]; + }); +} + +- (BOOL)queryIfShouldMakeAttrsFromTask:(LookinStaticAsyncUpdateTask *)task { + switch (task.attrRequest) { + case LookinDetailUpdateTaskAttrRequest_Automatic: { + BOOL alreadyMadeBefore = [self.attrGroupsSyncedOids containsObject:@(task.oid)]; + return !alreadyMadeBefore; + } + case LookinDetailUpdateTaskAttrRequest_Need: + return YES; + case LookinDetailUpdateTaskAttrRequest_NotNeed: + return NO; + } + NSAssert(NO, @""); + return YES; +} + +- (void)_handleConnectionDidEnd:(id)obj { + [self cancel]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_InbuiltAttrModificationHandler.h b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_InbuiltAttrModificationHandler.h new file mode 100644 index 0000000..481b466 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_InbuiltAttrModificationHandler.h @@ -0,0 +1,23 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_InbuiltAttrModificationHandler.h +// LookinServer +// +// Created by Li Kai on 2019/6/12. +// https://lookin.work +// + +#import + +@class LookinAttributeModification, LookinDisplayItemDetail, LookinStaticAsyncUpdateTask; + +@interface LKS_InbuiltAttrModificationHandler : NSObject + ++ (void)handleModification:(LookinAttributeModification *)modification completion:(void (^)(LookinDisplayItemDetail *data, NSError *error))completion; + ++ (void)handlePatchWithTasks:(NSArray *)tasks block:(void (^)(LookinDisplayItemDetail *data))block; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_InbuiltAttrModificationHandler.m b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_InbuiltAttrModificationHandler.m new file mode 100644 index 0000000..7911609 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Connection/RequestHandler/LKS_InbuiltAttrModificationHandler.m @@ -0,0 +1,255 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_InbuiltAttrModificationHandler.m +// LookinServer +// +// Created by Li Kai on 2019/6/12. +// https://lookin.work +// + +#import "LKS_InbuiltAttrModificationHandler.h" +#import "UIColor+LookinServer.h" +#import "LookinAttributeModification.h" +#import "LKS_AttrGroupsMaker.h" +#import "LookinDisplayItemDetail.h" +#import "LookinStaticAsyncUpdateTask.h" +#import "LookinServerDefines.h" +#import "LKS_CustomAttrGroupsMaker.h" + +@implementation LKS_InbuiltAttrModificationHandler + ++ (void)handleModification:(LookinAttributeModification *)modification completion:(void (^)(LookinDisplayItemDetail *data, NSError *error))completion { + if (!completion) { + NSAssert(NO, @""); + return; + } + if (!modification || ![modification isKindOfClass:[LookinAttributeModification class]]) { + completion(nil, LookinErr_Inner); + return; + } + + NSObject *receiver = [NSObject lks_objectWithOid:modification.targetOid]; + if (!receiver) { + completion(nil, LookinErr_ObjNotFound); + return; + } + + NSMethodSignature *setterSignature = [receiver methodSignatureForSelector:modification.setterSelector]; + NSInvocation *setterInvocation = [NSInvocation invocationWithMethodSignature:setterSignature]; + setterInvocation.target = receiver; + setterInvocation.selector = modification.setterSelector; + + if (setterSignature.numberOfArguments != 3 || ![receiver respondsToSelector:modification.setterSelector]) { + completion(nil, LookinErr_Inner); + return; + } + + switch (modification.attrType) { + case LookinAttrTypeNone: + case LookinAttrTypeVoid: { + completion(nil, LookinErr_Inner); + return; + } + case LookinAttrTypeChar: { + char expectedValue = [(NSNumber *)modification.value charValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeInt: + case LookinAttrTypeEnumInt: { + int expectedValue = [(NSNumber *)modification.value intValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeShort: { + short expectedValue = [(NSNumber *)modification.value shortValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeLong: + case LookinAttrTypeEnumLong: { + long expectedValue = [(NSNumber *)modification.value longValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeLongLong: { + long long expectedValue = [(NSNumber *)modification.value longLongValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeUnsignedChar: { + unsigned char expectedValue = [(NSNumber *)modification.value unsignedCharValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeUnsignedInt: { + unsigned int expectedValue = [(NSNumber *)modification.value unsignedIntValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeUnsignedShort: { + unsigned short expectedValue = [(NSNumber *)modification.value unsignedShortValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeUnsignedLong: { + unsigned long expectedValue = [(NSNumber *)modification.value unsignedLongValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeUnsignedLongLong: { + unsigned long long expectedValue = [(NSNumber *)modification.value unsignedLongLongValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeFloat: { + float expectedValue = [(NSNumber *)modification.value floatValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeDouble: { + double expectedValue = [(NSNumber *)modification.value doubleValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeBOOL: { + BOOL expectedValue = [(NSNumber *)modification.value boolValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeSel: { + SEL expectedValue = NSSelectorFromString(modification.value); + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeClass: { + Class expectedValue = NSClassFromString(modification.value); + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeCGPoint: { + CGPoint expectedValue = [(NSValue *)modification.value CGPointValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeCGVector: { + CGVector expectedValue = [(NSValue *)modification.value CGVectorValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeCGSize: { + CGSize expectedValue = [(NSValue *)modification.value CGSizeValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeCGRect: { + CGRect expectedValue = [(NSValue *)modification.value CGRectValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeCGAffineTransform: { + CGAffineTransform expectedValue = [(NSValue *)modification.value CGAffineTransformValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeUIEdgeInsets: { + UIEdgeInsets expectedValue = [(NSValue *)modification.value UIEdgeInsetsValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeUIOffset: { + UIOffset expectedValue = [(NSValue *)modification.value UIOffsetValue]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + break; + } + case LookinAttrTypeCustomObj: + case LookinAttrTypeNSString: { + NSObject *expectedValue = modification.value; + [setterInvocation setArgument:&expectedValue atIndex:2]; + [setterInvocation retainArguments]; + break; + } + case LookinAttrTypeUIColor: { + NSArray *rgba = modification.value; + UIColor *expectedValue = [UIColor lks_colorFromRGBAComponents:rgba]; + [setterInvocation setArgument:&expectedValue atIndex:2]; + [setterInvocation retainArguments]; + break; + } + default: { + completion(nil, LookinErr_Inner); + return; + } + } + + NSError *error = nil; + @try { + [setterInvocation invoke]; + } @catch (NSException *exception) { + NSString *errorMsg = [NSString stringWithFormat:LKS_Localized(@"<%@: %p>: an exception was raised when invoking %@. (%@)"), NSStringFromClass(receiver.class), receiver, NSStringFromSelector(modification.setterSelector), exception.reason]; + error = [NSError errorWithDomain:LookinErrorDomain code:LookinErrCode_Exception userInfo:@{NSLocalizedDescriptionKey:LKS_Localized(@"The modification may failed."), NSLocalizedRecoverySuggestionErrorKey:errorMsg}]; + } @finally { + + } + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + CALayer *layer = nil; + if ([receiver isKindOfClass:[CALayer class]]) { + layer = (CALayer *)receiver; + } else if ([receiver isKindOfClass:[UIView class]]) { + layer = ((UIView *)receiver).layer; + } else { + completion(nil, LookinErr_ObjNotFound); + return; + } + // 比如试图更改 frame 时,这个改动很有可能触发用户业务的 relayout,因此这时 dispatch 一下以确保拿到的 attrGroups 数据是最新的 + LookinDisplayItemDetail *detail = [LookinDisplayItemDetail new]; + detail.displayItemOid = modification.targetOid; + detail.attributesGroupList = [LKS_AttrGroupsMaker attrGroupsForLayer:layer]; + + NSString *version = modification.clientReadableVersion; + if (version.length > 0 && [version lookin_numbericOSVersion] >= 10004) { + LKS_CustomAttrGroupsMaker *maker = [[LKS_CustomAttrGroupsMaker alloc] initWithLayer:layer]; + [maker execute]; + detail.customAttrGroupList = [maker getGroups]; + } + + detail.frameValue = [NSValue valueWithCGRect:layer.frame]; + detail.boundsValue = [NSValue valueWithCGRect:layer.bounds]; + detail.hiddenValue = [NSNumber numberWithBool:layer.isHidden]; + detail.alphaValue = @(layer.opacity); + completion(detail, error); + }); +} + + ++ (void)handlePatchWithTasks:(NSArray *)tasks block:(void (^)(LookinDisplayItemDetail *data))block { + if (!block) { + NSAssert(NO, @""); + return; + } + [tasks enumerateObjectsUsingBlock:^(LookinStaticAsyncUpdateTask * _Nonnull task, NSUInteger idx, BOOL * _Nonnull stop) { + LookinDisplayItemDetail *itemDetail = [LookinDisplayItemDetail new]; + itemDetail.displayItemOid = task.oid; + id object = [NSObject lks_objectWithOid:task.oid]; + if (!object || ![object isKindOfClass:[CALayer class]]) { + block(itemDetail); + return; + } + + CALayer *layer = object; + if (task.taskType == LookinStaticAsyncUpdateTaskTypeSoloScreenshot) { + UIImage *image = [layer lks_soloScreenshotWithLowQuality:NO]; + itemDetail.soloScreenshot = image; + } else if (task.taskType == LookinStaticAsyncUpdateTaskTypeGroupScreenshot) { + UIImage *image = [layer lks_groupScreenshotWithLowQuality:NO]; + itemDetail.groupScreenshot = image; + } + block(itemDetail); + }]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/LookinServer.h b/Pods/LookinServer/Src/Main/Server/LookinServer.h new file mode 100644 index 0000000..408b431 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/LookinServer.h @@ -0,0 +1,17 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinServer.h +// LookinServer +// +// Created by Li Kai on 2019/7/20. +// https://lookin.work +// + +#ifndef LookinServer_h +#define LookinServer_h + + +#endif /* LookinServer_h */ + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKSConfigManager.h b/Pods/LookinServer/Src/Main/Server/Others/LKSConfigManager.h new file mode 100644 index 0000000..1eecebe --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKSConfigManager.h @@ -0,0 +1,26 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKSConfigManager.h +// LookinServer +// +// Created by likai.123 on 2023/1/10. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface LKSConfigManager : NSObject + ++ (NSArray *)collapsedClassList; + ++ (NSDictionary *)colorAlias; + ++ (BOOL)shouldCaptureScreenshotOfLayer:(CALayer *)layer; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKSConfigManager.m b/Pods/LookinServer/Src/Main/Server/Others/LKSConfigManager.m new file mode 100644 index 0000000..830866a --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKSConfigManager.m @@ -0,0 +1,195 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKSConfigManager.m +// LookinServer +// +// Created by likai.123 on 2023/1/10. +// + +#import "LKSConfigManager.h" +#import "NSArray+Lookin.h" +#import "CALayer+LookinServer.h" + +@implementation LKSConfigManager + ++ (NSArray *)collapsedClassList { + NSArray *result = [self queryCollapsedClassListWithClass:[NSObject class] selector:@"lookin_collapsedClassList"]; + if (result) { + return result; + } + + // Legacy logic. Deprecated. + Class configClass = NSClassFromString(@"LookinConfig"); + if (!configClass) { + return nil; + } + NSArray *legacyCodeResult = [self queryCollapsedClassListWithClass:configClass selector:@"collapsedClasses"]; + return legacyCodeResult; +} + ++ (NSArray *)queryCollapsedClassListWithClass:(Class)class selector:(NSString *)selectorName { + SEL selector = NSSelectorFromString(selectorName); + if (![class respondsToSelector:selector]) { + return nil; + } + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[class methodSignatureForSelector:selector]]; + [invocation setTarget:class]; + [invocation setSelector:selector]; + [invocation invoke]; + void *arrayValue; + [invocation getReturnValue:&arrayValue]; + id classList = (__bridge id)(arrayValue); + + if ([classList isKindOfClass:[NSArray class]]) { + NSArray *validClassList = [((NSArray *)classList) lookin_filter:^BOOL(id obj) { + return [obj isKindOfClass:[NSString class]]; + }]; + return [validClassList copy]; + } + return nil; +} + ++ (NSDictionary *)colorAlias { + NSDictionary *result = [self queryColorAliasWithClass:[NSObject class] selector:@"lookin_colorAlias"]; + if (result) { + return result; + } + + // Legacy logic. Deprecated. + Class configClass = NSClassFromString(@"LookinConfig"); + if (!configClass) { + return nil; + } + NSDictionary *legacyCodeResult = [self queryColorAliasWithClass:configClass selector:@"colors"]; + return legacyCodeResult; +} + ++ (NSDictionary *)queryColorAliasWithClass:(Class)class selector:(NSString *)selectorName { + SEL selector = NSSelectorFromString(selectorName); + if (![class respondsToSelector:selector]) { + return nil; + } + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[class methodSignatureForSelector:selector]]; + [invocation setTarget:class]; + [invocation setSelector:selector]; + [invocation invoke]; + void *dictValue; + [invocation getReturnValue:&dictValue]; + id colorAlias = (__bridge id)(dictValue); + + if ([colorAlias isKindOfClass:[NSDictionary class]]) { + NSMutableDictionary *validDictionary = [NSMutableDictionary dictionary]; + [(NSDictionary *)colorAlias enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { + if ([key isKindOfClass:[NSString class]]) { + if ([obj isKindOfClass:[UIColor class]]) { + [validDictionary setObject:obj forKey:key]; + + } else if ([obj isKindOfClass:[NSDictionary class]]) { + __block BOOL isValidSubDict = YES; + [((NSDictionary *)obj) enumerateKeysAndObjectsUsingBlock:^(id _Nonnull subKey, id _Nonnull subObj, BOOL * _Nonnull stop) { + if (![subKey isKindOfClass:[NSString class]] || ![subObj isKindOfClass:[UIColor class]]) { + isValidSubDict = NO; + *stop = YES; + } + }]; + if (isValidSubDict) { + [validDictionary setObject:obj forKey:key]; + } + } + } + }]; + return [validDictionary copy]; + } + return nil; +} + ++ (BOOL)shouldCaptureScreenshotOfLayer:(CALayer *)layer { + if (!layer) { + return YES; + } + if (![self shouldCaptureImageOfLayer:layer]) { + return NO; + } + UIView *view = layer.lks_hostView; + if (!view) { + return YES; + } + if (![self shouldCaptureImageOfView:view]) { + return NO; + } + return YES; +} + ++ (BOOL)shouldCaptureImageOfLayer:(CALayer *)layer { + if (!layer) { + return YES; + } + SEL selector = NSSelectorFromString(@"lookin_shouldCaptureImageOfLayer:"); + if ([NSObject respondsToSelector:selector]) { + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[NSObject methodSignatureForSelector:selector]]; + [invocation setTarget:[NSObject class]]; + [invocation setSelector:selector]; + [invocation setArgument:&layer atIndex:2]; + [invocation invoke]; + BOOL resultValue = YES; + [invocation getReturnValue:&resultValue]; + if (!resultValue) { + return NO; + } + } + + SEL selector2 = NSSelectorFromString(@"lookin_shouldCaptureImage"); + if ([layer respondsToSelector:selector2]) { + NSInvocation *invocation2 = [NSInvocation invocationWithMethodSignature:[layer methodSignatureForSelector:selector2]]; + [invocation2 setTarget:layer]; + [invocation2 setSelector:selector2]; + [invocation2 invoke]; + BOOL resultValue2 = YES; + [invocation2 getReturnValue:&resultValue2]; + if (!resultValue2) { + return NO; + } + } + + return YES; +} + ++ (BOOL)shouldCaptureImageOfView:(UIView *)view { + if (!view) { + return YES; + } + + SEL selector = NSSelectorFromString(@"lookin_shouldCaptureImageOfView:"); + if ([NSObject respondsToSelector:selector]) { + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[NSObject methodSignatureForSelector:selector]]; + [invocation setTarget:[NSObject class]]; + [invocation setSelector:selector]; + [invocation setArgument:&view atIndex:2]; + [invocation invoke]; + BOOL resultValue = YES; + [invocation getReturnValue:&resultValue]; + if (!resultValue) { + return NO; + } + } + + SEL selector2 = NSSelectorFromString(@"lookin_shouldCaptureImage"); + if ([view respondsToSelector:selector2]) { + NSInvocation *invocation2 = [NSInvocation invocationWithMethodSignature:[view methodSignatureForSelector:selector2]]; + [invocation2 setTarget:view]; + [invocation2 setSelector:selector2]; + [invocation2 invoke]; + BOOL resultValue2 = YES; + [invocation2 getReturnValue:&resultValue2]; + if (!resultValue2) { + return NO; + } + } + + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_AttrGroupsMaker.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_AttrGroupsMaker.h new file mode 100644 index 0000000..1902da2 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_AttrGroupsMaker.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_AttrGroupsMaker.h +// LookinServer +// +// Created by Li Kai on 2019/6/6. +// https://lookin.work +// + +#import "LookinDefines.h" + +@class LookinAttributesGroup; + +@interface LKS_AttrGroupsMaker : NSObject + ++ (NSArray *)attrGroupsForLayer:(CALayer *)layer; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_AttrGroupsMaker.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_AttrGroupsMaker.m new file mode 100644 index 0000000..c140f21 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_AttrGroupsMaker.m @@ -0,0 +1,302 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_AttrGroupsMaker.m +// LookinServer +// +// Created by Li Kai on 2019/6/6. +// https://lookin.work +// + +#import "LKS_AttrGroupsMaker.h" +#import "LookinAttributesGroup.h" +#import "LookinAttributesSection.h" +#import "LookinAttribute.h" +#import "LookinDashboardBlueprint.h" +#import "LookinIvarTrace.h" +#import "UIColor+LookinServer.h" +#import "LookinServerDefines.h" + +@implementation LKS_AttrGroupsMaker + ++ (NSArray *)attrGroupsForLayer:(CALayer *)layer { + if (!layer) { + NSAssert(NO, @""); + return nil; + } + NSArray *groups = [[LookinDashboardBlueprint groupIDs] lookin_map:^id(NSUInteger idx, LookinAttrGroupIdentifier groupID) { + LookinAttributesGroup *group = [LookinAttributesGroup new]; + group.identifier = groupID; + + NSArray *secIDs = [LookinDashboardBlueprint sectionIDsForGroupID:groupID]; + group.attrSections = [secIDs lookin_map:^id(NSUInteger idx, LookinAttrSectionIdentifier secID) { + LookinAttributesSection *sec = [LookinAttributesSection new]; + sec.identifier = secID; + + NSArray *attrIDs = [LookinDashboardBlueprint attrIDsForSectionID:secID]; + sec.attributes = [attrIDs lookin_map:^id(NSUInteger idx, LookinAttrIdentifier attrID) { + NSInteger minAvailableVersion = [LookinDashboardBlueprint minAvailableOSVersionWithAttrID:attrID]; + if (minAvailableVersion > 0 && (NSProcessInfo.processInfo.operatingSystemVersion.majorVersion < minAvailableVersion)) { + // iOS 版本过低不支持该属性 + return nil; + } + + id targetObj = nil; + if ([LookinDashboardBlueprint isUIViewPropertyWithAttrID:attrID]) { + targetObj = layer.lks_hostView; + } else { + targetObj = layer; + } + + if (targetObj) { + Class targetClass = NSClassFromString([LookinDashboardBlueprint classNameWithAttrID:attrID]); + if (![targetObj isKindOfClass:targetClass]) { + return nil; + } + + LookinAttribute *attr = [self _attributeWithIdentifer:attrID targetObject:targetObj]; + return attr; + } else { + return nil; + } + }]; + + if (sec.attributes.count) { + return sec; + } else { + return nil; + } + }]; + + if ([groupID isEqualToString:LookinAttrGroup_AutoLayout]) { + // 这里特殊处理一下,如果 AutoLayout 里面不包含 Constraints 的话(只有 Hugging 和 Resistance),就丢弃掉这整个 AutoLayout 不显示 + BOOL hasConstraits = [group.attrSections lookin_any:^BOOL(LookinAttributesSection *obj) { + return [obj.identifier isEqualToString:LookinAttrSec_AutoLayout_Constraints]; + }]; + if (!hasConstraits) { + return nil; + } + } + + if (group.attrSections.count) { + return group; + } else { + return nil; + } + }]; + + return groups; +} + ++ (LookinAttribute *)_attributeWithIdentifer:(LookinAttrIdentifier)identifier targetObject:(id)target { + if (!target) { + NSAssert(NO, @""); + return nil; + } + + LookinAttribute *attribute = [LookinAttribute new]; + attribute.identifier = identifier; + + SEL getter = [LookinDashboardBlueprint getterWithAttrID:identifier]; + if (!getter) { + NSAssert(NO, @""); + return nil; + } + if (![target respondsToSelector:getter]) { + // 比如某些 QMUI 的属性,不引入 QMUI 就会走到这个分支里 + return nil; + } + NSMethodSignature *signature = [target methodSignatureForSelector:getter]; + if (signature.numberOfArguments > 2) { + NSAssert(NO, @"getter 不可以有参数"); + return nil; + } + if (strcmp([signature methodReturnType], @encode(void)) == 0) { + NSAssert(NO, @"getter 返回值不能为 void"); + return nil; + } + + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + invocation.target = target; + invocation.selector = getter; + [invocation invoke]; + + const char *returnType = [signature methodReturnType]; + + if (strcmp(returnType, @encode(char)) == 0) { + char targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeChar; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(int)) == 0) { + int targetValue; + [invocation getReturnValue:&targetValue]; + attribute.value = @(targetValue); + if ([LookinDashboardBlueprint enumListNameWithAttrID:identifier]) { + attribute.attrType = LookinAttrTypeEnumInt; + } else { + attribute.attrType = LookinAttrTypeInt; + } + + } else if (strcmp(returnType, @encode(short)) == 0) { + short targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeShort; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(long)) == 0) { + long targetValue; + [invocation getReturnValue:&targetValue]; + attribute.value = @(targetValue); + if ([LookinDashboardBlueprint enumListNameWithAttrID:identifier]) { + attribute.attrType = LookinAttrTypeEnumLong; + } else { + attribute.attrType = LookinAttrTypeLong; + } + + } else if (strcmp(returnType, @encode(long long)) == 0) { + long long targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeLongLong; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(unsigned char)) == 0) { + unsigned char targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeUnsignedChar; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(unsigned int)) == 0) { + unsigned int targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeUnsignedInt; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(unsigned short)) == 0) { + unsigned short targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeUnsignedShort; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(unsigned long)) == 0) { + unsigned long targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeUnsignedLong; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(unsigned long long)) == 0) { + unsigned long long targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeUnsignedLongLong; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(float)) == 0) { + float targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeFloat; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(double)) == 0) { + double targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeDouble; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(BOOL)) == 0) { + BOOL targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeBOOL; + attribute.value = @(targetValue); + + } else if (strcmp(returnType, @encode(SEL)) == 0) { + SEL targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeSel; + attribute.value = NSStringFromSelector(targetValue); + + } else if (strcmp(returnType, @encode(Class)) == 0) { + Class targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeClass; + attribute.value = NSStringFromClass(targetValue); + + } else if (strcmp(returnType, @encode(CGPoint)) == 0) { + CGPoint targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeCGPoint; + attribute.value = [NSValue valueWithCGPoint:targetValue]; + + } else if (strcmp(returnType, @encode(CGVector)) == 0) { + CGVector targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeCGVector; + attribute.value = [NSValue valueWithCGVector:targetValue]; + + } else if (strcmp(returnType, @encode(CGSize)) == 0) { + CGSize targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeCGSize; + attribute.value = [NSValue valueWithCGSize:targetValue]; + + } else if (strcmp(returnType, @encode(CGRect)) == 0) { + CGRect targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeCGRect; + attribute.value = [NSValue valueWithCGRect:targetValue]; + + } else if (strcmp(returnType, @encode(CGAffineTransform)) == 0) { + CGAffineTransform targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeCGAffineTransform; + attribute.value = [NSValue valueWithCGAffineTransform:targetValue]; + + } else if (strcmp(returnType, @encode(UIEdgeInsets)) == 0) { + UIEdgeInsets targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeUIEdgeInsets; + attribute.value = [NSValue valueWithUIEdgeInsets:targetValue]; + + } else if (strcmp(returnType, @encode(UIOffset)) == 0) { + UIOffset targetValue; + [invocation getReturnValue:&targetValue]; + attribute.attrType = LookinAttrTypeUIOffset; + attribute.value = [NSValue valueWithUIOffset:targetValue]; + + } else { + NSString *argType_string = [[NSString alloc] lookin_safeInitWithUTF8String:returnType]; + if ([argType_string hasPrefix:@"@"]) { + __unsafe_unretained id returnObjValue; + [invocation getReturnValue:&returnObjValue]; + + if (!returnObjValue && [LookinDashboardBlueprint hideIfNilWithAttrID:identifier]) { + // 对于某些属性,若 value 为 nil 则不显示 + return nil; + } + + attribute.attrType = [LookinDashboardBlueprint objectAttrTypeWithAttrID:identifier]; + if (attribute.attrType == LookinAttrTypeUIColor) { + if (returnObjValue == nil) { + attribute.value = nil; + } else if ([returnObjValue isKindOfClass:[UIColor class]] && [returnObjValue respondsToSelector:@selector(lks_rgbaComponents)]) { + attribute.value = [returnObjValue lks_rgbaComponents]; + } else { + // https://github.com/QMUI/LookinServer/issues/124 + return nil; + } + } else { + attribute.value = returnObjValue; + } + + } else { + NSAssert(NO, @"不支持解析该类型的返回值"); + return nil; + } + } + + return attribute; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrGroupsMaker.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrGroupsMaker.h new file mode 100644 index 0000000..781711a --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrGroupsMaker.h @@ -0,0 +1,27 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LKS_CustomAttrGroupsMaker.h +// LookinServer +// +// Created by LikaiMacStudioWork on 2023/10/31. +// + +#import "LookinDefines.h" + +@class LookinAttributesGroup; + +@interface LKS_CustomAttrGroupsMaker : NSObject + +- (instancetype)initWithLayer:(CALayer *)layer; + +- (void)execute; + +- (NSArray *)getGroups; +- (NSString *)getCustomDisplayTitle; +- (NSString *)getDanceUISource; + ++ (NSArray *)makeGroupsFromRawProperties:(NSArray *)rawProperties saveCustomSetter:(BOOL)saveCustomSetter; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrGroupsMaker.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrGroupsMaker.m new file mode 100644 index 0000000..428b683 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrGroupsMaker.m @@ -0,0 +1,486 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LKS_CustomAttrGroupsMaker.m +// LookinServer +// +// Created by LikaiMacStudioWork on 2023/10/31. +// + +#import "LKS_CustomAttrGroupsMaker.h" +#import "LKS_AttrGroupsMaker.h" +#import "LookinAttributesGroup.h" +#import "LookinAttributesSection.h" +#import "LookinAttribute.h" +#import "LookinDashboardBlueprint.h" +#import "LookinIvarTrace.h" +#import "UIColor+LookinServer.h" +#import "LookinServerDefines.h" +#import "LKS_CustomAttrSetterManager.h" + +@interface LKS_CustomAttrGroupsMaker () + +/// key 是 section title +@property(nonatomic, strong) NSMutableDictionary *> *sectionAndAttrs; + +@property(nonatomic, copy) NSString *resolvedCustomDisplayTitle; +@property(nonatomic, copy) NSString *resolvedDanceUISource; +@property(nonatomic, strong) NSMutableArray *resolvedGroups; + +@property(nonatomic, weak) CALayer *layer; + +@end + +@implementation LKS_CustomAttrGroupsMaker + +- (instancetype)initWithLayer:(CALayer *)layer { + if (self = [super init]) { + self.sectionAndAttrs = [NSMutableDictionary dictionary]; + self.layer = layer; + } + return self; +} + +- (void)execute { + if (!self.layer) { + NSAssert(NO, @""); + return; + } + NSMutableArray *selectors = [NSMutableArray array]; + [selectors addObject:@"lookin_customDebugInfos"]; + for (int i = 0; i < 5; i++) { + [selectors addObject:[NSString stringWithFormat:@"lookin_customDebugInfos_%@", @(i)]]; + } + + for (NSString *name in selectors) { + [self makeAttrsForViewOrLayer:self.layer selectorName:name]; + + UIView *view = self.layer.lks_hostView; + if (view) { + [self makeAttrsForViewOrLayer:view selectorName:name]; + } + } + + if ([self.sectionAndAttrs count] == 0) { + return; + } + NSMutableArray *groups = [NSMutableArray array]; + [self.sectionAndAttrs enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull groupTitle, NSMutableArray * _Nonnull attrs, BOOL * _Nonnull stop) { + LookinAttributesGroup *group = [LookinAttributesGroup new]; + group.userCustomTitle = groupTitle; + group.identifier = LookinAttrGroup_UserCustom; + + NSMutableArray *sections = [NSMutableArray array]; + [attrs enumerateObjectsUsingBlock:^(LookinAttribute * _Nonnull attr, NSUInteger idx, BOOL * _Nonnull stop) { + LookinAttributesSection *sec = [LookinAttributesSection new]; + sec.identifier = LookinAttrSec_UserCustom; + sec.attributes = @[attr]; + [sections addObject:sec]; + }]; + + group.attrSections = sections; + [groups addObject:group]; + }]; + [groups sortedArrayUsingComparator:^NSComparisonResult(LookinAttributesGroup *obj1, LookinAttributesGroup *obj2) { + return [obj1.userCustomTitle compare:obj2.userCustomTitle]; + }]; + + self.resolvedGroups = groups; +} + +- (void)makeAttrsForViewOrLayer:(id)viewOrLayer selectorName:(NSString *)selectorName { + if (!viewOrLayer || !selectorName.length) { + return; + } + if (![viewOrLayer isKindOfClass:[UIView class]] && ![viewOrLayer isKindOfClass:[CALayer class]]) { + return; + } + SEL selector = NSSelectorFromString(selectorName); + if (![viewOrLayer respondsToSelector:selector]) { + return; + } + NSMethodSignature *signature = [viewOrLayer methodSignatureForSelector:selector]; + if (signature.numberOfArguments > 2) { + NSAssert(NO, @"LookinServer - There should be no explicit parameters."); + return; + } + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setTarget:viewOrLayer]; + [invocation setSelector:selector]; + [invocation invoke]; + + // 小心这里的内存管理 + NSDictionary * __unsafe_unretained tempRawData; + [invocation getReturnValue:&tempRawData]; + if (!tempRawData || ![tempRawData isKindOfClass:[NSDictionary class]]) { + return; + } + + NSDictionary *rawData = tempRawData; + NSArray *rawProperties = rawData[@"properties"]; + + NSString *customTitle = rawData[@"title"]; + if (customTitle && [customTitle isKindOfClass:[NSString class]] && customTitle.length > 0) { + self.resolvedCustomDisplayTitle = customTitle; + } + + NSString *danceSource = rawData[@"lookin_source"]; + if (danceSource && [danceSource isKindOfClass:[NSString class]] && danceSource.length > 0) { + self.resolvedDanceUISource = danceSource; + } + + [self makeAttrsFromRawProperties:rawProperties]; +} + +- (void)makeAttrsFromRawProperties:(NSArray *)rawProperties { + if (!rawProperties || ![rawProperties isKindOfClass:[NSArray class]]) { + return; + } + + for (NSDictionary *dict in rawProperties) { + NSString *groupTitle; + LookinAttribute *attr = [LKS_CustomAttrGroupsMaker attrFromRawDict:dict saveCustomSetter:YES groupTitle:&groupTitle]; + if (!attr) { + continue; + } + if (!self.sectionAndAttrs[groupTitle]) { + self.sectionAndAttrs[groupTitle] = [NSMutableArray array]; + } + [self.sectionAndAttrs[groupTitle] addObject:attr]; + } +} + ++ (LookinAttribute *)attrFromRawDict:(NSDictionary *)dict saveCustomSetter:(BOOL)saveCustomSetter groupTitle:(inout NSString **)inoutGroupTitle { + LookinAttribute *attr = [LookinAttribute new]; + attr.identifier = LookinAttr_UserCustom; + + NSString *title = dict[@"title"]; + NSString *type = dict[@"valueType"]; + NSString *section = dict[@"section"]; + id value = dict[@"value"]; + + if (!title || ![title isKindOfClass:[NSString class]]) { + NSLog(@"LookinServer - Wrong title"); + return nil; + } + if (!type || ![type isKindOfClass:[NSString class]]) { + NSLog(@"LookinServer - Wrong valueType"); + return nil; + } + if (!section || ![section isKindOfClass:[NSString class]] || section.length == 0) { + *inoutGroupTitle = @"Custom"; + } else { + *inoutGroupTitle = section; + } + + attr.displayTitle = title; + + NSString *fixedType = type.lowercaseString; + if ([fixedType isEqualToString:@"string"]) { + if (value != nil && ![value isKindOfClass:[NSString class]]) { + // nil 是合法的 + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeNSString; + attr.value = value; + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_StringSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] saveStringSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"number"]) { + if (value == nil) { + NSLog(@"LookinServer - No value."); + return nil; + } + if (![value isKindOfClass:[NSNumber class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeDouble; + attr.value = value; + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_NumberSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] saveNumberSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"bool"]) { + if (value == nil) { + NSLog(@"LookinServer - No value."); + return nil; + } + if (![value isKindOfClass:[NSNumber class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeBOOL; + attr.value = value; + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_BoolSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] saveBoolSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"color"]) { + if (value != nil && ![value isKindOfClass:[UIColor class]]) { + // nil 是合法的 + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeUIColor; + attr.value = [(UIColor *)value lks_rgbaComponents]; + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_ColorSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] saveColorSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"rect"]) { + if (value == nil) { + NSLog(@"LookinServer - No value."); + return nil; + } + if (![value isKindOfClass:[NSValue class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeCGRect; + attr.value = value; + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_RectSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] saveRectSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"size"]) { + if (value == nil) { + NSLog(@"LookinServer - No value."); + return nil; + } + if (![value isKindOfClass:[NSValue class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeCGSize; + attr.value = value; + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_SizeSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] saveSizeSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"point"]) { + if (value == nil) { + NSLog(@"LookinServer - No value."); + return nil; + } + if (![value isKindOfClass:[NSValue class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeCGPoint; + attr.value = value; + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_PointSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] savePointSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"insets"]) { + if (value == nil) { + NSLog(@"LookinServer - No value."); + return nil; + } + if (![value isKindOfClass:[NSValue class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeUIEdgeInsets; + attr.value = value; + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_InsetsSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] saveInsetsSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"shadow"]) { + if (value == nil) { + NSLog(@"LookinServer - No value."); + return nil; + } + if (![value isKindOfClass:[NSDictionary class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + NSDictionary *shadowInfo = value; + if (![shadowInfo[@"offset"] isKindOfClass:[NSValue class]]) { + NSLog(@"LookinServer - Wrong value. No offset."); + return nil; + } + if (![shadowInfo[@"opacity"] isKindOfClass:[NSNumber class]]) { + NSLog(@"LookinServer - Wrong value. No opacity."); + return nil; + } + if (![shadowInfo[@"radius"] isKindOfClass:[NSNumber class]]) { + NSLog(@"LookinServer - Wrong value. No radius."); + return nil; + } + NSMutableDictionary *checkedShadowInfo = [@{ + @"offset": shadowInfo[@"offset"], + @"opacity": shadowInfo[@"opacity"], + @"radius": shadowInfo[@"radius"] + } mutableCopy]; + if ([shadowInfo[@"color"] isKindOfClass:[UIColor class]]) { + checkedShadowInfo[@"color"] = [(UIColor *)shadowInfo[@"color"] lks_rgbaComponents]; + } + + attr.attrType = LookinAttrTypeShadow; + attr.value = checkedShadowInfo; + + return attr; + } + + if ([fixedType isEqualToString:@"enum"]) { + if (value == nil) { + NSLog(@"LookinServer - No value."); + return nil; + } + if (![value isKindOfClass:[NSString class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeEnumString; + attr.value = value; + + NSArray *allEnumCases = dict[@"allEnumCases"]; + if ([allEnumCases isKindOfClass:[NSArray class]]) { + attr.extraValue = allEnumCases; + } + + if (saveCustomSetter && dict[@"retainedSetter"]) { + NSString *uniqueID = [[NSUUID new] UUIDString]; + LKS_EnumSetter setter = dict[@"retainedSetter"]; + [[LKS_CustomAttrSetterManager sharedInstance] saveEnumSetter:setter uniqueID:uniqueID]; + attr.customSetterID = uniqueID; + } + + return attr; + } + + if ([fixedType isEqualToString:@"json"]) { + if (![value isKindOfClass:[NSString class]]) { + NSLog(@"LookinServer - Wrong value type."); + return nil; + } + attr.attrType = LookinAttrTypeJson; + attr.value = value; + + return attr; + } + + NSLog(@"LookinServer - Unsupported value type."); + return nil; +} + +- (NSArray *)getGroups { + return self.resolvedGroups; +} + +- (NSString *)getCustomDisplayTitle { + return self.resolvedCustomDisplayTitle; +} + +- (NSString *)getDanceUISource { + return self.resolvedDanceUISource; +} + ++ (NSArray *)makeGroupsFromRawProperties:(NSArray *)rawProperties saveCustomSetter:(BOOL)saveCustomSetter { + if (!rawProperties || ![rawProperties isKindOfClass:[NSArray class]]) { + return nil; + } + // key 是 group title + NSMutableDictionary *> *groupTitleAndAttrs = [NSMutableDictionary dictionary]; + + for (NSDictionary *dict in rawProperties) { + NSString *groupTitle; + LookinAttribute *attr = [LKS_CustomAttrGroupsMaker attrFromRawDict:dict saveCustomSetter:saveCustomSetter groupTitle:&groupTitle]; + if (!attr) { + continue; + } + if (!groupTitleAndAttrs[groupTitle]) { + groupTitleAndAttrs[groupTitle] = [NSMutableArray array]; + } + [groupTitleAndAttrs[groupTitle] addObject:attr]; + } + + if ([groupTitleAndAttrs count] == 0) { + return nil; + } + NSMutableArray *groups = [NSMutableArray array]; + [groupTitleAndAttrs enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull groupTitle, NSMutableArray * _Nonnull attrs, BOOL * _Nonnull stop) { + LookinAttributesGroup *group = [LookinAttributesGroup new]; + group.userCustomTitle = groupTitle; + group.identifier = LookinAttrGroup_UserCustom; + + NSMutableArray *sections = [NSMutableArray array]; + [attrs enumerateObjectsUsingBlock:^(LookinAttribute * _Nonnull attr, NSUInteger idx, BOOL * _Nonnull stop) { + LookinAttributesSection *sec = [LookinAttributesSection new]; + sec.identifier = LookinAttrSec_UserCustom; + sec.attributes = @[attr]; + [sections addObject:sec]; + }]; + + group.attrSections = sections; + [groups addObject:group]; + }]; + [groups sortedArrayUsingComparator:^NSComparisonResult(LookinAttributesGroup *obj1, LookinAttributesGroup *obj2) { + return [obj1.userCustomTitle compare:obj2.userCustomTitle]; + }]; + return [groups copy]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrSetterManager.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrSetterManager.h new file mode 100644 index 0000000..7fccc77 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrSetterManager.h @@ -0,0 +1,56 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LKS_CustomAttrSetterManager.h +// LookinServer +// +// Created by likai.123 on 2023/11/4. +// + +#import + +typedef void(^LKS_StringSetter)(NSString *); +typedef void(^LKS_NumberSetter)(NSNumber *); +typedef void(^LKS_BoolSetter)(BOOL); +typedef void(^LKS_ColorSetter)(UIColor *); +typedef void(^LKS_EnumSetter)(NSString *); +typedef void(^LKS_RectSetter)(CGRect); +typedef void(^LKS_SizeSetter)(CGSize); +typedef void(^LKS_PointSetter)(CGPoint); +typedef void(^LKS_InsetsSetter)(UIEdgeInsets); + +@interface LKS_CustomAttrSetterManager : NSObject + ++ (instancetype)sharedInstance; + +- (void)removeAll; + +- (void)saveStringSetter:(LKS_StringSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_StringSetter)getStringSetterWithID:(NSString *)uniqueID; + +- (void)saveNumberSetter:(LKS_NumberSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_NumberSetter)getNumberSetterWithID:(NSString *)uniqueID; + +- (void)saveBoolSetter:(LKS_BoolSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_BoolSetter)getBoolSetterWithID:(NSString *)uniqueID; + +- (void)saveColorSetter:(LKS_ColorSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_ColorSetter)getColorSetterWithID:(NSString *)uniqueID; + +- (void)saveEnumSetter:(LKS_EnumSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_EnumSetter)getEnumSetterWithID:(NSString *)uniqueID; + +- (void)saveRectSetter:(LKS_RectSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_RectSetter)getRectSetterWithID:(NSString *)uniqueID; + +- (void)saveSizeSetter:(LKS_SizeSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_SizeSetter)getSizeSetterWithID:(NSString *)uniqueID; + +- (void)savePointSetter:(LKS_PointSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_PointSetter)getPointSetterWithID:(NSString *)uniqueID; + +- (void)saveInsetsSetter:(LKS_InsetsSetter)setter uniqueID:(NSString *)uniqueID; +- (LKS_InsetsSetter)getInsetsSetterWithID:(NSString *)uniqueID; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrSetterManager.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrSetterManager.m new file mode 100644 index 0000000..20b73c9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomAttrSetterManager.m @@ -0,0 +1,117 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LKS_CustomAttrSetterManager.m +// LookinServer +// +// Created by likai.123 on 2023/11/4. +// + +#import "LKS_CustomAttrSetterManager.h" + +@interface LKS_CustomAttrSetterManager () + +@property(nonatomic, strong) NSMutableDictionary *settersMap; + +@end + +@implementation LKS_CustomAttrSetterManager + ++ (instancetype)sharedInstance { + static dispatch_once_t onceToken; + static LKS_CustomAttrSetterManager *instance = nil; + dispatch_once(&onceToken,^{ + instance = [[super allocWithZone:NULL] init]; + }); + return instance; +} + ++ (id)allocWithZone:(struct _NSZone *)zone { + return [self sharedInstance]; +} + +- (instancetype)init { + self = [super init]; + if (self) { + self.settersMap = [NSMutableDictionary new]; + } + return self; +} + +- (void)removeAll { + [self.settersMap removeAllObjects]; +} + +- (void)saveStringSetter:(nonnull LKS_StringSetter)setter uniqueID:(nonnull NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (nullable LKS_StringSetter)getStringSetterWithID:(nonnull NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +- (void)saveNumberSetter:(LKS_NumberSetter)setter uniqueID:(NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (nullable LKS_NumberSetter)getNumberSetterWithID:(NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +- (void)saveBoolSetter:(LKS_BoolSetter)setter uniqueID:(NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (LKS_BoolSetter)getBoolSetterWithID:(NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +- (void)saveColorSetter:(LKS_ColorSetter)setter uniqueID:(NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (LKS_ColorSetter)getColorSetterWithID:(NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +- (void)saveEnumSetter:(LKS_EnumSetter)setter uniqueID:(NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (LKS_EnumSetter)getEnumSetterWithID:(NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +- (void)saveRectSetter:(LKS_RectSetter)setter uniqueID:(NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (LKS_RectSetter)getRectSetterWithID:(NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +- (void)saveSizeSetter:(LKS_SizeSetter)setter uniqueID:(NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (LKS_SizeSetter)getSizeSetterWithID:(NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +- (void)savePointSetter:(LKS_PointSetter)setter uniqueID:(NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (LKS_PointSetter)getPointSetterWithID:(NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +- (void)saveInsetsSetter:(LKS_InsetsSetter)setter uniqueID:(NSString *)uniqueID { + self.settersMap[uniqueID] = setter; +} + +- (LKS_InsetsSetter)getInsetsSetterWithID:(NSString *)uniqueID { + return self.settersMap[uniqueID]; +} + +@end +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomDisplayItemsMaker.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomDisplayItemsMaker.h new file mode 100644 index 0000000..7cf658e --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomDisplayItemsMaker.h @@ -0,0 +1,22 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_CustomDisplayItemsMaker.h +// LookinServer +// +// Created by likai.123 on 2023/11/1. +// + +#import + +@class LookinDisplayItem; + +@interface LKS_CustomDisplayItemsMaker : NSObject + +- (instancetype)initWithLayer:(CALayer *)layer saveAttrSetter:(BOOL)saveAttrSetter; + +- (NSArray *)make; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomDisplayItemsMaker.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomDisplayItemsMaker.m new file mode 100644 index 0000000..bdffcfc --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_CustomDisplayItemsMaker.m @@ -0,0 +1,144 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_CustomDisplayItemsMaker.m +// LookinServer +// +// Created by likai.123 on 2023/11/1. +// + +#import "LKS_CustomDisplayItemsMaker.h" +#import "CALayer+LookinServer.h" +#import "LookinDisplayItem.h" +#import "NSArray+Lookin.h" +#import "LKS_CustomAttrGroupsMaker.h" + +@interface LKS_CustomDisplayItemsMaker () + +@property(nonatomic, weak) CALayer *layer; +@property(nonatomic, assign) BOOL saveAttrSetter; +@property(nonatomic, strong) NSMutableArray *allSubitems; + +@end + +@implementation LKS_CustomDisplayItemsMaker + +- (instancetype)initWithLayer:(CALayer *)layer saveAttrSetter:(BOOL)saveAttrSetter { + if (self = [super init]) { + self.layer = layer; + self.saveAttrSetter = saveAttrSetter; + self.allSubitems = [NSMutableArray array]; + } + return self; +} + +- (NSArray *)make { + if (!self.layer) { + NSAssert(NO, @""); + return nil; + } + NSMutableArray *selectors = [NSMutableArray array]; + [selectors addObject:@"lookin_customDebugInfos"]; + for (int i = 0; i < 5; i++) { + [selectors addObject:[NSString stringWithFormat:@"lookin_customDebugInfos_%@", @(i)]]; + } + + for (NSString *name in selectors) { + [self makeSubitemsForViewOrLayer:self.layer selectorName:name]; + + UIView *view = self.layer.lks_hostView; + if (view) { + [self makeSubitemsForViewOrLayer:view selectorName:name]; + } + } + + if (self.allSubitems.count) { + return self.allSubitems; + } else { + return nil; + } +} + +- (void)makeSubitemsForViewOrLayer:(id)viewOrLayer selectorName:(NSString *)selectorName { + if (!viewOrLayer || !selectorName.length) { + return; + } + if (![viewOrLayer isKindOfClass:[UIView class]] && ![viewOrLayer isKindOfClass:[CALayer class]]) { + return; + } + SEL selector = NSSelectorFromString(selectorName); + if (![viewOrLayer respondsToSelector:selector]) { + return; + } + NSMethodSignature *signature = [viewOrLayer methodSignatureForSelector:selector]; + if (signature.numberOfArguments > 2) { + NSAssert(NO, @"LookinServer - There should be no explicit parameters."); + return; + } + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; + [invocation setTarget:viewOrLayer]; + [invocation setSelector:selector]; + [invocation invoke]; + + // 小心这里的内存管理 + NSDictionary * __unsafe_unretained tempRawData; + [invocation getReturnValue:&tempRawData]; + NSDictionary *rawData = tempRawData; + + [self makeSubitemsFromRawData:rawData]; +} + +- (void)makeSubitemsFromRawData:(NSDictionary *)data { + if (!data || ![data isKindOfClass:[NSDictionary class]]) { + return; + } + NSArray *rawSubviews = data[@"subviews"]; + NSArray *newSubitems = [self displayItemsFromRawArray:rawSubviews]; + if (newSubitems) { + [self.allSubitems addObjectsFromArray:newSubitems]; + } +} + +- (NSArray *)displayItemsFromRawArray:(NSArray *)rawArray { + if (!rawArray || ![rawArray isKindOfClass:[NSArray class]]) { + return nil; + } + NSArray *items = [rawArray lookin_map:^id(NSUInteger idx, NSDictionary *rawDict) { + if (![rawDict isKindOfClass:[NSDictionary class]]) { + return nil; + } + return [self displayItemFromRawDict:rawDict]; + }]; + return items; +} + +- (LookinDisplayItem *)displayItemFromRawDict:(NSDictionary *)dict { + NSString *title = dict[@"title"]; + NSString *subtitle = dict[@"subtitle"]; + NSValue *frameValue = dict[@"frameInWindow"]; + NSArray *properties = dict[@"properties"]; + NSArray *subviews = dict[@"subviews"]; + NSString *danceSource = dict[@"lookin_source"]; + + if (![title isKindOfClass:[NSString class]]) { + return nil; + } + LookinDisplayItem *newItem = [LookinDisplayItem new]; + if (subviews && [subviews isKindOfClass:[NSArray class]]) { + newItem.subitems = [self displayItemsFromRawArray:subviews]; + } + newItem.isHidden = NO; + newItem.alpha = 1.0; + newItem.customInfo = [LookinCustomDisplayItemInfo new]; + newItem.customInfo.title = title; + newItem.customInfo.subtitle = subtitle; + newItem.customInfo.frameInWindow = frameValue; + newItem.customInfo.danceuiSource = danceSource; + newItem.customAttrGroupList = [LKS_CustomAttrGroupsMaker makeGroupsFromRawProperties:properties saveCustomSetter:self.saveAttrSetter]; + + return newItem; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_EventHandlerMaker.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_EventHandlerMaker.h new file mode 100644 index 0000000..cc12c49 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_EventHandlerMaker.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_EventHandlerMaker.h +// LookinServer +// +// Created by Li Kai on 2019/8/7. +// https://lookin.work +// + +#import "LookinDefines.h" + +@class LookinEventHandler; + +@interface LKS_EventHandlerMaker : NSObject + ++ (NSArray *)makeForView:(UIView *)view; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_EventHandlerMaker.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_EventHandlerMaker.m new file mode 100644 index 0000000..200543e --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_EventHandlerMaker.m @@ -0,0 +1,215 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_EventHandlerMaker.m +// LookinServer +// +// Created by Li Kai on 2019/8/7. +// https://lookin.work +// + +#import "LKS_EventHandlerMaker.h" +#import "LookinTuple.h" +#import "LookinEventHandler.h" +#import "LookinObject.h" +#import "LookinWeakContainer.h" +#import "LookinIvarTrace.h" +#import "LookinServerDefines.h" +#import "LKS_GestureTargetActionsSearcher.h" +#import "LKS_MultiplatformAdapter.h" + +@implementation LKS_EventHandlerMaker + ++ (NSArray *)makeForView:(UIView *)view { + if (!view) { + return nil; + } + + NSMutableArray *allHandlers = nil; + + if ([view isKindOfClass:[UIControl class]]) { + NSArray *targetActionHandlers = [self _targetActionHandlersForControl:(UIControl *)view]; + if (targetActionHandlers.count) { + if (!allHandlers) { + allHandlers = [NSMutableArray array]; + } + [allHandlers addObjectsFromArray:targetActionHandlers]; + } + } + + NSArray *gestureHandlers = [self _gestureHandlersForView:view]; + if (gestureHandlers.count) { + if (!allHandlers) { + allHandlers = [NSMutableArray array]; + } + [allHandlers addObjectsFromArray:gestureHandlers]; + } + + return allHandlers.copy; +} + ++ (NSArray *)_gestureHandlersForView:(UIView *)view { + if (view.gestureRecognizers.count == 0) { + return nil; + } + NSArray *handlers = [view.gestureRecognizers lookin_map:^id(NSUInteger idx, __kindof UIGestureRecognizer *recognizer) { + LookinEventHandler *handler = [LookinEventHandler new]; + handler.handlerType = LookinEventHandlerTypeGesture; + handler.eventName = NSStringFromClass([recognizer class]); + + NSArray *targetActionInfos = [LKS_GestureTargetActionsSearcher getTargetActionsFromRecognizer:recognizer]; + handler.targetActions = [targetActionInfos lookin_map:^id(NSUInteger idx, LookinTwoTuple *rawTuple) { + NSObject *target = ((LookinWeakContainer *)rawTuple.first).object; + if (!target) { + // 该 target 已被释放 + return nil; + } + LookinStringTwoTuple *newTuple = [LookinStringTwoTuple new]; + newTuple.first = [LKS_Helper descriptionOfObject:target]; + newTuple.second = (NSString *)rawTuple.second; + return newTuple; + }]; + handler.inheritedRecognizerName = [self _inheritedRecognizerNameForRecognizer:recognizer]; + handler.gestureRecognizerIsEnabled = recognizer.enabled; + if (recognizer.delegate) { + handler.gestureRecognizerDelegator = [LKS_Helper descriptionOfObject:recognizer.delegate]; + } + handler.recognizerIvarTraces = [recognizer.lks_ivarTraces lookin_map:^id(NSUInteger idx, LookinIvarTrace *trace) { + return [NSString stringWithFormat:@"(%@ *) -> %@", trace.hostClassName, trace.ivarName]; + }]; + + handler.recognizerOid = [recognizer lks_registerOid]; + return handler; + }]; + return handlers; +} + ++ (NSString *)_inheritedRecognizerNameForRecognizer:(UIGestureRecognizer *)recognizer { + if (!recognizer) { + NSAssert(NO, @""); + return nil; + } + + static NSArray *baseRecognizers; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // 注意这里 UIScreenEdgePanGestureRecognizer 在 UIPanGestureRecognizer 前面,因为 UIScreenEdgePanGestureRecognizer 继承于 UIPanGestureRecognizer +#if TARGET_OS_TV + baseRecognizers = @[[UILongPressGestureRecognizer class], + [UIPanGestureRecognizer class], + [UISwipeGestureRecognizer class], + [UITapGestureRecognizer class]]; +#elif TARGET_OS_VISION + baseRecognizers = @[[UILongPressGestureRecognizer class], + [UIPanGestureRecognizer class], + [UISwipeGestureRecognizer class], + [UIRotationGestureRecognizer class], + [UIPinchGestureRecognizer class], + [UITapGestureRecognizer class]]; +#else + baseRecognizers = @[[UILongPressGestureRecognizer class], + [UIScreenEdgePanGestureRecognizer class], + [UIPanGestureRecognizer class], + [UISwipeGestureRecognizer class], + [UIRotationGestureRecognizer class], + [UIPinchGestureRecognizer class], + [UITapGestureRecognizer class]]; +#endif + + }); + + __block NSString *result = @"UIGestureRecognizer"; + [baseRecognizers enumerateObjectsUsingBlock:^(Class _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([recognizer isMemberOfClass:obj]) { + // 自身就是基本款,则直接置为 nil + result = nil; + *stop = YES; + return; + } + if ([recognizer isKindOfClass:obj]) { + result = NSStringFromClass(obj); + *stop = YES; + return; + } + }]; + return result; +} + ++ (NSArray *)_targetActionHandlersForControl:(UIControl *)control { + static dispatch_once_t onceToken; + static NSArray *allEvents = nil; + dispatch_once(&onceToken,^{ + allEvents = @[@(UIControlEventTouchDown), @(UIControlEventTouchDownRepeat), @(UIControlEventTouchDragInside), @(UIControlEventTouchDragOutside), @(UIControlEventTouchDragEnter), @(UIControlEventTouchDragExit), @(UIControlEventTouchUpInside), @(UIControlEventTouchUpOutside), @(UIControlEventTouchCancel), @(UIControlEventValueChanged), @(UIControlEventEditingDidBegin), @(UIControlEventEditingChanged), @(UIControlEventEditingDidEnd), @(UIControlEventEditingDidEndOnExit)]; + if (@available(iOS 9.0, *)) { + allEvents = [allEvents arrayByAddingObject:@(UIControlEventPrimaryActionTriggered)]; + } + }); + + NSSet *allTargets = control.allTargets; + + if (!allTargets.count) { + return nil; + } + + NSMutableArray *handlers = [NSMutableArray array]; + + [allEvents enumerateObjectsUsingBlock:^(NSNumber * _Nonnull eventNum, NSUInteger idx, BOOL * _Nonnull stop) { + UIControlEvents event = [eventNum unsignedIntegerValue]; + + NSMutableArray *targetActions = [NSMutableArray array]; + + [allTargets enumerateObjectsUsingBlock:^(id _Nonnull target, BOOL * _Nonnull stop) { + NSArray *actions = [control actionsForTarget:target forControlEvent:event]; + [actions enumerateObjectsUsingBlock:^(NSString * _Nonnull action, NSUInteger idx, BOOL * _Nonnull stop) { + LookinStringTwoTuple *tuple = [LookinStringTwoTuple new]; + tuple.first = [LKS_Helper descriptionOfObject:target]; + tuple.second = action; + [targetActions addObject:tuple]; + }]; + }]; + + if (targetActions.count) { + LookinEventHandler *handler = [LookinEventHandler new]; + handler.handlerType = LookinEventHandlerTypeTargetAction; + handler.eventName = [self _nameFromControlEvent:event]; + handler.targetActions = targetActions.copy; + [handlers addObject:handler]; + } + }]; + + return handlers; +} + ++ (NSString *)_nameFromControlEvent:(UIControlEvents)event { + static dispatch_once_t onceToken; + static NSDictionary *eventsAndNames = nil; + dispatch_once(&onceToken,^{ + NSMutableDictionary *eventsAndNames_m = @{ + @(UIControlEventTouchDown): @"UIControlEventTouchDown", + @(UIControlEventTouchDownRepeat): @"UIControlEventTouchDownRepeat", + @(UIControlEventTouchDragInside): @"UIControlEventTouchDragInside", + @(UIControlEventTouchDragOutside): @"UIControlEventTouchDragOutside", + @(UIControlEventTouchDragEnter): @"UIControlEventTouchDragEnter", + @(UIControlEventTouchDragExit): @"UIControlEventTouchDragExit", + @(UIControlEventTouchUpInside): @"UIControlEventTouchUpInside", + @(UIControlEventTouchUpOutside): @"UIControlEventTouchUpOutside", + @(UIControlEventTouchCancel): @"UIControlEventTouchCancel", + @(UIControlEventValueChanged): @"UIControlEventValueChanged", + @(UIControlEventEditingDidBegin): @"UIControlEventEditingDidBegin", + @(UIControlEventEditingChanged): @"UIControlEventEditingChanged", + @(UIControlEventEditingDidEnd): @"UIControlEventEditingDidEnd", + @(UIControlEventEditingDidEndOnExit): @"UIControlEventEditingDidEndOnExit", + }.mutableCopy; + if (@available(iOS 9.0, *)) { + eventsAndNames_m[@(UIControlEventPrimaryActionTriggered)] = @"UIControlEventPrimaryActionTriggered"; + } + eventsAndNames = eventsAndNames_m.copy; + }); + + NSString *name = eventsAndNames[@(event)]; + return name; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_ExportManager.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_ExportManager.h new file mode 100644 index 0000000..90fe53b --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_ExportManager.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_ExportManager.h +// LookinServer +// +// Created by Li Kai on 2019/5/13. +// https://lookin.work +// + +#import + +@interface LKS_ExportManager : NSObject + ++ (instancetype)sharedInstance; + +- (void)exportAndShare; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_ExportManager.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_ExportManager.m new file mode 100644 index 0000000..be040b9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_ExportManager.m @@ -0,0 +1,193 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_ExportManager.m +// LookinServer +// +// Created by Li Kai on 2019/5/13. +// https://lookin.work +// + +#import "LKS_ExportManager.h" +#import "UIViewController+LookinServer.h" +#import "LookinHierarchyInfo.h" +#import "LookinHierarchyFile.h" +#import "LookinAppInfo.h" +#import "LookinServerDefines.h" +#import "LKS_MultiplatformAdapter.h" + +@interface LKS_ExportManagerMaskView : UIView + +@property(nonatomic, strong) UIView *tipsView; +@property(nonatomic, strong) UILabel *firstLabel; +@property(nonatomic, strong) UILabel *secondLabel; +@property(nonatomic, strong) UILabel *thirdLabel; + +@end + +@implementation LKS_ExportManagerMaskView + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.35]; + + self.tipsView = [UIView new]; + self.tipsView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.88]; + self.tipsView.layer.cornerRadius = 6; + self.tipsView.layer.masksToBounds = YES; + [self addSubview:self.tipsView]; + + self.firstLabel = [UILabel new]; + self.firstLabel.text = LKS_Localized(@"Creating File…"); + self.firstLabel.textColor = [UIColor whiteColor]; + self.firstLabel.font = [UIFont boldSystemFontOfSize:14]; + self.firstLabel.textAlignment = NSTextAlignmentCenter; + self.firstLabel.numberOfLines = 0; + [self.tipsView addSubview:self.firstLabel]; + + self.secondLabel = [UILabel new]; + self.secondLabel.text = LKS_Localized(@"May take 8 or more seconds according to the UI complexity."); + self.secondLabel.textColor = [UIColor colorWithRed:173/255.0 green:180/255.0 blue:190/255.0 alpha:1]; + self.secondLabel.font = [UIFont systemFontOfSize:12]; + self.secondLabel.textAlignment = NSTextAlignmentLeft; + self.secondLabel.numberOfLines = 0; + [self.tipsView addSubview:self.secondLabel]; + + self.thirdLabel = [UILabel new]; + self.thirdLabel.text = LKS_Localized(@"The file can be opend by Lookin.app in macOS."); + self.thirdLabel.textColor = [UIColor colorWithRed:173/255.0 green:180/255.0 blue:190/255.0 alpha:1]; + self.thirdLabel.font = [UIFont systemFontOfSize:12]; + self.thirdLabel.textAlignment = NSTextAlignmentCenter; + self.thirdLabel.numberOfLines = 0; + [self.tipsView addSubview:self.thirdLabel]; + } + return self; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + + UIEdgeInsets insets = UIEdgeInsetsMake(8, 10, 8, 10); + CGFloat maxLabelWidth = self.bounds.size.width * .8 - insets.left - insets.right; + + CGSize firstSize = [self.firstLabel sizeThatFits:CGSizeMake(maxLabelWidth, CGFLOAT_MAX)]; + CGSize secondSize = [self.secondLabel sizeThatFits:CGSizeMake(maxLabelWidth, CGFLOAT_MAX)]; + CGSize thirdSize = [self.thirdLabel sizeThatFits:CGSizeMake(maxLabelWidth, CGFLOAT_MAX)]; + + CGFloat tipsWidth = MAX(MAX(firstSize.width, secondSize.width), thirdSize.width) + insets.left + insets.right; + + self.firstLabel.frame = CGRectMake(tipsWidth / 2.0 - firstSize.width / 2.0, insets.top, firstSize.width, firstSize.height); + self.secondLabel.frame = CGRectMake(tipsWidth / 2.0 - secondSize.width / 2.0, CGRectGetMaxY(self.firstLabel.frame) + 10, secondSize.width, secondSize.height); + self.thirdLabel.frame = CGRectMake(tipsWidth / 2.0 - thirdSize.width / 2.0, CGRectGetMaxY(self.secondLabel.frame) + 5, thirdSize.width, thirdSize.height); + + self.tipsView.frame = ({ + CGFloat height = CGRectGetMaxY(self.thirdLabel.frame) + insets.bottom; + CGRectMake(self.bounds.size.width / 2.0 - tipsWidth / 2.0, self.bounds.size.height / 2.0 - height / 2.0, tipsWidth, height); + }); +} + +@end + +@interface LKS_ExportManager () + +#if TARGET_OS_TV +#else +@property(nonatomic, strong) UIDocumentInteractionController *documentController; +#endif + +@property(nonatomic, strong) LKS_ExportManagerMaskView *maskView; + +@end + +@implementation LKS_ExportManager + ++ (instancetype)sharedInstance { + static dispatch_once_t onceToken; + static LKS_ExportManager *instance = nil; + dispatch_once(&onceToken,^{ + instance = [[super allocWithZone:NULL] init]; + }); + return instance; +} + ++ (id)allocWithZone:(struct _NSZone *)zone{ + return [self sharedInstance]; +} + +#if TARGET_OS_TV +- (void)exportAndShare { + NSAssert(NO, @"not supported"); +} +#else +- (void)exportAndShare { + + UIViewController *visibleVc = [UIViewController lks_visibleViewController]; + if (!visibleVc) { + NSLog(@"LookinServer - Failed to export because we didn't find any visible view controller."); + return; + } + + [[NSNotificationCenter defaultCenter] postNotificationName:@"Lookin_WillExport" object:nil]; + + if (!self.maskView) { + self.maskView = [LKS_ExportManagerMaskView new]; + } + [visibleVc.view.window addSubview:self.maskView]; + self.maskView.frame = visibleVc.view.window.bounds; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + LookinHierarchyInfo *info = [LookinHierarchyInfo exportedInfo]; + LookinHierarchyFile *file = [LookinHierarchyFile new]; + file.serverVersion = info.serverVersion; + file.hierarchyInfo = info; + NSData *data = [NSKeyedArchiver archivedDataWithRootObject:file]; + if (!data) { + return; + } + + NSString *fileName = ({ + NSString *timeString = ({ + NSDate *date = [NSDate date]; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + [formatter setDateFormat:@"MMddHHmm"]; + [formatter stringFromDate:date]; + }); + NSString *iOSVersion = ({ + NSString *str = info.appInfo.osDescription; + NSUInteger dotIdx = [str rangeOfString:@"."].location; + if (dotIdx != NSNotFound) { + str = [str substringToIndex:dotIdx]; + } + str; + }); + [NSString stringWithFormat:@"%@_ios%@_%@.lookin", info.appInfo.appName, iOSVersion, timeString]; + }); + NSString *path = [NSString stringWithFormat:@"%@%@", NSTemporaryDirectory(), fileName]; + [data writeToFile:path atomically:YES]; + + [self.maskView removeFromSuperview]; + + if (!self.documentController) { + self.documentController = [UIDocumentInteractionController new]; + } + self.documentController.URL = [NSURL fileURLWithPath:path]; + if ([LKS_MultiplatformAdapter isiPad]) { + [self.documentController presentOpenInMenuFromRect:CGRectMake(0, 0, 1, 1) inView:visibleVc.view animated:YES]; + } else { + [self.documentController presentOpenInMenuFromRect:visibleVc.view.bounds inView:visibleVc.view animated:YES]; + } + + [[NSNotificationCenter defaultCenter] postNotificationName:@"Lookin_DidFinishExport" object:nil]; + +// [self.documentController presentOptionsMenuFromRect:visibleVc.view.bounds inView:visibleVc.view animated:YES]; + +// CFTimeInterval endTime = CACurrentMediaTime(); +// CFTimeInterval consumingTime = endTime - startTime; +// NSLog(@"LookinServer - 导出 UI 结构耗时:%@", @(consumingTime)); + }); +} +#endif + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.h new file mode 100644 index 0000000..def0ca9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.h @@ -0,0 +1,26 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_GestureTargetActionsSearcher.h +// LookinServer +// +// Created by likai.123 on 2023/9/11. +// + +#import + +@class LookinTwoTuple; + +NS_ASSUME_NONNULL_BEGIN + +@interface LKS_GestureTargetActionsSearcher : NSObject + +/// 返回一个 UIGestureRecognizer 实例身上绑定的 target & action 信息 +/// tuple.first => LookinWeakContainer(包裹着 target),tuple.second => action(方法名字符串) ++ (NSArray *)getTargetActionsFromRecognizer:(UIGestureRecognizer *)recognizer; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.m new file mode 100644 index 0000000..0487bff --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.m @@ -0,0 +1,52 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_GestureTargetActionsSearcher.m +// LookinServer +// +// Created by likai.123 on 2023/9/11. +// + +#import "LKS_GestureTargetActionsSearcher.h" +#import +#import "NSArray+Lookin.h" +#import "LookinTuple.h" +#import "LookinWeakContainer.h" + +@implementation LKS_GestureTargetActionsSearcher + ++ (NSArray *)getTargetActionsFromRecognizer:(UIGestureRecognizer *)recognizer { + if (!recognizer) { + return @[]; + } + // KVC 要放到 try catch 里面防止 Crash + @try { + NSArray* targetsList = [recognizer valueForKey:@"_targets"]; + if (!targetsList || targetsList.count == 0) { + return @[]; + } + // 数组元素对象是 UIGestureRecognizerTarget* + // 这个元素有两个属性,一个是名为 _target 的属性指向某个实例,另一个是名为 _action 的属性保存一个 SEL + NSArray* ret = [targetsList lookin_map:^id(NSUInteger idx, id targetBox) { + id targetObj = [targetBox valueForKey:@"_target"]; + if (!targetObj) { + return nil; + } + SEL action = ((SEL (*)(id, Ivar))object_getIvar)(targetBox, class_getInstanceVariable([targetBox class], "_action")); + + LookinTwoTuple* tuple = [LookinTwoTuple new]; + tuple.first = [LookinWeakContainer containerWithObject:targetObj]; + tuple.second = (action == NULL ? @"NULL" : NSStringFromSelector(action)); + return tuple; + }]; + return ret; + } + @catch (NSException * e) { + NSLog(@"LookinServer - %@", e); + return @[]; + } +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_Helper.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_Helper.h new file mode 100644 index 0000000..dcb16d7 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_Helper.h @@ -0,0 +1,29 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_Helper.h +// LookinServer +// +// Created by Li Kai on 2019/7/20. +// https://lookin.work +// + +#import "LookinDefines.h" + + + +#import + +#define LKS_Localized(stringKey) NSLocalizedStringFromTableInBundle(stringKey, nil, [NSBundle bundleForClass:self.class], nil) + +@interface LKS_Helper : NSObject + +/// 如果 object 为 nil 则返回字符串 “nil”,否则返回字符串格式类似于 (UIView *) ++ (NSString *)descriptionOfObject:(id)object; + +/// 返回当前的bundle ++ (NSBundle *)bundle; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_Helper.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_Helper.m new file mode 100644 index 0000000..8a0368f --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_Helper.m @@ -0,0 +1,38 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_Helper.m +// LookinServer +// +// Created by Li Kai on 2019/7/20. +// https://lookin.work +// + +#import "LKS_Helper.h" +#import "NSObject+LookinServer.h" + +@implementation LKS_Helper + ++ (NSString *)descriptionOfObject:(id)object { + if (!object) { + return @"nil"; + } + NSString *className = NSStringFromClass([object class]); + return [NSString stringWithFormat:@"(%@ *)", className]; +} + ++ (NSBundle *)bundle { + static id bundle = nil; + if (bundle != nil) { +#ifdef SPM_RESOURCE_BUNDLE_IDENTIFITER + bundle = [NSBundle bundleWithIdentifier:SPM_RESOURCE_BUNDLE_IDENTIFITER]; +#else + bundle = [NSBundle bundleForClass:self.class]; +#endif + } + return bundle; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_HierarchyDisplayItemsMaker.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_HierarchyDisplayItemsMaker.h new file mode 100644 index 0000000..6e9bbe0 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_HierarchyDisplayItemsMaker.h @@ -0,0 +1,31 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_HierarchyDisplayItemsMaker.h +// LookinServer +// +// Created by Li Kai on 2019/2/19. +// https://lookin.work +// + + + +#import "LookinDefines.h" + +@class LookinDisplayItem; + +@interface LKS_HierarchyDisplayItemsMaker : NSObject + +/// @param hasScreenshots 是否包含 soloScreenshots 和 groupScreenshot 属性 +/// @param hasAttrList 是否包含 attributesGroupList 属性 +/// @param lowQuality screenshots 是否为低质量(当 hasScreenshots 为 NO 时,该属性无意义) +/// @param readCustomInfo 是否读取 lookin_customDebugInfos,比如低版本的 Lookin 发请求时,就无需读取(因为 Lookin 解析不了、还可能出 Bug) +/// @param saveCustomSetter 是否要读取并保存用户给 attribute 配置的 custom setter ++ (NSArray *)itemsWithScreenshots:(BOOL)hasScreenshots attrList:(BOOL)hasAttrList lowImageQuality:(BOOL)lowQuality readCustomInfo:(BOOL)readCustomInfo saveCustomSetter:(BOOL)saveCustomSetter; + +/// 把 layer 的 sublayers 转换为 displayItem 数组并返回 ++ (NSArray *)subitemsOfLayer:(CALayer *)layer; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_HierarchyDisplayItemsMaker.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_HierarchyDisplayItemsMaker.m new file mode 100644 index 0000000..4207a43 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_HierarchyDisplayItemsMaker.m @@ -0,0 +1,162 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_HierarchyDisplayItemsMaker.m +// LookinServer +// +// Created by Li Kai on 2019/2/19. +// https://lookin.work +// + +#import "LKS_HierarchyDisplayItemsMaker.h" +#import "LookinDisplayItem.h" +#import "LKS_TraceManager.h" +#import "LKS_AttrGroupsMaker.h" +#import "LKS_EventHandlerMaker.h" +#import "LookinServerDefines.h" +#import "UIColor+LookinServer.h" +#import "LKSConfigManager.h" +#import "LKS_CustomAttrGroupsMaker.h" +#import "LKS_CustomDisplayItemsMaker.h" +#import "LKS_CustomAttrSetterManager.h" +#import "LKS_MultiplatformAdapter.h" + +@implementation LKS_HierarchyDisplayItemsMaker + ++ (NSArray *)itemsWithScreenshots:(BOOL)hasScreenshots attrList:(BOOL)hasAttrList lowImageQuality:(BOOL)lowQuality readCustomInfo:(BOOL)readCustomInfo saveCustomSetter:(BOOL)saveCustomSetter { + + [[LKS_TraceManager sharedInstance] reload]; + + NSArray *windows = [LKS_MultiplatformAdapter allWindows]; + NSMutableArray *resultArray = [NSMutableArray arrayWithCapacity:windows.count]; + [windows enumerateObjectsUsingBlock:^(__kindof UIWindow * _Nonnull window, NSUInteger idx, BOOL * _Nonnull stop) { + LookinDisplayItem *item = [self _displayItemWithLayer:window.layer screenshots:hasScreenshots attrList:hasAttrList lowImageQuality:lowQuality readCustomInfo:readCustomInfo saveCustomSetter:saveCustomSetter]; + item.representedAsKeyWindow = window.isKeyWindow; + if (item) { + [resultArray addObject:item]; + } + }]; + + return [resultArray copy]; +} + ++ (LookinDisplayItem *)_displayItemWithLayer:(CALayer *)layer screenshots:(BOOL)hasScreenshots attrList:(BOOL)hasAttrList lowImageQuality:(BOOL)lowQuality readCustomInfo:(BOOL)readCustomInfo saveCustomSetter:(BOOL)saveCustomSetter { + if (!layer) { + return nil; + } + + LookinDisplayItem *item = [LookinDisplayItem new]; + CGRect layerFrame = layer.frame; + UIView *hostView = layer.lks_hostView; + if (hostView && hostView.superview) { + layerFrame = [hostView.superview convertRect:layerFrame toView:nil]; + } + if ([self validateFrame:layerFrame]) { + item.frame = layer.frame; + } else { + NSLog(@"LookinServer - The layer frame(%@) seems really weird. Lookin will ignore it to avoid potential render error in Lookin.", NSStringFromCGRect(layer.frame)); + item.frame = CGRectZero; + } + item.bounds = layer.bounds; + if (hasScreenshots) { + item.soloScreenshot = [layer lks_soloScreenshotWithLowQuality:lowQuality]; + item.groupScreenshot = [layer lks_groupScreenshotWithLowQuality:lowQuality]; + item.screenshotEncodeType = LookinDisplayItemImageEncodeTypeNSData; + } + + if (hasAttrList) { + item.attributesGroupList = [LKS_AttrGroupsMaker attrGroupsForLayer:layer]; + LKS_CustomAttrGroupsMaker *maker = [[LKS_CustomAttrGroupsMaker alloc] initWithLayer:layer]; + [maker execute]; + item.customAttrGroupList = [maker getGroups]; + item.customDisplayTitle = [maker getCustomDisplayTitle]; + item.danceuiSource = [maker getDanceUISource]; + } + + item.isHidden = layer.isHidden; + item.alpha = layer.opacity; + item.layerObject = [LookinObject instanceWithObject:layer]; + item.shouldCaptureImage = [LKSConfigManager shouldCaptureScreenshotOfLayer:layer]; + + if (layer.lks_hostView) { + UIView *view = layer.lks_hostView; + item.viewObject = [LookinObject instanceWithObject:view]; + item.eventHandlers = [LKS_EventHandlerMaker makeForView:view]; + item.backgroundColor = view.backgroundColor; + + UIViewController* vc = [view lks_findHostViewController]; + if (vc) { + item.hostViewControllerObject = [LookinObject instanceWithObject:vc]; + } + } else { + item.backgroundColor = [UIColor lks_colorWithCGColor:layer.backgroundColor]; + } + + if (layer.sublayers.count) { + NSArray *sublayers = [layer.sublayers copy]; + NSMutableArray *allSubitems = [NSMutableArray arrayWithCapacity:sublayers.count]; + [sublayers enumerateObjectsUsingBlock:^(__kindof CALayer * _Nonnull sublayer, NSUInteger idx, BOOL * _Nonnull stop) { + LookinDisplayItem *sublayer_item = [self _displayItemWithLayer:sublayer screenshots:hasScreenshots attrList:hasAttrList lowImageQuality:lowQuality readCustomInfo:readCustomInfo saveCustomSetter:saveCustomSetter]; + if (sublayer_item) { + [allSubitems addObject:sublayer_item]; + } + }]; + item.subitems = [allSubitems copy]; + } + if (readCustomInfo) { + NSArray *customSubitems = [[[LKS_CustomDisplayItemsMaker alloc] initWithLayer:layer saveAttrSetter:saveCustomSetter] make]; + if (customSubitems.count > 0) { + if (item.subitems) { + item.subitems = [item.subitems arrayByAddingObjectsFromArray:customSubitems]; + } else { + item.subitems = customSubitems; + } + } + } + + return item; +} + ++ (NSArray *)subitemsOfLayer:(CALayer *)layer { + if (!layer || layer.sublayers.count == 0) { + return @[]; + } + [[LKS_TraceManager sharedInstance] reload]; + + NSMutableArray *resultSubitems = [NSMutableArray array]; + + NSArray *sublayers = [layer.sublayers copy]; + [sublayers enumerateObjectsUsingBlock:^(__kindof CALayer * _Nonnull sublayer, NSUInteger idx, BOOL * _Nonnull stop) { + LookinDisplayItem *sublayer_item = [self _displayItemWithLayer:sublayer screenshots:NO attrList:NO lowImageQuality:NO readCustomInfo:YES saveCustomSetter:YES]; + if (sublayer_item) { + [resultSubitems addObject:sublayer_item]; + } + }]; + + NSArray *customSubitems = [[[LKS_CustomDisplayItemsMaker alloc] initWithLayer:layer saveAttrSetter:YES] make]; + if (customSubitems.count > 0) { + [resultSubitems addObjectsFromArray:customSubitems]; + } + + return resultSubitems; +} + ++ (BOOL)validateFrame:(CGRect)frame { + return !CGRectIsNull(frame) && !CGRectIsInfinite(frame) && ![self cgRectIsNaN:frame] && ![self cgRectIsInf:frame] && ![self cgRectIsUnreasonable:frame]; +} + ++ (BOOL)cgRectIsNaN:(CGRect)rect { + return isnan(rect.origin.x) || isnan(rect.origin.y) || isnan(rect.size.width) || isnan(rect.size.height); +} + ++ (BOOL)cgRectIsInf:(CGRect)rect { + return isinf(rect.origin.x) || isinf(rect.origin.y) || isinf(rect.size.width) || isinf(rect.size.height); +} + ++ (BOOL)cgRectIsUnreasonable:(CGRect)rect { + return ABS(rect.origin.x) > 100000 || ABS(rect.origin.y) > 100000 || rect.size.width < 0 || rect.size.height < 0 || rect.size.width > 100000 || rect.size.height > 100000; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_MultiplatformAdapter.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_MultiplatformAdapter.h new file mode 100644 index 0000000..dc13f64 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_MultiplatformAdapter.h @@ -0,0 +1,30 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LKS_MultiplatformAdapter.h +// +// +// Created by nixjiang on 2024/3/12. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface LKS_MultiplatformAdapter : NSObject + ++ (UIWindow *)keyWindow; + ++ (NSArray *)allWindows; + ++ (CGRect)mainScreenBounds; + ++ (CGFloat)mainScreenScale; + ++ (BOOL)isiPad; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_MultiplatformAdapter.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_MultiplatformAdapter.m new file mode 100644 index 0000000..8c04b98 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_MultiplatformAdapter.m @@ -0,0 +1,92 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LKS_MultiplatformAdapter.m +// +// +// Created by nixjiang on 2024/3/12. +// + +#import "LKS_MultiplatformAdapter.h" +#import + +@implementation LKS_MultiplatformAdapter + ++ (BOOL)isiPad { + static BOOL s_isiPad = NO; + + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSString *nsModel = [UIDevice currentDevice].model; + s_isiPad = [nsModel hasPrefix:@"iPad"]; + }); + + return s_isiPad; +} + ++ (CGRect)mainScreenBounds { +#if TARGET_OS_VISION + return [LKS_MultiplatformAdapter getFirstActiveWindowScene].coordinateSpace.bounds; +#else + return [UIScreen mainScreen].bounds; +#endif +} + ++ (CGFloat)mainScreenScale { +#if TARGET_OS_VISION + return 2.f; +#else + return [UIScreen mainScreen].scale; +#endif +} + +#if TARGET_OS_VISION ++ (UIWindowScene *)getFirstActiveWindowScene { + for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { + if (![scene isKindOfClass:UIWindowScene.class]) { + continue; + } + UIWindowScene *windowScene = (UIWindowScene *)scene; + if (windowScene.activationState == UISceneActivationStateForegroundActive) { + return windowScene; + } + } + return nil; +} +#endif + ++ (UIWindow *)keyWindow { +#if TARGET_OS_VISION + return [self getFirstActiveWindowScene].keyWindow; +#else + return [UIApplication sharedApplication].keyWindow; +#endif +} + ++ (NSArray *)allWindows { +#if TARGET_OS_VISION + NSMutableArray *windows = [NSMutableArray new]; + for (UIScene *scene in + UIApplication.sharedApplication.connectedScenes) { + if (![scene isKindOfClass:UIWindowScene.class]) { + continue; + } + UIWindowScene *windowScene = (UIWindowScene *)scene; + [windows addObjectsFromArray:windowScene.windows]; + + // 以UIModalPresentationFormSheet形式展示的页面由系统私有window承载,不出现在scene.windows,不过可以从scene.keyWindow中获取 + if (![windows containsObject:windowScene.keyWindow]) { + if (![NSStringFromClass(windowScene.keyWindow.class) containsString:@"HUD"]) { + [windows addObject:windowScene.keyWindow]; + } + } + } + + return [windows copy]; +#else + return [[UIApplication sharedApplication].windows copy]; +#endif +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_ObjectRegistry.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_ObjectRegistry.h new file mode 100644 index 0000000..64a1252 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_ObjectRegistry.h @@ -0,0 +1,23 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_ObjectRegistry.h +// LookinServer +// +// Created by Li Kai on 2019/4/21. +// https://lookin.work +// + +#import + +@interface LKS_ObjectRegistry : NSObject + ++ (instancetype)sharedInstance; + +- (unsigned long)addObject:(NSObject *)object; + +- (NSObject *)objectWithOid:(unsigned long)oid; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_ObjectRegistry.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_ObjectRegistry.m new file mode 100644 index 0000000..e651cc3 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_ObjectRegistry.m @@ -0,0 +1,62 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_ObjectRegistry.m +// LookinServer +// +// Created by Li Kai on 2019/4/21. +// https://lookin.work +// + +#import "LKS_ObjectRegistry.h" +#import + +@interface LKS_ObjectRegistry () + +@property(nonatomic, strong) NSPointerArray *data; + +@end + +@implementation LKS_ObjectRegistry + ++ (instancetype)sharedInstance { + static dispatch_once_t onceToken; + static LKS_ObjectRegistry *instance = nil; + dispatch_once(&onceToken,^{ + instance = [[super allocWithZone:NULL] init]; + }); + return instance; +} + ++ (id)allocWithZone:(struct _NSZone *)zone{ + return [self sharedInstance]; +} + +- (instancetype)init { + if (self = [super init]) { + self.data = [NSPointerArray weakObjectsPointerArray]; + // index 为 0 用 Null 填充 + self.data.count = 1; + } + return self; +} + +- (unsigned long)addObject:(NSObject *)object { + if (!object) { + return 0; + } + [self.data addPointer:(void *)object]; + return self.data.count - 1; +} + +- (NSObject *)objectWithOid:(unsigned long)oid { + if (self.data.count <= oid) { + return nil; + } + id object = [self.data pointerAtIndex:oid]; + return object; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_TraceManager.h b/Pods/LookinServer/Src/Main/Server/Others/LKS_TraceManager.h new file mode 100644 index 0000000..aac9ef7 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_TraceManager.h @@ -0,0 +1,27 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_TraceManager.h +// LookinServer +// +// Created by Li Kai on 2019/5/5. +// https://lookin.work +// + + + +#import + +@class LookinIvarTrace; + +@interface LKS_TraceManager : NSObject + ++ (instancetype)sharedInstance; + +- (void)reload; + +- (void)addSearchTarger:(id)target; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LKS_TraceManager.m b/Pods/LookinServer/Src/Main/Server/Others/LKS_TraceManager.m new file mode 100644 index 0000000..b90fdf3 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LKS_TraceManager.m @@ -0,0 +1,310 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LKS_TraceManager.m +// LookinServer +// +// Created by Li Kai on 2019/5/5. +// https://lookin.work +// + +#import "LKS_TraceManager.h" +#import +#import "LookinIvarTrace.h" +#import "LookinServerDefines.h" +#import "LookinWeakContainer.h" +#import "LKS_MultiplatformAdapter.h" + +#ifdef LOOKIN_SERVER_SWIFT_ENABLED + +#if __has_include() + #import + #define LOOKIN_SERVER_SWIFT_ENABLED_SUCCESSFULLY +#elif __has_include("LookinServer-Swift.h") + #import "LookinServer-Swift.h" + #define LOOKIN_SERVER_SWIFT_ENABLED_SUCCESSFULLY +#endif + +#endif + +#ifdef SPM_LOOKIN_SERVER_ENABLED +@import LookinServerSwift; +#define LOOKIN_SERVER_SWIFT_ENABLED_SUCCESSFULLY +#endif + +@interface LKS_TraceManager () + +@property(nonatomic, strong) NSMutableArray *searchTargets; + +@end + +@implementation LKS_TraceManager + ++ (instancetype)sharedInstance { + static dispatch_once_t onceToken; + static LKS_TraceManager *instance = nil; + dispatch_once(&onceToken,^{ + instance = [[super allocWithZone:NULL] init]; + }); + return instance; +} + ++ (id)allocWithZone:(struct _NSZone *)zone { + return [self sharedInstance]; +} + +- (void)addSearchTarger:(id)target { + if (!target) { + return; + } + if (!self.searchTargets) { + self.searchTargets = [NSMutableArray array]; + } + LookinWeakContainer *container = [LookinWeakContainer containerWithObject:target]; + [self.searchTargets addObject:container]; +} + +- (void)reload { + // 把旧的先都清理掉 + [NSObject lks_clearAllObjectsTraces]; + + [self.searchTargets enumerateObjectsUsingBlock:^(LookinWeakContainer * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (!obj.object) { + return; + } + [self _markIVarsInAllClassLevelsOfObject:obj.object]; + }]; + + [[LKS_MultiplatformAdapter allWindows] enumerateObjectsUsingBlock:^(__kindof UIWindow * _Nonnull window, NSUInteger idx, BOOL * _Nonnull stop) { + [self _addTraceForLayersRootedByLayer:window.layer]; + }]; +} + +- (void)_addTraceForLayersRootedByLayer:(CALayer *)layer { + UIView *view = layer.lks_hostView; + + if ([view.superview lks_isChildrenViewOfTabBar]) { + view.lks_isChildrenViewOfTabBar = YES; + } else if ([view isKindOfClass:[UITabBar class]]) { + view.lks_isChildrenViewOfTabBar = YES; + } + + if (view) { + [self _markIVarsInAllClassLevelsOfObject:view]; + UIViewController* vc = [view lks_findHostViewController]; + if (vc) { + [self _markIVarsInAllClassLevelsOfObject:vc]; + } + + [self _buildSpecialTraceForView:view]; + } else { + [self _markIVarsInAllClassLevelsOfObject:layer]; + } + + [[layer.sublayers copy] enumerateObjectsUsingBlock:^(__kindof CALayer * _Nonnull sublayer, NSUInteger idx, BOOL * _Nonnull stop) { + [self _addTraceForLayersRootedByLayer:sublayer]; + }]; +} + +- (void)_buildSpecialTraceForView:(UIView *)view { + UIViewController* vc = [view lks_findHostViewController]; + if (vc) { + view.lks_specialTrace = [NSString stringWithFormat:@"%@.view", NSStringFromClass(vc.class)]; + + } else if ([view isKindOfClass:[UIWindow class]]) { + CGFloat currentWindowLevel = ((UIWindow *)view).windowLevel; + + if (((UIWindow *)view).isKeyWindow) { + view.lks_specialTrace = [NSString stringWithFormat:@"KeyWindow ( Level: %@ )", @(currentWindowLevel)]; + } else { + view.lks_specialTrace = [NSString stringWithFormat:@"WindowLevel: %@", @(currentWindowLevel)]; + } + } else if ([view isKindOfClass:[UITableViewCell class]]) { + ((UITableViewCell *)view).backgroundView.lks_specialTrace = @"cell.backgroundView"; + ((UITableViewCell *)view).accessoryView.lks_specialTrace = @"cell.accessoryView"; + + } else if ([view isKindOfClass:[UITableView class]]) { + UITableView *tableView = (UITableView *)view; + + NSMutableArray *relatedSectionIdx = [NSMutableArray array]; + [[tableView visibleCells] enumerateObjectsUsingBlock:^(__kindof UITableViewCell * _Nonnull cell, NSUInteger idx, BOOL * _Nonnull stop) { + NSIndexPath *indexPath = [tableView indexPathForCell:cell]; + cell.lks_specialTrace = [NSString stringWithFormat:@"{ sec:%@, row:%@ }", @(indexPath.section), @(indexPath.row)]; + + if (![relatedSectionIdx containsObject:@(indexPath.section)]) { + [relatedSectionIdx addObject:@(indexPath.section)]; + } + }]; + + [relatedSectionIdx enumerateObjectsUsingBlock:^(NSNumber * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + NSUInteger secIdx = [obj unsignedIntegerValue]; + UIView *secHeaderView = [tableView headerViewForSection:secIdx]; + secHeaderView.lks_specialTrace = [NSString stringWithFormat:@"sectionHeader { sec: %@ }", @(secIdx)]; + + UIView *secFooterView = [tableView footerViewForSection:secIdx]; + secFooterView.lks_specialTrace = [NSString stringWithFormat:@"sectionFooter { sec: %@ }", @(secIdx)]; + }]; + + } else if ([view isKindOfClass:[UICollectionView class]]) { + UICollectionView *collectionView = (UICollectionView *)view; + collectionView.backgroundView.lks_specialTrace = @"collectionView.backgroundView"; + + if (@available(iOS 9.0, *)) { + [[collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionHeader] enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull indexPath, NSUInteger idx, BOOL * _Nonnull stop) { + UIView *headerView = [collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:indexPath]; + headerView.lks_specialTrace = [NSString stringWithFormat:@"sectionHeader { sec:%@ }", @(indexPath.section)]; + }]; + [[collectionView indexPathsForVisibleSupplementaryElementsOfKind:UICollectionElementKindSectionFooter] enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull indexPath, NSUInteger idx, BOOL * _Nonnull stop) { + UIView *footerView = [collectionView supplementaryViewForElementKind:UICollectionElementKindSectionFooter atIndexPath:indexPath]; + footerView.lks_specialTrace = [NSString stringWithFormat:@"sectionFooter { sec:%@ }", @(indexPath.section)]; + }]; + } + + [[collectionView visibleCells] enumerateObjectsUsingBlock:^(__kindof UICollectionViewCell * _Nonnull cell, NSUInteger idx, BOOL * _Nonnull stop) { + NSIndexPath *indexPath = [collectionView indexPathForCell:cell]; + cell.lks_specialTrace = [NSString stringWithFormat:@"{ item:%@, sec:%@ }", @(indexPath.item), @(indexPath.section)]; + }]; + + } else if ([view isKindOfClass:[UITableViewHeaderFooterView class]]) { + UITableViewHeaderFooterView *headerFooterView = (UITableViewHeaderFooterView *)view; + headerFooterView.textLabel.lks_specialTrace = @"sectionHeaderFooter.textLabel"; + headerFooterView.detailTextLabel.lks_specialTrace = @"sectionHeaderFooter.detailTextLabel"; + } +} + +- (void)_markIVarsInAllClassLevelsOfObject:(NSObject *)object { + [self _markIVarsOfObject:object class:object.class]; +#ifdef LOOKIN_SERVER_SWIFT_ENABLED_SUCCESSFULLY + [LKS_SwiftTraceManager swiftMarkIVarsOfObject:object]; +#endif +} + +- (void)_markIVarsOfObject:(NSObject *)hostObject class:(Class)targetClass { + if (!targetClass) { + return; + } + + NSArray *prefixesToTerminateRecursion = @[@"NSObject", @"UIResponder", @"UIButton", @"UIButtonLabel"]; + BOOL hasPrefix = [prefixesToTerminateRecursion lookin_any:^BOOL(NSString *prefix) { + return [NSStringFromClass(targetClass) hasPrefix:prefix]; + }]; + if (hasPrefix) { + return; + } + + unsigned int outCount = 0; + Ivar *ivars = class_copyIvarList(targetClass, &outCount); + for (unsigned int i = 0; i < outCount; i ++) { + Ivar ivar = ivars[i]; + NSString *ivarType = [[NSString alloc] lookin_safeInitWithUTF8String:ivar_getTypeEncoding(ivar)]; + if (![ivarType hasPrefix:@"@"] || ivarType.length <= 3) { + continue; + } + NSString *ivarClassName = [ivarType substringWithRange:NSMakeRange(2, ivarType.length - 3)]; + Class ivarClass = NSClassFromString(ivarClassName); + if (![ivarClass isSubclassOfClass:[UIView class]] + && ![ivarClass isSubclassOfClass:[CALayer class]] + && ![ivarClass isSubclassOfClass:[UIViewController class]] + && ![ivarClass isSubclassOfClass:[UIGestureRecognizer class]]) { + continue; + } + const char * ivarNameChar = ivar_getName(ivar); + if (!ivarNameChar) { + continue; + } + // 这个 ivarObject 可能的类型:UIView, CALayer, UIViewController, UIGestureRecognizer + NSObject *ivarObject = object_getIvar(hostObject, ivar); + if (!ivarObject || ![ivarObject isKindOfClass:[NSObject class]]) { + continue; + } + + LookinIvarTrace *ivarTrace = [LookinIvarTrace new]; + ivarTrace.hostObject = hostObject; + ivarTrace.hostClassName = [self makeDisplayClassNameWithSuper:targetClass childClass:hostObject.class]; + ivarTrace.ivarName = [[NSString alloc] lookin_safeInitWithUTF8String:ivarNameChar]; + + if (hostObject == ivarObject) { + ivarTrace.relation = LookinIvarTraceRelationValue_Self; + } else if ([hostObject isKindOfClass:[UIView class]]) { + CALayer *ivarLayer = nil; + if ([ivarObject isKindOfClass:[CALayer class]]) { + ivarLayer = (CALayer *)ivarObject; + } else if ([ivarObject isKindOfClass:[UIView class]]) { + ivarLayer = ((UIView *)ivarObject).layer; + } + if (ivarLayer && (ivarLayer.superlayer == ((UIView *)hostObject).layer)) { + ivarTrace.relation = @"superview"; + } + } + + if ([LKS_InvalidIvarTraces() containsObject:ivarTrace]) { + continue; + } + + if (![ivarObject respondsToSelector:@selector(lks_ivarTraces)] || ![ivarObject respondsToSelector:@selector(setLks_ivarTraces:)]) { + continue; + } + if (!ivarObject.lks_ivarTraces) { + ivarObject.lks_ivarTraces = [NSArray array]; + } + if (![ivarObject.lks_ivarTraces containsObject:ivarTrace]) { + ivarObject.lks_ivarTraces = [ivarObject.lks_ivarTraces arrayByAddingObject:ivarTrace]; + } + } + free(ivars); + + Class superClass = [targetClass superclass]; + [self _markIVarsOfObject:hostObject class:superClass]; +} + +// 比如 superClass 可能是 UIView,而 childClass 可能是 UIButton +- (NSString *)makeDisplayClassNameWithSuper:(Class)superClass childClass:(Class)childClass { + NSString *superName = NSStringFromClass(superClass); + if (!childClass) { + return superName; + } + NSString *childName = NSStringFromClass(childClass); + if ([childName isEqualToString:superName]) { + return superName; + } + return [NSString stringWithFormat:@"%@ : %@", childName, superName]; +} + +static NSSet *LKS_InvalidIvarTraces(void) { + static NSSet *list; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableSet *set = [NSMutableSet set]; + + [set addObject:({ + LookinIvarTrace *trace = [LookinIvarTrace new]; + trace.hostClassName = @"UIView"; + trace.ivarName = @"_window"; + trace; + })]; + [set addObject:({ + LookinIvarTrace *trace = [LookinIvarTrace new]; + trace.hostClassName = @"UIViewController"; + trace.ivarName = @"_view"; + trace; + })]; + [set addObject:({ + LookinIvarTrace *trace = [LookinIvarTrace new]; + trace.hostClassName = @"UIView"; + trace.ivarName = @"_viewDelegate"; + trace; + })]; + [set addObject:({ + LookinIvarTrace *trace = [LookinIvarTrace new]; + trace.hostClassName = @"UIViewController"; + trace.ivarName = @"_parentViewController"; + trace; + })]; + list = set.copy; + }); + return list; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Server/Others/LookinServerDefines.h b/Pods/LookinServer/Src/Main/Server/Others/LookinServerDefines.h new file mode 100644 index 0000000..53f7a7c --- /dev/null +++ b/Pods/LookinServer/Src/Main/Server/Others/LookinServerDefines.h @@ -0,0 +1,23 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinServer_PrefixHeader.pch +// LookinServer +// +// Created by Li Kai on 2018/12/21. +// https://lookin.work +// + +#import "TargetConditionals.h" +#import "LookinDefines.h" +#import "LKS_Helper.h" +#import "NSObject+LookinServer.h" +#import "NSArray+Lookin.h" +#import "NSSet+Lookin.h" +#import "CALayer+Lookin.h" +#import "UIView+LookinServer.h" +#import "CALayer+LookinServer.h" +#import "NSObject+Lookin.h" +#import "NSString+Lookin.h" + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/CALayer+Lookin.h b/Pods/LookinServer/Src/Main/Shared/Category/CALayer+Lookin.h new file mode 100644 index 0000000..815459a --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/CALayer+Lookin.h @@ -0,0 +1,23 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// CALayer+Lookin.h +// Lookin +// +// Created by Li Kai on 2018/8/4. +// https://lookin.work +// + +#import "LookinDefines.h" + + + +#import + +@interface CALayer (Lookin) + +- (void)lookin_removeImplicitAnimations; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/CALayer+Lookin.m b/Pods/LookinServer/Src/Main/Shared/Category/CALayer+Lookin.m new file mode 100644 index 0000000..e756fc4 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/CALayer+Lookin.m @@ -0,0 +1,70 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// CALayer+Lookin.m +// Lookin +// +// Created by Li Kai on 2018/8/4. +// https://lookin.work +// + + + +#import "CALayer+Lookin.h" + +@implementation CALayer (Lookin) + +- (void)lookin_removeImplicitAnimations { + NSMutableDictionary> *actions = @{NSStringFromSelector(@selector(bounds)): [NSNull null], + NSStringFromSelector(@selector(position)): [NSNull null], + NSStringFromSelector(@selector(zPosition)): [NSNull null], + NSStringFromSelector(@selector(anchorPoint)): [NSNull null], + NSStringFromSelector(@selector(anchorPointZ)): [NSNull null], + NSStringFromSelector(@selector(transform)): [NSNull null], + NSStringFromSelector(@selector(sublayerTransform)): [NSNull null], + NSStringFromSelector(@selector(masksToBounds)): [NSNull null], + NSStringFromSelector(@selector(contents)): [NSNull null], + NSStringFromSelector(@selector(contentsRect)): [NSNull null], + NSStringFromSelector(@selector(contentsScale)): [NSNull null], + NSStringFromSelector(@selector(contentsCenter)): [NSNull null], + NSStringFromSelector(@selector(minificationFilterBias)): [NSNull null], + NSStringFromSelector(@selector(backgroundColor)): [NSNull null], + NSStringFromSelector(@selector(cornerRadius)): [NSNull null], + NSStringFromSelector(@selector(borderWidth)): [NSNull null], + NSStringFromSelector(@selector(borderColor)): [NSNull null], + NSStringFromSelector(@selector(opacity)): [NSNull null], + NSStringFromSelector(@selector(compositingFilter)): [NSNull null], + NSStringFromSelector(@selector(filters)): [NSNull null], + NSStringFromSelector(@selector(backgroundFilters)): [NSNull null], + NSStringFromSelector(@selector(shouldRasterize)): [NSNull null], + NSStringFromSelector(@selector(rasterizationScale)): [NSNull null], + NSStringFromSelector(@selector(shadowColor)): [NSNull null], + NSStringFromSelector(@selector(shadowOpacity)): [NSNull null], + NSStringFromSelector(@selector(shadowOffset)): [NSNull null], + NSStringFromSelector(@selector(shadowRadius)): [NSNull null], + NSStringFromSelector(@selector(shadowPath)): [NSNull null]}.mutableCopy; + + if ([self isKindOfClass:[CAShapeLayer class]]) { + [actions addEntriesFromDictionary:@{NSStringFromSelector(@selector(path)): [NSNull null], + NSStringFromSelector(@selector(fillColor)): [NSNull null], + NSStringFromSelector(@selector(strokeColor)): [NSNull null], + NSStringFromSelector(@selector(strokeStart)): [NSNull null], + NSStringFromSelector(@selector(strokeEnd)): [NSNull null], + NSStringFromSelector(@selector(lineWidth)): [NSNull null], + NSStringFromSelector(@selector(miterLimit)): [NSNull null], + NSStringFromSelector(@selector(lineDashPhase)): [NSNull null]}]; + } + + if ([self isKindOfClass:[CAGradientLayer class]]) { + [actions addEntriesFromDictionary:@{NSStringFromSelector(@selector(colors)): [NSNull null], + NSStringFromSelector(@selector(locations)): [NSNull null], + NSStringFromSelector(@selector(startPoint)): [NSNull null], + NSStringFromSelector(@selector(endPoint)): [NSNull null]}]; + } + + self.actions = actions; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/Color+Lookin.h b/Pods/LookinServer/Src/Main/Shared/Category/Color+Lookin.h new file mode 100644 index 0000000..9a49ab9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/Color+Lookin.h @@ -0,0 +1,27 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// Color+Lookin.h +// LookinShared +// +// Created by 李凯 on 2022/4/2. +// + +#import + +#if TARGET_OS_IPHONE + +#elif TARGET_OS_MAC + +@interface NSColor (Lookin) + ++ (instancetype)lookin_colorFromRGBAComponents:(NSArray *)components; + +- (NSArray *)lookin_rgbaComponents; + +@end + +#endif + + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/Color+Lookin.m b/Pods/LookinServer/Src/Main/Shared/Category/Color+Lookin.m new file mode 100644 index 0000000..4f5ede1 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/Color+Lookin.m @@ -0,0 +1,42 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// Color+Lookin.m +// LookinShared +// +// Created by 李凯 on 2022/4/2. +// + +#import "Image+Lookin.h" + +#if TARGET_OS_IPHONE + +#elif TARGET_OS_MAC + +@implementation NSColor (Lookin) + ++ (instancetype)lookin_colorFromRGBAComponents:(NSArray *)components { + if (!components) { + return nil; + } + if (components.count != 4) { + NSAssert(NO, @""); + return nil; + } + NSColor *color = [NSColor colorWithRed:components[0].doubleValue green:components[1].doubleValue blue:components[2].doubleValue alpha:components[3].doubleValue]; + return color; +} + +- (NSArray *)lookin_rgbaComponents { + NSColor *rgbColor = [self colorUsingColorSpace:NSColorSpace.sRGBColorSpace]; + CGFloat r, g, b, a; + [rgbColor getRed:&r green:&g blue:&b alpha:&a]; + NSArray *rgba = @[@(r), @(g), @(b), @(a)]; + return rgba; +} + +@end + +#endif + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/Image+Lookin.h b/Pods/LookinServer/Src/Main/Shared/Category/Image+Lookin.h new file mode 100644 index 0000000..7fe33c8 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/Image+Lookin.h @@ -0,0 +1,25 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// Image+Lookin.h +// LookinShared +// +// Created by 李凯 on 2022/4/2. +// + +#import + +#if TARGET_OS_IPHONE + +#elif TARGET_OS_MAC + +@interface NSImage (LookinClient) + +- (NSData *)lookin_data; + +@end + +#endif + + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/Image+Lookin.m b/Pods/LookinServer/Src/Main/Shared/Category/Image+Lookin.m new file mode 100644 index 0000000..d285d54 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/Image+Lookin.m @@ -0,0 +1,26 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// Image+Lookin.m +// LookinShared +// +// Created by 李凯 on 2022/4/2. +// + +#import "Image+Lookin.h" + +#if TARGET_OS_IPHONE + +#elif TARGET_OS_MAC + +@implementation NSImage (LookinClient) + +- (NSData *)lookin_data { + return [self TIFFRepresentation]; +} + +@end + +#endif + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/NSArray+Lookin.h b/Pods/LookinServer/Src/Main/Shared/Category/NSArray+Lookin.h new file mode 100644 index 0000000..a66e02a --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/NSArray+Lookin.h @@ -0,0 +1,72 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSArray+Lookin.h +// Lookin +// +// Created by Li Kai on 2018/9/3. +// https://lookin.work +// + +#import "LookinDefines.h" + + + +#import +#import + +@interface NSArray<__covariant ValueType> (Lookin) + +/** + 初始化一个新的 NSArray 并返回,新数组的长度为 count,如果当前数组长度比 count 小则会补充新元素(被补充的元素由 addBlock 返回),如果当前数组长度比 count 大则会舍弃多余的元素,被舍弃的元素会作为参数传入 removeBlock。最终,新数组的所有元素均会作为参数被传入 doBlock。 + */ +- (NSArray *)lookin_resizeWithCount:(NSUInteger)count add:(ValueType (^)(NSUInteger idx))addBlock remove:(void (^)(NSUInteger idx, ValueType obj))removeBlock doNext:(void (^)(NSUInteger idx, ValueType obj))doBlock __attribute__((warn_unused_result)); + ++ (NSArray *)lookin_arrayWithCount:(NSUInteger)count block:(id (^)(NSUInteger idx))block; + +/** + 检查 index 位置是否有元素存在 + */ +- (BOOL)lookin_hasIndex:(NSInteger)index; + +- (NSArray *)lookin_map:(id (^)(NSUInteger idx, ValueType value))block; + +- (NSArray *)lookin_filter:(BOOL (^)( ValueType obj))block; + +- (ValueType)lookin_firstFiltered:(BOOL (^)(ValueType obj))block; + +/// 返回最后一个 block 返回 YES 的元素 +- (ValueType)lookin_lastFiltered:(BOOL (^)(ValueType obj))block; + +- (id)lookin_reduce:(id (^)(id accumulator, NSUInteger idx, ValueType obj))block; + +- (CGFloat)lookin_reduceCGFloat:(CGFloat (^)(CGFloat accumulator, NSUInteger idx, ValueType obj))block initialAccumlator:(CGFloat)initialAccumlator; +- (NSInteger)lookin_reduceInteger:(NSInteger (^)(NSInteger accumulator, NSUInteger idx, ValueType obj))block initialAccumlator:(NSInteger)initialAccumlator; + +- (BOOL)lookin_all:(BOOL (^)(ValueType obj))block; + +- (BOOL)lookin_any:(BOOL (^)(ValueType obj))block; + +- (NSArray *)lookin_arrayByRemovingObject:(ValueType)obj; + +- (NSArray *)lookin_nonredundantArray; + +- (ValueType)lookin_safeObjectAtIndex:(NSInteger)idx; + +/// 字符串长度从短到长,即 length 小的字符串的 idx 更小 +- (NSArray *)lookin_sortedArrayByStringLength; + +@end + +@interface NSMutableArray (Lookin) + +/** + 如果当前数组长度比 count 小则会补充新元素(被补充的元素由 addBlock 返回),如果当前数组长度比 count 大则多余的元素会被作为参数传入 notDequeued。然后从 idx 为 0 算起,前 count 个元素会被作为参数传入 doBlock + */ +- (void)lookin_dequeueWithCount:(NSUInteger)count add:(ValueType (^)(NSUInteger idx))addBlock notDequeued:(void (^)(NSUInteger idx, ValueType obj))notDequeuedBlock doNext:(void (^)(NSUInteger idx, ValueType obj))doBlock; + +- (void)lookin_removeObjectsPassingTest:(BOOL (^)(NSUInteger idx, ValueType obj))block; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/NSArray+Lookin.m b/Pods/LookinServer/Src/Main/Shared/Category/NSArray+Lookin.m new file mode 100644 index 0000000..6df614b --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/NSArray+Lookin.m @@ -0,0 +1,300 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSArray+Lookin.m +// Lookin +// +// Created by Li Kai on 2018/9/3. +// https://lookin.work +// + + + +#import "NSArray+Lookin.h" + +@implementation NSArray (Lookin) + +- (NSArray *)lookin_resizeWithCount:(NSUInteger)count add:(id (^)(NSUInteger idx))addBlock remove:(void (^)(NSUInteger idx, id obj))removeBlock doNext:(void (^)(NSUInteger idx, id obj))doBlock { + NSMutableArray *resultArray = [NSMutableArray arrayWithCapacity:count]; + + for (NSUInteger i = 0; i < count; i++) { + if (self.count > i) { + id obj = [self objectAtIndex:i]; + [resultArray addObject:obj]; + if (doBlock) { + doBlock(i, obj); + } + } else { + if (addBlock) { + id newObj = addBlock(i); + if (newObj) { + [resultArray addObject:newObj]; + if (doBlock) { + doBlock(i, newObj); + } + } else { + NSAssert(NO, @""); + } + } else { + NSAssert(NO, @""); + } + } + } + + if (removeBlock) { + if (self.count > count) { + for (NSUInteger i = count; i < self.count; i++) { + id obj = [self objectAtIndex:i]; + removeBlock(i, obj); + } + } + } + + return [resultArray copy]; +} + ++ (NSArray *)lookin_arrayWithCount:(NSUInteger)count block:(id (^)(NSUInteger idx))block { + NSMutableArray *array = [NSMutableArray arrayWithCapacity:count]; + for (NSUInteger i = 0; i < count; i++) { + id obj = block(i); + if (obj) { + [array addObject:obj]; + } + } + return [array copy]; +} + +- (BOOL)lookin_hasIndex:(NSInteger)index { + if (index == NSNotFound || index < 0) { + return NO; + } + return self.count > index; +} + +- (NSArray *)lookin_map:(id (^)(NSUInteger , id))block { + if (!block) { + NSAssert(NO, @""); + return nil; + } + + NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:self.count]; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + id newObj = block(idx, obj); + if (newObj) { + [array addObject:newObj]; + } + }]; + return [array copy]; +} + +- (NSArray *)lookin_filter:(BOOL (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return nil; + } + + NSMutableArray *mArray = [NSMutableArray array]; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (block(obj)) { + [mArray addObject:obj]; + } + }]; + return [mArray copy]; +} + +- (id)lookin_firstFiltered:(BOOL (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return nil; + } + + __block id targetObj = nil; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (block(obj)) { + targetObj = obj; + *stop = YES; + } + }]; + return targetObj; +} + +- (id)lookin_lastFiltered:(BOOL (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return nil; + } + + __block id targetObj = nil; + [self enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (block(obj)) { + targetObj = obj; + *stop = YES; + } + }]; + return targetObj; +} + +- (id)lookin_reduce:(id (^)(id accumulator, NSUInteger idx, id obj))block { + if (!block) { + NSAssert(NO, @""); + return nil; + } + + __block id accumulator = nil; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + accumulator = block(accumulator, idx, obj); + }]; + return accumulator; +} + +- (CGFloat)lookin_reduceCGFloat:(CGFloat (^)(CGFloat accumulator, NSUInteger idx, id obj))block initialAccumlator:(CGFloat)initialAccumlator { + if (!block) { + NSAssert(NO, @""); + return initialAccumlator; + } + + __block CGFloat accumulator = initialAccumlator; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + accumulator = block(accumulator, idx, obj); + }]; + return accumulator; +} + +- (NSInteger)lookin_reduceInteger:(NSInteger (^)(NSInteger, NSUInteger, id))block initialAccumlator:(NSInteger)initialAccumlator { + if (!block) { + NSAssert(NO, @""); + return initialAccumlator; + } + + __block NSInteger accumulator = initialAccumlator; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + accumulator = block(accumulator, idx, obj); + }]; + return accumulator; +} + +- (BOOL)lookin_all:(BOOL (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return NO; + } + __block BOOL allPass = YES; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + BOOL boolValue = block(obj); + if (!boolValue) { + allPass = NO; + *stop = YES; + } + }]; + return allPass; +} + +- (BOOL)lookin_any:(BOOL (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return NO; + } + __block BOOL anyPass = NO; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + BOOL boolValue = block(obj); + if (boolValue) { + anyPass = YES; + *stop = YES; + } + }]; + return anyPass; +} + +- (NSArray *)lookin_arrayByRemovingObject:(id)obj { + if (!obj || ![self containsObject:obj]) { + return self; + } + NSMutableArray *mutableArray = self.mutableCopy; + [mutableArray removeObject:obj]; + return mutableArray.copy; +} + +- (NSArray *)lookin_nonredundantArray { + NSSet *set = [NSSet setWithArray:self]; + NSArray *newArray = [set allObjects]; + return newArray; +} + +- (id)lookin_safeObjectAtIndex:(NSInteger)idx { + if (idx == NSNotFound || idx < 0) { + return nil; + } + if (self.count <= idx) { + return nil; + } + return [self objectAtIndex:idx]; +} + +- (NSArray *)lookin_sortedArrayByStringLength { + NSArray *sortedArray = [self sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { + if (obj1.length > obj2.length) { + return NSOrderedDescending; + } else if (obj1.length == obj2.length) { + return NSOrderedSame; + } else { + return NSOrderedAscending; + } + }]; + return sortedArray; +} + +@end + +@implementation NSMutableArray (Lookin) + +- (void)lookin_dequeueWithCount:(NSUInteger)count add:(id (^)(NSUInteger idx))addBlock notDequeued:(void (^)(NSUInteger idx, id obj))notDequeuedBlock doNext:(void (^)(NSUInteger idx, id obj))doBlock { + for (NSUInteger i = 0; i < count; i++) { + if ([self lookin_hasIndex:i]) { + id obj = [self objectAtIndex:i]; + if (doBlock) { + doBlock(i, obj); + } + } else { + if (addBlock) { + id newObj = addBlock(i); + if (newObj) { + [self addObject:newObj]; + if (doBlock) { + doBlock(i, newObj); + } + } else { + NSAssert(NO, @""); + } + } else { + NSAssert(NO, @""); + } + } + } + + if (notDequeuedBlock) { + if (self.count > count) { + for (NSUInteger i = count; i < self.count; i++) { + id obj = [self objectAtIndex:i]; + notDequeuedBlock(i, obj); + } + } + } +} + +- (void)lookin_removeObjectsPassingTest:(BOOL (^)(NSUInteger idx, id obj))block { + if (!block) { + return; + } + NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet]; + [self enumerateObjectsUsingBlock:^(id _Nonnull currentObj, NSUInteger idx, BOOL * _Nonnull stop) { + BOOL boolValue = block(idx, currentObj); + if (boolValue) { + [indexSet addIndex:idx]; + } + }]; + [self removeObjectsAtIndexes:indexSet]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/NSObject+Lookin.h b/Pods/LookinServer/Src/Main/Shared/Category/NSObject+Lookin.h new file mode 100644 index 0000000..c8839cf --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/NSObject+Lookin.h @@ -0,0 +1,108 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSObject+Lookin.h +// Lookin +// +// Created by Li Kai on 2018/12/22. +// https://lookin.work +// + +#import "LookinDefines.h" + + + +#import +#import "LookinCodingValueType.h" + +@interface NSObject (Lookin) + +#pragma mark - Data Bind + +/** + 给对象绑定上另一个对象以供后续取出使用,如果 object 传入 nil 则会清除该 key 之前绑定的对象 + + @attention 被绑定的对象会被 strong 强引用 + @note 内部是使用 objc_setAssociatedObject / objc_getAssociatedObject 来实现 + + @code + - (UITableViewCell *)cellForIndexPath:(NSIndexPath *)indexPath { + // 1)在这里给 button 绑定上 indexPath 对象 + [cell lookin_bindObject:indexPath forKey:@"indexPath"]; + } + + - (void)didTapButton:(UIButton *)button { + // 2)在这里取出被点击的 button 的 indexPath 对象 + NSIndexPath *indexPathTapped = [button lookin_getBindObjectForKey:@"indexPath"]; + } + @endcode + */ +- (void)lookin_bindObject:(id)object forKey:(NSString *)key; + +/** + 给对象绑定上另一个对象以供后续取出使用,但相比于 lookin_bindObject:forKey:,该方法不会 strong 强引用传入的 object + */ +- (void)lookin_bindObjectWeakly:(id)object forKey:(NSString *)key; + +/** + 取出之前使用 bind 方法绑定的对象 + */ +- (id)lookin_getBindObjectForKey:(NSString *)key; + +/** + 给对象绑定上一个 double 值以供后续取出使用 + */ +- (void)lookin_bindDouble:(double)doubleValue forKey:(NSString *)key; + +/** + 取出之前用 lookin_bindDouble:forKey: 绑定的值 + */ +- (double)lookin_getBindDoubleForKey:(NSString *)key; + +/** + 给对象绑定上一个 BOOL 值以供后续取出使用 + */ +- (void)lookin_bindBOOL:(BOOL)boolValue forKey:(NSString *)key; + +/** + 取出之前用 lookin_bindBOOL:forKey: 绑定的值 + */ +- (BOOL)lookin_getBindBOOLForKey:(NSString *)key; + +/** + 给对象绑定上一个 long 值以供后续取出使用 + */ +- (void)lookin_bindLong:(long)longValue forKey:(NSString *)key; + +/** + 取出之前用 lookin_bindLong:forKey: 绑定的值 + */ +- (long)lookin_getBindLongForKey:(NSString *)key; + +/** + 给对象绑定上一个 CGPoint 值以供后续取出使用 + */ +- (void)lookin_bindPoint:(CGPoint)pointValue forKey:(NSString *)key; + +/** + 取出之前用 lookin_bindPoint:forKey: 绑定的值 + */ +- (CGPoint)lookin_getBindPointForKey:(NSString *)key; + +/** + 移除之前使用 bind 方法绑定的对象 + */ +- (void)lookin_clearBindForKey:(NSString *)key; + +@end + +@interface NSObject (Lookin_Coding) + +/// 会把 NSImage/UIImage 转换为 NSData,把 NSColor/UIColor 转换回 NSNumber 数组(rgba) +- (id)lookin_encodedObjectWithType:(LookinCodingValueType)type; +/// 会把 NSData 转换回 NSImage/UIImage,把 NSNumber 数组(rgba) 转换为 NSColor/UIColor +- (id)lookin_decodedObjectWithType:(LookinCodingValueType)type; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/NSObject+Lookin.m b/Pods/LookinServer/Src/Main/Shared/Category/NSObject+Lookin.m new file mode 100644 index 0000000..d206613 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/NSObject+Lookin.m @@ -0,0 +1,238 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSObject+Lookin.m +// Lookin +// +// Created by Li Kai on 2018/12/22. +// https://lookin.work +// + +#import "NSObject+Lookin.h" +#import +#import "TargetConditionals.h" +#import "LookinWeakContainer.h" + +@implementation NSObject (Lookin) + +#pragma mark - Data Bind + +static char kAssociatedObjectKey_LookinAllBindObjects; +- (NSMutableDictionary *)lookin_allBindObjects { + NSMutableDictionary *dict = objc_getAssociatedObject(self, &kAssociatedObjectKey_LookinAllBindObjects); + if (!dict) { + dict = [NSMutableDictionary dictionary]; + objc_setAssociatedObject(self, &kAssociatedObjectKey_LookinAllBindObjects, dict, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + return dict; +} + +- (void)lookin_bindObject:(id)object forKey:(NSString *)key { + if (!key.length) { + NSAssert(NO, @""); + return; + } + @synchronized (self) { + if (object) { + [[self lookin_allBindObjects] setObject:object forKey:key]; + } else { + [[self lookin_allBindObjects] removeObjectForKey:key]; + } + } +} + +- (id)lookin_getBindObjectForKey:(NSString *)key { + if (!key.length) { + NSAssert(NO, @""); + return nil; + } + @synchronized (self) { + id storedObj = [[self lookin_allBindObjects] objectForKey:key]; + if ([storedObj isKindOfClass:[LookinWeakContainer class]]) { + storedObj = [(LookinWeakContainer *)storedObj object]; + } + return storedObj; + } +} + +- (void)lookin_bindObjectWeakly:(id)object forKey:(NSString *)key { + if (!key.length) { + NSAssert(NO, @""); + return; + } + if (object) { + LookinWeakContainer *container = [[LookinWeakContainer alloc] init]; + container.object = object; + [self lookin_bindObject:container forKey:key]; + } else { + [self lookin_bindObject:nil forKey:key]; + } +} + +- (void)lookin_bindDouble:(double)doubleValue forKey:(NSString *)key { + [self lookin_bindObject:@(doubleValue) forKey:key]; +} + +- (double)lookin_getBindDoubleForKey:(NSString *)key { + id object = [self lookin_getBindObjectForKey:key]; + if ([object isKindOfClass:[NSNumber class]]) { + double doubleValue = [(NSNumber *)object doubleValue]; + return doubleValue; + + } else { + return 0.0; + } +} + +- (void)lookin_bindBOOL:(BOOL)boolValue forKey:(NSString *)key { + [self lookin_bindObject:@(boolValue) forKey:key]; +} + +- (BOOL)lookin_getBindBOOLForKey:(NSString *)key { + id object = [self lookin_getBindObjectForKey:key]; + if ([object isKindOfClass:[NSNumber class]]) { + BOOL boolValue = [(NSNumber *)object boolValue]; + return boolValue; + + } else { + return NO; + } +} + +- (void)lookin_bindLong:(long)longValue forKey:(NSString *)key { + [self lookin_bindObject:@(longValue) forKey:key]; +} + +- (long)lookin_getBindLongForKey:(NSString *)key { + id object = [self lookin_getBindObjectForKey:key]; + if ([object isKindOfClass:[NSNumber class]]) { + long longValue = [(NSNumber *)object longValue]; + return longValue; + + } else { + return 0; + } +} + +- (void)lookin_bindPoint:(CGPoint)pointValue forKey:(NSString *)key { +#if TARGET_OS_IPHONE + [self lookin_bindObject:[NSValue valueWithCGPoint:pointValue] forKey:key]; +#elif TARGET_OS_MAC + NSPoint nsPoint = NSMakePoint(pointValue.x, pointValue.y); + [self lookin_bindObject:[NSValue valueWithPoint:nsPoint] forKey:key]; +#endif +} + +- (CGPoint)lookin_getBindPointForKey:(NSString *)key { + id object = [self lookin_getBindObjectForKey:key]; + if ([object isKindOfClass:[NSValue class]]) { +#if TARGET_OS_IPHONE + CGPoint pointValue = [(NSValue *)object CGPointValue]; +#elif TARGET_OS_MAC + NSPoint nsPointValue = [(NSValue *)object pointValue]; + CGPoint pointValue = CGPointMake(nsPointValue.x, nsPointValue.y); +#endif + return pointValue; + } else { + return CGPointZero; + } +} + +- (void)lookin_clearBindForKey:(NSString *)key { + [self lookin_bindObject:nil forKey:key]; +} + +@end + +@implementation NSObject (Lookin_Coding) + +- (id)lookin_encodedObjectWithType:(LookinCodingValueType)type { + if (type == LookinCodingValueTypeColor) { + if ([self isKindOfClass:[LookinColor class]]) { + CGFloat r, g, b, a; +#if TARGET_OS_IPHONE + CGFloat white; + if ([(UIColor *)self getRed:&r green:&g blue:&b alpha:&a]) { + // valid + } else if ([(UIColor *)self getWhite:&white alpha:&a]) { + r = white; + g = white; + b = white; + } else { + NSAssert(NO, @""); + r = 0; + g = 0; + b = 0; + a = 0; + } +#elif TARGET_OS_MAC + NSColor *color = [((NSColor *)self) colorUsingColorSpace:NSColorSpace.sRGBColorSpace]; + [color getRed:&r green:&g blue:&b alpha:&a]; +#endif + NSArray *rgba = @[@(r), @(g), @(b), @(a)]; + return rgba; + + } else { + NSAssert(NO, @""); + return nil; + } + + } else if (type == LookinCodingValueTypeImage) { +#if TARGET_OS_IPHONE + if ([self isKindOfClass:[UIImage class]]) { + UIImage *image = (UIImage *)self; + return UIImagePNGRepresentation(image); + + } else { + NSAssert(NO, @""); + return nil; + } +#elif TARGET_OS_MAC + if ([self isKindOfClass:[NSImage class]]) { + NSImage *image = (NSImage *)self; + return [image TIFFRepresentation]; + + } else { + NSAssert(NO, @""); + return nil; + } +#endif + + } else { + return self; + } +} + +- (id)lookin_decodedObjectWithType:(LookinCodingValueType)type { + if (type == LookinCodingValueTypeColor) { + if ([self isKindOfClass:[NSArray class]]) { + NSArray *rgba = (NSArray *)self; + CGFloat r = [rgba[0] doubleValue]; + CGFloat g = [rgba[1] doubleValue]; + CGFloat b = [rgba[2] doubleValue]; + CGFloat a = [rgba[3] doubleValue]; + LookinColor *color = [LookinColor colorWithRed:r green:g blue:b alpha:a]; + return color; + + } else { + NSAssert(NO, @""); + return nil; + } + + } else if (type == LookinCodingValueTypeImage) { + if ([self isKindOfClass:[NSData class]]) { + LookinImage *image = [[LookinImage alloc] initWithData:(NSData *)self]; + return image; + } else { + NSAssert(NO, @""); + return nil; + } + + } else { + return self; + } +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/NSSet+Lookin.h b/Pods/LookinServer/Src/Main/Shared/Category/NSSet+Lookin.h new file mode 100644 index 0000000..f09a704 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/NSSet+Lookin.h @@ -0,0 +1,39 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSSet+Lookin.h +// Lookin +// +// Created by Li Kai on 2019/1/13. +// https://lookin.work +// + +#import "LookinDefines.h" + + + +#import "TargetConditionals.h" +#if TARGET_OS_IPHONE +#import +#elif TARGET_OS_MAC +#import +#endif + +@interface NSSet<__covariant ValueType> (Lookin) + +- (NSSet *)lookin_map:(id (^)(ValueType obj))block; + +- (ValueType)lookin_firstFiltered:(BOOL (^)(ValueType obj))block; + +- (NSSet *)lookin_filter:(BOOL (^)(ValueType obj))block; + + +/** + 是否有任何一个元素满足某条件 + @note 元素将被依次传入 block 里,如果任何一个 block 返回 YES,则该方法返回 YES。如果所有 block 均返回 NO,则该方法返回 NO。 + */ +- (BOOL)lookin_any:(BOOL (^)(ValueType obj))block; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/NSSet+Lookin.m b/Pods/LookinServer/Src/Main/Shared/Category/NSSet+Lookin.m new file mode 100644 index 0000000..1ec9edf --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/NSSet+Lookin.m @@ -0,0 +1,81 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSSet+Lookin.m +// Lookin +// +// Created by Li Kai on 2019/1/13. +// https://lookin.work +// + + + +#import "NSSet+Lookin.h" + +@implementation NSSet (Lookin) + +- (NSSet *)lookin_map:(id (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return nil; + } + + NSMutableSet *newSet = [NSMutableSet setWithCapacity:self.count]; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) { + id newObj = block(obj); + if (newObj) { + [newSet addObject:newObj]; + } + }]; + return [newSet copy]; +} + +- (id)lookin_firstFiltered:(BOOL (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return nil; + } + + __block id targetObj = nil; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) { + if (block(obj)) { + targetObj = obj; + *stop = YES; + } + }]; + return targetObj; +} + +- (NSSet *)lookin_filter:(BOOL (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return nil; + } + + NSMutableSet *mSet = [NSMutableSet set]; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) { + if (block(obj)) { + [mSet addObject:obj]; + } + }]; + return [mSet copy]; +} + +- (BOOL)lookin_any:(BOOL (^)(id obj))block { + if (!block) { + NSAssert(NO, @""); + return NO; + } + __block BOOL boolValue = NO; + [self enumerateObjectsUsingBlock:^(id _Nonnull obj, BOOL * _Nonnull stop) { + if (block(obj)) { + boolValue = YES; + *stop = YES; + } + }]; + return boolValue; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/NSString+Lookin.h b/Pods/LookinServer/Src/Main/Shared/Category/NSString+Lookin.h new file mode 100644 index 0000000..15f1171 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/NSString+Lookin.h @@ -0,0 +1,42 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSString+Lookin.h +// Lookin +// +// Created by Li Kai on 2019/5/11. +// https://lookin.work +// + +#import "LookinDefines.h" + + + +#import + +@interface NSString (Lookin) + +/** + 把 CGFloat 转成字符串,最多保留 3 位小数,转换后末尾的 0 会被删除 + 如:1.2341 => @"1.234", 2.1002 => @"2.1", 3.000 => @"3" + */ ++ (NSString *)lookin_stringFromDouble:(double)doubleValue decimal:(NSUInteger)decimal; + ++ (NSString *)lookin_stringFromRect:(CGRect)rect; + ++ (NSString *)lookin_stringFromInset:(LookinInsets)insets; + ++ (NSString *)lookin_stringFromSize:(CGSize)size; + ++ (NSString *)lookin_stringFromPoint:(CGPoint)point; + ++ (NSString *)lookin_rgbaStringFromColor:(LookinColor *)color; + +- (NSString *)lookin_safeInitWithUTF8String:(const char *)string; + +/// 把 1.2.3 这种 String 版本号转换成数字,可用于大小比较,如 110205 代表 11.2.5 版本 +- (NSInteger)lookin_numbericOSVersion; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Category/NSString+Lookin.m b/Pods/LookinServer/Src/Main/Shared/Category/NSString+Lookin.m new file mode 100644 index 0000000..9b76fb5 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Category/NSString+Lookin.m @@ -0,0 +1,117 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// NSString+Lookin.m +// Lookin +// +// Created by Li Kai on 2019/5/11. +// https://lookin.work +// + + + +#import "NSString+Lookin.h" + +@implementation NSString (Lookin) + ++ (NSString *)lookin_stringFromDouble:(double)doubleValue decimal:(NSUInteger)decimal { + NSString *formatString = [NSString stringWithFormat:@"%%.%@f", @(decimal)]; + NSString *string = [NSString stringWithFormat:formatString, doubleValue]; + for (int i = 0; i < decimal; i++) { + if ([[string substringFromIndex:string.length - 1] isEqualToString:@"0"]) { + string = [string substringToIndex:string.length - 1]; + } + } + if ([[string substringFromIndex:string.length - 1] isEqualToString:@"."]) { + string = [string substringToIndex:string.length - 1]; + } + return string; +} + ++ (NSString *)lookin_stringFromInset:(LookinInsets)insets { + return [NSString stringWithFormat:@"{%@, %@, %@, %@}", + [NSString lookin_stringFromDouble:insets.top decimal:2], + [NSString lookin_stringFromDouble:insets.left decimal:2], + [NSString lookin_stringFromDouble:insets.bottom decimal:2], + [NSString lookin_stringFromDouble:insets.right decimal:2]]; +} + ++ (NSString *)lookin_stringFromSize:(CGSize)size { + return [NSString stringWithFormat:@"{%@, %@}", + [NSString lookin_stringFromDouble:size.width decimal:2], + [NSString lookin_stringFromDouble:size.height decimal:2]]; +} + + ++ (NSString *)lookin_stringFromPoint:(CGPoint)point { + return [NSString stringWithFormat:@"{%@, %@}", + [NSString lookin_stringFromDouble:point.x decimal:2], + [NSString lookin_stringFromDouble:point.y decimal:2]]; +} + ++ (NSString *)lookin_stringFromRect:(CGRect)rect { + return [NSString stringWithFormat:@"{%@, %@, %@, %@}", + [NSString lookin_stringFromDouble:rect.origin.x decimal:2], + [NSString lookin_stringFromDouble:rect.origin.y decimal:2], + [NSString lookin_stringFromDouble:rect.size.width decimal:2], + [NSString lookin_stringFromDouble:rect.size.height decimal:2]]; +} + ++ (NSString *)lookin_rgbaStringFromColor:(LookinColor *)color { + if (!color) { + return @"nil"; + } + +#if TARGET_OS_IPHONE + UIColor *rgbColor = color; +#elif TARGET_OS_MAC + NSColor *rgbColor = [color colorUsingColorSpace:NSColorSpace.sRGBColorSpace]; +#endif + + CGFloat r, g, b, a; + [rgbColor getRed:&r green:&g blue:&b alpha:&a]; + + NSString *colorDesc; + if (a >= 1) { + colorDesc = [NSString stringWithFormat:@"(%.0f, %.0f, %.0f)", r * 255, g * 255, b * 255]; + } else { + colorDesc = [NSString stringWithFormat:@"(%.0f, %.0f, %.0f, %@)", r * 255, g * 255, b * 255, [NSString lookin_stringFromDouble:a decimal:2]]; + + } + + return colorDesc; +} + +- (NSString *)lookin_safeInitWithUTF8String:(const char *)string { + if (NULL != string) { + return [self initWithUTF8String:string]; + } + return nil; +} + +- (NSInteger)lookin_numbericOSVersion { + if (self.length == 0) { + NSAssert(NO, @""); + return 0; + } + NSArray *versionArr = [self componentsSeparatedByString:@"."]; + if (versionArr.count != 3) { + NSAssert(NO, @""); + return 0; + } + + NSInteger numbericOSVersion = 0; + NSInteger pos = 0; + + while ([versionArr count] > pos && pos < 3) { + numbericOSVersion += ([[versionArr objectAtIndex:pos] integerValue] * pow(10, (4 - pos * 2))); + pos++; + } + + return numbericOSVersion; +} + + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAppInfo.h b/Pods/LookinServer/Src/Main/Shared/LookinAppInfo.h new file mode 100644 index 0000000..1082d12 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAppInfo.h @@ -0,0 +1,72 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAppInfo.h +// qmuidemo +// +// Created by Li Kai on 2018/11/3. +// Copyright © 2018 QMUI Team. All rights reserved. +// + + + +#import "LookinDefines.h" + +typedef NS_ENUM(NSInteger, LookinAppInfoDevice) { + LookinAppInfoDeviceSimulator, // 模拟器 + LookinAppInfoDeviceIPad, // iPad 真机 + LookinAppInfoDeviceOthers // 应该视为 iPhone 真机 +}; + +@interface LookinAppInfo : NSObject + +/// 每次启动 app 时都会随机生成一个 appInfoIdentifier 直到 app 被 kill 掉 +@property(nonatomic, assign) NSUInteger appInfoIdentifier; +/// mac 端应该先读取该属性,如果为 YES 则表示应该使用之前保存的旧 appInfo 对象即可 +@property(nonatomic, assign) BOOL shouldUseCache; +/// LookinServer 的版本 +@property(nonatomic, assign) int serverVersion; +/// 类似 "1.1.9",只在 1.2.3 以及之后的 LookinServer 版本里有值 +@property(nonatomic, assign) NSString *serverReadableVersion; +/// 如果 iOS 侧使用了 SPM 或引入了 Swift Subspec,则该属性为 1 +/// 如果 iOS 侧没使用,则该属性为 -1 +/// 如果不知道,则该属性为 0 +@property(nonatomic, assign) int swiftEnabledInLookinServer; +/// app 的当前截图 +@property(nonatomic, strong) LookinImage *screenshot; +/// 可能为 nil,比如新建的 iOS 空项目 +@property(nonatomic, strong) LookinImage *appIcon; +/// @"微信读书" +@property(nonatomic, copy) NSString *appName; +/// hughkli.lookin +@property(nonatomic, copy) NSString *appBundleIdentifier; +/// @"iPhone X" +@property(nonatomic, copy) NSString *deviceDescription; +/// @"12.1" +@property(nonatomic, copy) NSString *osDescription; +/// 返回 os 的主版本号,比如 iOS 12.1 的设备将返回 12,iOS 13.2.1 的设备将返回 13 +@property(nonatomic, assign) NSUInteger osMainVersion; +/// 设备类型 +@property(nonatomic, assign) LookinAppInfoDevice deviceType; +/// 屏幕的宽度 +@property(nonatomic, assign) double screenWidth; +/// 屏幕的高度 +@property(nonatomic, assign) double screenHeight; +/// 是几倍的屏幕 +@property(nonatomic, assign) double screenScale; + +- (BOOL)isEqualToAppInfo:(LookinAppInfo *)info; + +#if TARGET_OS_IPHONE + ++ (LookinAppInfo *)currentInfoWithScreenshot:(BOOL)hasScreenshot icon:(BOOL)hasIcon localIdentifiers:(NSArray *)localIdentifiers; + +#else + +@property(nonatomic, assign) NSTimeInterval cachedTimestamp; + +#endif + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAppInfo.m b/Pods/LookinServer/Src/Main/Shared/LookinAppInfo.m new file mode 100644 index 0000000..b1c0c50 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAppInfo.m @@ -0,0 +1,242 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAppInfo.m +// qmuidemo +// +// Created by Li Kai on 2018/11/3. +// Copyright © 2018 QMUI Team. All rights reserved. +// + + + +#import "LookinAppInfo.h" +#import "LKS_MultiplatformAdapter.h" + +static NSString * const CodingKey_AppIcon = @"1"; +static NSString * const CodingKey_Screenshot = @"2"; +static NSString * const CodingKey_DeviceDescription = @"3"; +static NSString * const CodingKey_OsDescription = @"4"; +static NSString * const CodingKey_AppName = @"5"; +static NSString * const CodingKey_ScreenWidth = @"6"; +static NSString * const CodingKey_ScreenHeight = @"7"; +static NSString * const CodingKey_DeviceType = @"8"; + +@implementation LookinAppInfo + +- (id)copyWithZone:(NSZone *)zone { + LookinAppInfo *newAppInfo = [[LookinAppInfo allocWithZone:zone] init]; + newAppInfo.appIcon = self.appIcon; + newAppInfo.appName = self.appName; + newAppInfo.deviceDescription = self.deviceDescription; + newAppInfo.osDescription = self.osDescription; + newAppInfo.osMainVersion = self.osMainVersion; + newAppInfo.deviceType = self.deviceType; + newAppInfo.screenWidth = self.screenWidth; + newAppInfo.screenHeight = self.screenHeight; + newAppInfo.screenScale = self.screenScale; + newAppInfo.appInfoIdentifier = self.appInfoIdentifier; + return newAppInfo; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + + self.serverVersion = [aDecoder decodeIntForKey:@"serverVersion"]; + self.serverReadableVersion = [aDecoder decodeObjectForKey:@"serverReadableVersion"]; + self.swiftEnabledInLookinServer = [aDecoder decodeIntForKey:@"swiftEnabledInLookinServer"]; + NSData *screenshotData = [aDecoder decodeObjectForKey:CodingKey_Screenshot]; + self.screenshot = [[LookinImage alloc] initWithData:screenshotData]; + + NSData *appIconData = [aDecoder decodeObjectForKey:CodingKey_AppIcon]; + self.appIcon = [[LookinImage alloc] initWithData:appIconData]; + + self.appName = [aDecoder decodeObjectForKey:CodingKey_AppName]; + self.appBundleIdentifier = [aDecoder decodeObjectForKey:@"appBundleIdentifier"]; + self.deviceDescription = [aDecoder decodeObjectForKey:CodingKey_DeviceDescription]; + self.osDescription = [aDecoder decodeObjectForKey:CodingKey_OsDescription]; + self.osMainVersion = [aDecoder decodeIntegerForKey:@"osMainVersion"]; + self.deviceType = [aDecoder decodeIntegerForKey:CodingKey_DeviceType]; + self.screenWidth = [aDecoder decodeDoubleForKey:CodingKey_ScreenWidth]; + self.screenHeight = [aDecoder decodeDoubleForKey:CodingKey_ScreenHeight]; + self.screenScale = [aDecoder decodeDoubleForKey:@"screenScale"]; + self.appInfoIdentifier = [aDecoder decodeIntegerForKey:@"appInfoIdentifier"]; + self.shouldUseCache = [aDecoder decodeBoolForKey:@"shouldUseCache"]; + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeInt:self.serverVersion forKey:@"serverVersion"]; + [aCoder encodeObject:self.serverReadableVersion forKey:@"serverReadableVersion"]; + [aCoder encodeInt:self.swiftEnabledInLookinServer forKey:@"swiftEnabledInLookinServer"]; + +#if TARGET_OS_IPHONE + NSData *screenshotData = UIImagePNGRepresentation(self.screenshot); + [aCoder encodeObject:screenshotData forKey:CodingKey_Screenshot]; + + NSData *appIconData = UIImagePNGRepresentation(self.appIcon); + [aCoder encodeObject:appIconData forKey:CodingKey_AppIcon]; +#elif TARGET_OS_MAC + NSData *screenshotData = [self.screenshot TIFFRepresentation]; + [aCoder encodeObject:screenshotData forKey:CodingKey_Screenshot]; + + NSData *appIconData = [self.appIcon TIFFRepresentation]; + [aCoder encodeObject:appIconData forKey:CodingKey_AppIcon]; +#endif + + [aCoder encodeObject:self.appName forKey:CodingKey_AppName]; + [aCoder encodeObject:self.appBundleIdentifier forKey:@"appBundleIdentifier"]; + [aCoder encodeObject:self.deviceDescription forKey:CodingKey_DeviceDescription]; + [aCoder encodeObject:self.osDescription forKey:CodingKey_OsDescription]; + [aCoder encodeInteger:self.osMainVersion forKey:@"osMainVersion"]; + [aCoder encodeInteger:self.deviceType forKey:CodingKey_DeviceType]; + [aCoder encodeDouble:self.screenWidth forKey:CodingKey_ScreenWidth]; + [aCoder encodeDouble:self.screenHeight forKey:CodingKey_ScreenHeight]; + [aCoder encodeDouble:self.screenScale forKey:@"screenScale"]; + [aCoder encodeInteger:self.appInfoIdentifier forKey:@"appInfoIdentifier"]; + [aCoder encodeBool:self.shouldUseCache forKey:@"shouldUseCache"]; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[LookinAppInfo class]]) { + return NO; + } + if ([self isEqualToAppInfo:object]) { + return YES; + } + return NO; +} + +- (NSUInteger)hash { + return self.appName.hash ^ self.deviceDescription.hash ^ self.osDescription.hash ^ self.deviceType; +} + +- (BOOL)isEqualToAppInfo:(LookinAppInfo *)info { + if (!info) { + return NO; + } + if ([self.appName isEqualToString:info.appName] && [self.deviceDescription isEqualToString:info.deviceDescription] && [self.osDescription isEqualToString:info.osDescription] && self.deviceType == info.deviceType) { + return YES; + } + return NO; +} + +#if TARGET_OS_IPHONE + ++ (LookinAppInfo *)currentInfoWithScreenshot:(BOOL)hasScreenshot icon:(BOOL)hasIcon localIdentifiers:(NSArray *)localIdentifiers { + NSInteger selfIdentifier = [self getAppInfoIdentifier]; + if ([localIdentifiers containsObject:@(selfIdentifier)]) { + LookinAppInfo *info = [LookinAppInfo new]; + info.appInfoIdentifier = selfIdentifier; + info.shouldUseCache = YES; + return info; + } + + LookinAppInfo *info = [[LookinAppInfo alloc] init]; + info.serverReadableVersion = LOOKIN_SERVER_READABLE_VERSION; +#ifdef LOOKIN_SERVER_SWIFT_ENABLED + info.swiftEnabledInLookinServer = 1; +#else + info.swiftEnabledInLookinServer = -1; +#endif + info.appInfoIdentifier = selfIdentifier; + info.appName = [self appName]; + info.deviceDescription = [UIDevice currentDevice].name; + info.appBundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + if ([self isSimulator]) { + info.deviceType = LookinAppInfoDeviceSimulator; + } else if ([LKS_MultiplatformAdapter isiPad]) { + info.deviceType = LookinAppInfoDeviceIPad; + } else { + info.deviceType = LookinAppInfoDeviceOthers; + } + + info.osDescription = [UIDevice currentDevice].systemVersion; + + NSString *mainVersionStr = [[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."].firstObject; + info.osMainVersion = [mainVersionStr integerValue]; + + CGSize screenSize = [LKS_MultiplatformAdapter mainScreenBounds].size; + info.screenWidth = screenSize.width; + info.screenHeight = screenSize.height; + info.screenScale = [LKS_MultiplatformAdapter mainScreenScale]; + + if (hasScreenshot) { + info.screenshot = [self screenshotImage]; + } + if (hasIcon) { + info.appIcon = [self appIcon]; + } + + return info; +} + ++ (NSString *)appName { + NSDictionary *info = [[NSBundle mainBundle] infoDictionary]; + NSString *displayName = [info objectForKey:@"CFBundleDisplayName"]; + NSString *name = [info objectForKey:@"CFBundleName"]; + return displayName.length ? displayName : name; +} + ++ (UIImage *)appIcon { +#if TARGET_OS_TV + return nil; +#else + NSString *imageName = [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] lastObject]; + if (!imageName.length) { + // 正常情况下拿到的 name 可能比如 “AppIcon60x60”。但某些情况可能为 nil,此时直接 return 否则 [UIImage imageNamed:nil] 可能导致 console 报 "CUICatalog: Invalid asset name supplied: '(null)'" 的错误信息 + return nil; + } + return [UIImage imageNamed:imageName]; +#endif +} + ++ (UIImage *)screenshotImage { + UIWindow *window = [LKS_MultiplatformAdapter keyWindow]; + if (!window) { + return nil; + } + CGSize size = window.bounds.size; + if (size.width <= 0 || size.height <= 0) { + // *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIGraphicsBeginImageContext() failed to allocate CGBitampContext: size={0, 0}, scale=3.000000, bitmapInfo=0x2002. Use UIGraphicsImageRenderer to avoid this assert.' + + // https://github.com/hughkli/Lookin/issues/21 + return nil; + } + UIGraphicsBeginImageContextWithOptions(size, YES, 0.4); + [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES]; + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return image; +} + ++ (BOOL)isSimulator { + if (TARGET_OS_SIMULATOR) { + return YES; + } + return NO; +} + +#endif + ++ (NSInteger)getAppInfoIdentifier { + static dispatch_once_t onceToken; + static NSInteger identifier = 0; + dispatch_once(&onceToken,^{ + identifier = [[NSDate date] timeIntervalSince1970]; + }); + return identifier; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttrIdentifiers.h b/Pods/LookinServer/Src/Main/Shared/LookinAttrIdentifiers.h new file mode 100644 index 0000000..577d532 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttrIdentifiers.h @@ -0,0 +1,257 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttrIdentifiers.h +// Lookin +// +// Created by Li Kai on 2019/9/18. +// https://lookin.work +// + + + +#import + +#pragma mark - Group + +typedef NSString * LookinAttrGroupIdentifier; + +extern LookinAttrGroupIdentifier const LookinAttrGroup_None; +extern LookinAttrGroupIdentifier const LookinAttrGroup_Class; +extern LookinAttrGroupIdentifier const LookinAttrGroup_Relation; +extern LookinAttrGroupIdentifier const LookinAttrGroup_Layout; +extern LookinAttrGroupIdentifier const LookinAttrGroup_AutoLayout; +extern LookinAttrGroupIdentifier const LookinAttrGroup_ViewLayer; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UIImageView; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UILabel; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UIControl; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UIButton; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UIScrollView; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UITableView; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UITextView; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UITextField; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UIVisualEffectView; +extern LookinAttrGroupIdentifier const LookinAttrGroup_UIStackView; + +extern LookinAttrGroupIdentifier const LookinAttrGroup_UserCustom; + +#pragma mark - Section + +typedef NSString * LookinAttrSectionIdentifier; + +extern LookinAttrSectionIdentifier const LookinAttrSec_None; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UserCustom; + +extern LookinAttrSectionIdentifier const LookinAttrSec_Class_Class; + +extern LookinAttrSectionIdentifier const LookinAttrSec_Relation_Relation; + +extern LookinAttrSectionIdentifier const LookinAttrSec_Layout_Frame; +extern LookinAttrSectionIdentifier const LookinAttrSec_Layout_Bounds; +extern LookinAttrSectionIdentifier const LookinAttrSec_Layout_SafeArea; +extern LookinAttrSectionIdentifier const LookinAttrSec_Layout_Position; +extern LookinAttrSectionIdentifier const LookinAttrSec_Layout_AnchorPoint; + +extern LookinAttrSectionIdentifier const LookinAttrSec_AutoLayout_Hugging; +extern LookinAttrSectionIdentifier const LookinAttrSec_AutoLayout_Resistance; +extern LookinAttrSectionIdentifier const LookinAttrSec_AutoLayout_Constraints; +extern LookinAttrSectionIdentifier const LookinAttrSec_AutoLayout_IntrinsicSize; + +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Visibility; +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_InterationAndMasks; +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Corner; +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_BgColor; +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Border; +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Shadow; +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_ContentMode; +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_TintColor; +extern LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Tag; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UIImageView_Name; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIImageView_Open; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UILabel_Text; +extern LookinAttrSectionIdentifier const LookinAttrSec_UILabel_Font; +extern LookinAttrSectionIdentifier const LookinAttrSec_UILabel_NumberOfLines; +extern LookinAttrSectionIdentifier const LookinAttrSec_UILabel_TextColor; +extern LookinAttrSectionIdentifier const LookinAttrSec_UILabel_BreakMode; +extern LookinAttrSectionIdentifier const LookinAttrSec_UILabel_Alignment; +extern LookinAttrSectionIdentifier const LookinAttrSec_UILabel_CanAdjustFont; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UIControl_EnabledSelected; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIControl_VerAlignment; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIControl_HorAlignment; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIControl_QMUIOutsideEdge; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UIButton_ContentInsets; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIButton_TitleInsets; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIButton_ImageInsets; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ContentInset; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_AdjustedInset; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_IndicatorInset; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_Offset; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ContentSize; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_Behavior; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ShowsIndicator; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_Bounce; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ScrollPaging; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ContentTouches; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_Zoom; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_QMUIInitialInset; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UITableView_Style; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITableView_SectionsNumber; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITableView_RowsNumber; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITableView_SeparatorStyle; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITableView_SeparatorColor; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITableView_SeparatorInset; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextView_Basic; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextView_Text; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextView_Font; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextView_TextColor; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextView_Alignment; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextView_ContainerInset; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Text; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Placeholder; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Font; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextField_TextColor; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Alignment; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Clears; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextField_CanAdjustFont; +extern LookinAttrSectionIdentifier const LookinAttrSec_UITextField_ClearButtonMode; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UIVisualEffectView_Style; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIVisualEffectView_QMUIForegroundColor; + +extern LookinAttrSectionIdentifier const LookinAttrSec_UIStackView_Axis; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIStackView_Distribution; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIStackView_Alignment; +extern LookinAttrSectionIdentifier const LookinAttrSec_UIStackView_Spacing; + +#pragma mark - Attr + +typedef NSString * LookinAttrIdentifier; + +extern LookinAttrIdentifier const LookinAttr_None; + +/// 用户自定义的 +extern LookinAttrIdentifier const LookinAttr_UserCustom; + +extern LookinAttrIdentifier const LookinAttr_Class_Class_Class; + +extern LookinAttrIdentifier const LookinAttr_Relation_Relation_Relation; + +extern LookinAttrIdentifier const LookinAttr_Layout_Frame_Frame; +extern LookinAttrIdentifier const LookinAttr_Layout_Bounds_Bounds; +extern LookinAttrIdentifier const LookinAttr_Layout_SafeArea_SafeArea; +extern LookinAttrIdentifier const LookinAttr_Layout_Position_Position; +extern LookinAttrIdentifier const LookinAttr_Layout_AnchorPoint_AnchorPoint; + +extern LookinAttrIdentifier const LookinAttr_AutoLayout_Hugging_Hor; +extern LookinAttrIdentifier const LookinAttr_AutoLayout_Hugging_Ver; +extern LookinAttrIdentifier const LookinAttr_AutoLayout_Resistance_Hor; +extern LookinAttrIdentifier const LookinAttr_AutoLayout_Resistance_Ver; +extern LookinAttrIdentifier const LookinAttr_AutoLayout_Constraints_Constraints; +extern LookinAttrIdentifier const LookinAttr_AutoLayout_IntrinsicSize_Size; + +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Visibility_Hidden; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Visibility_Opacity; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_InterationAndMasks_Interaction; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_InterationAndMasks_MasksToBounds; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Corner_Radius; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_BgColor_BgColor; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Border_Color; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Border_Width; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_Color; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_Opacity; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_Radius; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_OffsetW; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_OffsetH; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_ContentMode_Mode; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_TintColor_Color; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_TintColor_Mode; +extern LookinAttrIdentifier const LookinAttr_ViewLayer_Tag_Tag; + +extern LookinAttrIdentifier const LookinAttr_UIImageView_Name_Name; +extern LookinAttrIdentifier const LookinAttr_UIImageView_Open_Open; + +extern LookinAttrIdentifier const LookinAttr_UILabel_Text_Text; +extern LookinAttrIdentifier const LookinAttr_UILabel_Font_Name; +extern LookinAttrIdentifier const LookinAttr_UILabel_Font_Size; +extern LookinAttrIdentifier const LookinAttr_UILabel_NumberOfLines_NumberOfLines; +extern LookinAttrIdentifier const LookinAttr_UILabel_TextColor_Color; +extern LookinAttrIdentifier const LookinAttr_UILabel_Alignment_Alignment; +extern LookinAttrIdentifier const LookinAttr_UILabel_BreakMode_Mode; +extern LookinAttrIdentifier const LookinAttr_UILabel_CanAdjustFont_CanAdjustFont; + +extern LookinAttrIdentifier const LookinAttr_UIControl_EnabledSelected_Enabled; +extern LookinAttrIdentifier const LookinAttr_UIControl_EnabledSelected_Selected; +extern LookinAttrIdentifier const LookinAttr_UIControl_VerAlignment_Alignment; +extern LookinAttrIdentifier const LookinAttr_UIControl_HorAlignment_Alignment; +extern LookinAttrIdentifier const LookinAttr_UIControl_QMUIOutsideEdge_Edge; + +extern LookinAttrIdentifier const LookinAttr_UIButton_ContentInsets_Insets; +extern LookinAttrIdentifier const LookinAttr_UIButton_TitleInsets_Insets; +extern LookinAttrIdentifier const LookinAttr_UIButton_ImageInsets_Insets; + +extern LookinAttrIdentifier const LookinAttr_UIScrollView_Offset_Offset; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_ContentSize_Size; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_ContentInset_Inset; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_AdjustedInset_Inset; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_Behavior_Behavior; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_IndicatorInset_Inset; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_ScrollPaging_ScrollEnabled; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_ScrollPaging_PagingEnabled; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_Bounce_Ver; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_Bounce_Hor; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_ShowsIndicator_Hor; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_ShowsIndicator_Ver; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_ContentTouches_Delay; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_ContentTouches_CanCancel; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_Zoom_MinScale; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_Zoom_MaxScale; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_Zoom_Scale; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_Zoom_Bounce; +extern LookinAttrIdentifier const LookinAttr_UIScrollView_QMUIInitialInset_Inset; + +extern LookinAttrIdentifier const LookinAttr_UITableView_Style_Style; +extern LookinAttrIdentifier const LookinAttr_UITableView_SectionsNumber_Number; +extern LookinAttrIdentifier const LookinAttr_UITableView_RowsNumber_Number; +extern LookinAttrIdentifier const LookinAttr_UITableView_SeparatorInset_Inset; +extern LookinAttrIdentifier const LookinAttr_UITableView_SeparatorColor_Color; +extern LookinAttrIdentifier const LookinAttr_UITableView_SeparatorStyle_Style; + +extern LookinAttrIdentifier const LookinAttr_UITextView_Font_Name; +extern LookinAttrIdentifier const LookinAttr_UITextView_Font_Size; +extern LookinAttrIdentifier const LookinAttr_UITextView_Basic_Editable; +extern LookinAttrIdentifier const LookinAttr_UITextView_Basic_Selectable; +extern LookinAttrIdentifier const LookinAttr_UITextView_Text_Text; +extern LookinAttrIdentifier const LookinAttr_UITextView_TextColor_Color; +extern LookinAttrIdentifier const LookinAttr_UITextView_Alignment_Alignment; +extern LookinAttrIdentifier const LookinAttr_UITextView_ContainerInset_Inset; + +extern LookinAttrIdentifier const LookinAttr_UITextField_Text_Text; +extern LookinAttrIdentifier const LookinAttr_UITextField_Placeholder_Placeholder; +extern LookinAttrIdentifier const LookinAttr_UITextField_Font_Name; +extern LookinAttrIdentifier const LookinAttr_UITextField_Font_Size; +extern LookinAttrIdentifier const LookinAttr_UITextField_TextColor_Color; +extern LookinAttrIdentifier const LookinAttr_UITextField_Alignment_Alignment; +extern LookinAttrIdentifier const LookinAttr_UITextField_Clears_ClearsOnBeginEditing; +extern LookinAttrIdentifier const LookinAttr_UITextField_Clears_ClearsOnInsertion; +extern LookinAttrIdentifier const LookinAttr_UITextField_CanAdjustFont_CanAdjustFont; +extern LookinAttrIdentifier const LookinAttr_UITextField_CanAdjustFont_MinSize; +extern LookinAttrIdentifier const LookinAttr_UITextField_ClearButtonMode_Mode; + +extern LookinAttrIdentifier const LookinAttr_UIVisualEffectView_Style_Style; +extern LookinAttrIdentifier const LookinAttr_UIVisualEffectView_QMUIForegroundColor_Color; + +extern LookinAttrIdentifier const LookinAttr_UIStackView_Axis_Axis; +extern LookinAttrIdentifier const LookinAttr_UIStackView_Distribution_Distribution; +extern LookinAttrIdentifier const LookinAttr_UIStackView_Alignment_Alignment; +extern LookinAttrIdentifier const LookinAttr_UIStackView_Spacing_Spacing; + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttrIdentifiers.m b/Pods/LookinServer/Src/Main/Shared/LookinAttrIdentifiers.m new file mode 100644 index 0000000..29a1f98 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttrIdentifiers.m @@ -0,0 +1,253 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttrIdentifiers.m +// Lookin +// +// Created by Li Kai on 2019/9/18. +// https://lookin.work +// + + + +#import "LookinAttrIdentifiers.h" + +// value 不能重复(AppDelegate 里的 runTests 有相关 test) +// 如果要去掉某一项可以考虑注释掉而非直接删除,以防止新项和旧项的 value 相同而引发 preference 错乱(这些 value 会被存储到 userDefaults 里) + +#pragma mark - Group + +LookinAttrGroupIdentifier const LookinAttrGroup_None = @"n"; +LookinAttrGroupIdentifier const LookinAttrGroup_Class = @"c"; +LookinAttrGroupIdentifier const LookinAttrGroup_Relation = @"r"; +LookinAttrGroupIdentifier const LookinAttrGroup_Layout = @"l"; +LookinAttrGroupIdentifier const LookinAttrGroup_AutoLayout = @"a"; +LookinAttrGroupIdentifier const LookinAttrGroup_ViewLayer = @"vl"; +LookinAttrGroupIdentifier const LookinAttrGroup_UIImageView = @"i"; +LookinAttrGroupIdentifier const LookinAttrGroup_UILabel = @"la"; +LookinAttrGroupIdentifier const LookinAttrGroup_UIControl = @"co"; +LookinAttrGroupIdentifier const LookinAttrGroup_UIButton = @"b"; +LookinAttrGroupIdentifier const LookinAttrGroup_UIScrollView = @"s"; +LookinAttrGroupIdentifier const LookinAttrGroup_UITableView = @"ta"; +LookinAttrGroupIdentifier const LookinAttrGroup_UITextView = @"te"; +LookinAttrGroupIdentifier const LookinAttrGroup_UITextField = @"tf"; +LookinAttrGroupIdentifier const LookinAttrGroup_UIVisualEffectView = @"ve"; +LookinAttrGroupIdentifier const LookinAttrGroup_UIStackView = @"UIStackView"; + +LookinAttrGroupIdentifier const LookinAttrGroup_UserCustom = @"guc"; // user custom + +#pragma mark - Section + +LookinAttrSectionIdentifier const LookinAttrSec_None = @"n"; + +LookinAttrSectionIdentifier const LookinAttrSec_UserCustom = @"sec_ctm"; + +LookinAttrSectionIdentifier const LookinAttrSec_Class_Class = @"cl_c"; + +LookinAttrSectionIdentifier const LookinAttrSec_Relation_Relation = @"r_r"; + +LookinAttrSectionIdentifier const LookinAttrSec_Layout_Frame = @"l_f"; +LookinAttrSectionIdentifier const LookinAttrSec_Layout_Bounds = @"l_b"; +LookinAttrSectionIdentifier const LookinAttrSec_Layout_SafeArea = @"l_s"; +LookinAttrSectionIdentifier const LookinAttrSec_Layout_Position = @"l_p"; +LookinAttrSectionIdentifier const LookinAttrSec_Layout_AnchorPoint = @"l_a"; + +LookinAttrSectionIdentifier const LookinAttrSec_AutoLayout_Hugging = @"a_h"; +LookinAttrSectionIdentifier const LookinAttrSec_AutoLayout_Resistance = @"a_r"; +LookinAttrSectionIdentifier const LookinAttrSec_AutoLayout_Constraints = @"a_c"; +LookinAttrSectionIdentifier const LookinAttrSec_AutoLayout_IntrinsicSize = @"a_i"; + +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Visibility = @"v_v"; +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_InterationAndMasks = @"v_i"; +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Corner = @"v_c"; +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_BgColor = @"v_b"; +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Border = @"v_bo"; +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Shadow = @"v_s"; +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_ContentMode = @"v_co"; +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_TintColor = @"v_t"; +LookinAttrSectionIdentifier const LookinAttrSec_ViewLayer_Tag = @"v_ta"; + +LookinAttrSectionIdentifier const LookinAttrSec_UIImageView_Name = @"i_n"; +LookinAttrSectionIdentifier const LookinAttrSec_UIImageView_Open = @"i_o"; + +LookinAttrSectionIdentifier const LookinAttrSec_UILabel_Text = @"lb_t"; +LookinAttrSectionIdentifier const LookinAttrSec_UILabel_Font = @"lb_f"; +LookinAttrSectionIdentifier const LookinAttrSec_UILabel_NumberOfLines = @"lb_n"; +LookinAttrSectionIdentifier const LookinAttrSec_UILabel_TextColor = @"lb_tc"; +LookinAttrSectionIdentifier const LookinAttrSec_UILabel_BreakMode = @"lb_b"; +LookinAttrSectionIdentifier const LookinAttrSec_UILabel_Alignment = @"lb_a"; +LookinAttrSectionIdentifier const LookinAttrSec_UILabel_CanAdjustFont = @"lb_c"; + +LookinAttrSectionIdentifier const LookinAttrSec_UIControl_EnabledSelected = @"c_e"; +LookinAttrSectionIdentifier const LookinAttrSec_UIControl_VerAlignment = @"c_v"; +LookinAttrSectionIdentifier const LookinAttrSec_UIControl_HorAlignment = @"c_h"; +LookinAttrSectionIdentifier const LookinAttrSec_UIControl_QMUIOutsideEdge = @"c_o"; + +LookinAttrSectionIdentifier const LookinAttrSec_UIButton_ContentInsets = @"b_c"; +LookinAttrSectionIdentifier const LookinAttrSec_UIButton_TitleInsets = @"b_t"; +LookinAttrSectionIdentifier const LookinAttrSec_UIButton_ImageInsets = @"b_i"; + +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ContentInset = @"s_c"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_AdjustedInset = @"s_a"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_IndicatorInset = @"s_i"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_Offset = @"s_o"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ContentSize = @"s_cs"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_Behavior = @"s_b"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ShowsIndicator = @"s_si"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_Bounce = @"s_bo"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ScrollPaging = @"s_s"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_ContentTouches = @"s_ct"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_Zoom = @"s_z"; +LookinAttrSectionIdentifier const LookinAttrSec_UIScrollView_QMUIInitialInset = @"s_ii"; + +LookinAttrSectionIdentifier const LookinAttrSec_UITableView_Style = @"t_s"; +LookinAttrSectionIdentifier const LookinAttrSec_UITableView_SectionsNumber = @"t_sn"; +LookinAttrSectionIdentifier const LookinAttrSec_UITableView_RowsNumber = @"t_r"; +LookinAttrSectionIdentifier const LookinAttrSec_UITableView_SeparatorStyle = @"t_ss"; +LookinAttrSectionIdentifier const LookinAttrSec_UITableView_SeparatorColor = @"t_sc"; +LookinAttrSectionIdentifier const LookinAttrSec_UITableView_SeparatorInset = @"t_si"; + +LookinAttrSectionIdentifier const LookinAttrSec_UITextView_Basic = @"tv_b"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextView_Text = @"tv_t"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextView_Font = @"tv_f"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextView_TextColor = @"tv_tc"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextView_Alignment = @"tv_a"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextView_ContainerInset = @"tv_c"; + +LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Text = @"tf_t"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Placeholder = @"tf_p"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Font = @"tf_f"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextField_TextColor = @"tf_tc"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Alignment = @"tf_a"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextField_Clears = @"tf_c"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextField_CanAdjustFont = @"tf_ca"; +LookinAttrSectionIdentifier const LookinAttrSec_UITextField_ClearButtonMode = @"tf_cb"; + +LookinAttrSectionIdentifier const LookinAttrSec_UIVisualEffectView_Style = @"ve_s"; +LookinAttrSectionIdentifier const LookinAttrSec_UIVisualEffectView_QMUIForegroundColor = @"ve_f"; + +LookinAttrSectionIdentifier const LookinAttrSec_UIStackView_Axis = @"usv_axis"; +LookinAttrSectionIdentifier const LookinAttrSec_UIStackView_Distribution = @"usv_dis"; +LookinAttrSectionIdentifier const LookinAttrSec_UIStackView_Alignment = @"usv_align"; +LookinAttrSectionIdentifier const LookinAttrSec_UIStackView_Spacing = @"usv_spa"; + +#pragma mark - Attr + +LookinAttrIdentifier const LookinAttr_None = @"n"; +LookinAttrIdentifier const LookinAttr_UserCustom = @"ctm"; + +LookinAttrIdentifier const LookinAttr_Class_Class_Class = @"c_c_c"; + + +LookinAttrIdentifier const LookinAttr_Relation_Relation_Relation = @"r_r_r"; + +LookinAttrIdentifier const LookinAttr_Layout_Frame_Frame = @"l_f_f"; +LookinAttrIdentifier const LookinAttr_Layout_Bounds_Bounds = @"l_b_b"; +LookinAttrIdentifier const LookinAttr_Layout_SafeArea_SafeArea = @"l_s_s"; +LookinAttrIdentifier const LookinAttr_Layout_Position_Position = @"l_p_p"; +LookinAttrIdentifier const LookinAttr_Layout_AnchorPoint_AnchorPoint = @"l_a_a"; + +LookinAttrIdentifier const LookinAttr_AutoLayout_Hugging_Hor = @"al_h_h"; +LookinAttrIdentifier const LookinAttr_AutoLayout_Hugging_Ver = @"al_h_v"; +LookinAttrIdentifier const LookinAttr_AutoLayout_Resistance_Hor = @"al_r_h"; +LookinAttrIdentifier const LookinAttr_AutoLayout_Resistance_Ver = @"al_r_v"; +LookinAttrIdentifier const LookinAttr_AutoLayout_Constraints_Constraints = @"al_c_c"; +LookinAttrIdentifier const LookinAttr_AutoLayout_IntrinsicSize_Size = @"cl_i_s"; + +LookinAttrIdentifier const LookinAttr_ViewLayer_Visibility_Hidden = @"vl_v_h"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Visibility_Opacity = @"vl_v_o"; +LookinAttrIdentifier const LookinAttr_ViewLayer_InterationAndMasks_Interaction = @"vl_i_i"; +LookinAttrIdentifier const LookinAttr_ViewLayer_InterationAndMasks_MasksToBounds = @"vl_i_m"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Corner_Radius = @"vl_c_r"; +LookinAttrIdentifier const LookinAttr_ViewLayer_BgColor_BgColor = @"vl_b_b"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Border_Color = @"vl_b_c"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Border_Width = @"vl_b_w"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_Color = @"vl_s_c"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_Opacity = @"vl_s_o"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_Radius = @"vl_s_r"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_OffsetW = @"vl_s_ow"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Shadow_OffsetH = @"vl_s_oh"; +LookinAttrIdentifier const LookinAttr_ViewLayer_ContentMode_Mode = @"vl_c_m"; +LookinAttrIdentifier const LookinAttr_ViewLayer_TintColor_Color = @"vl_t_c"; +LookinAttrIdentifier const LookinAttr_ViewLayer_TintColor_Mode = @"vl_t_m"; +LookinAttrIdentifier const LookinAttr_ViewLayer_Tag_Tag = @"vl_t_t"; + +LookinAttrIdentifier const LookinAttr_UIImageView_Name_Name = @"iv_n_n"; +LookinAttrIdentifier const LookinAttr_UIImageView_Open_Open = @"iv_o_o"; + +LookinAttrIdentifier const LookinAttr_UILabel_Text_Text = @"lb_t_t"; +LookinAttrIdentifier const LookinAttr_UILabel_Font_Name = @"lb_f_n"; +LookinAttrIdentifier const LookinAttr_UILabel_Font_Size = @"lb_f_s"; +LookinAttrIdentifier const LookinAttr_UILabel_NumberOfLines_NumberOfLines = @"lb_n_n"; +LookinAttrIdentifier const LookinAttr_UILabel_TextColor_Color = @"lb_t_c"; +LookinAttrIdentifier const LookinAttr_UILabel_Alignment_Alignment = @"lb_a_a"; +LookinAttrIdentifier const LookinAttr_UILabel_BreakMode_Mode = @"lb_b_m"; +LookinAttrIdentifier const LookinAttr_UILabel_CanAdjustFont_CanAdjustFont = @"lb_c_c"; + +LookinAttrIdentifier const LookinAttr_UIControl_EnabledSelected_Enabled = @"ct_e_e"; +LookinAttrIdentifier const LookinAttr_UIControl_EnabledSelected_Selected = @"ct_e_s"; +LookinAttrIdentifier const LookinAttr_UIControl_VerAlignment_Alignment = @"ct_v_a"; +LookinAttrIdentifier const LookinAttr_UIControl_HorAlignment_Alignment = @"ct_h_a"; +LookinAttrIdentifier const LookinAttr_UIControl_QMUIOutsideEdge_Edge = @"ct_o_e"; + +LookinAttrIdentifier const LookinAttr_UIButton_ContentInsets_Insets = @"bt_c_i"; +LookinAttrIdentifier const LookinAttr_UIButton_TitleInsets_Insets = @"bt_t_i"; +LookinAttrIdentifier const LookinAttr_UIButton_ImageInsets_Insets = @"bt_i_i"; + +LookinAttrIdentifier const LookinAttr_UIScrollView_Offset_Offset = @"sv_o_o"; +LookinAttrIdentifier const LookinAttr_UIScrollView_ContentSize_Size = @"sv_c_s"; +LookinAttrIdentifier const LookinAttr_UIScrollView_ContentInset_Inset = @"sv_c_i"; +LookinAttrIdentifier const LookinAttr_UIScrollView_AdjustedInset_Inset = @"sv_a_i"; +LookinAttrIdentifier const LookinAttr_UIScrollView_Behavior_Behavior = @"sv_b_b"; +LookinAttrIdentifier const LookinAttr_UIScrollView_IndicatorInset_Inset = @"sv_i_i"; +LookinAttrIdentifier const LookinAttr_UIScrollView_ScrollPaging_ScrollEnabled = @"sv_s_s"; +LookinAttrIdentifier const LookinAttr_UIScrollView_ScrollPaging_PagingEnabled = @"sv_s_p"; +LookinAttrIdentifier const LookinAttr_UIScrollView_Bounce_Ver = @"sv_b_v"; +LookinAttrIdentifier const LookinAttr_UIScrollView_Bounce_Hor = @"sv_b_h"; +LookinAttrIdentifier const LookinAttr_UIScrollView_ShowsIndicator_Hor = @"sv_h_h"; +LookinAttrIdentifier const LookinAttr_UIScrollView_ShowsIndicator_Ver = @"sv_s_v"; +LookinAttrIdentifier const LookinAttr_UIScrollView_ContentTouches_Delay = @"sv_c_d"; +LookinAttrIdentifier const LookinAttr_UIScrollView_ContentTouches_CanCancel = @"sv_c_c"; +LookinAttrIdentifier const LookinAttr_UIScrollView_Zoom_MinScale = @"sv_z_mi"; +LookinAttrIdentifier const LookinAttr_UIScrollView_Zoom_MaxScale = @"sv_z_ma"; +LookinAttrIdentifier const LookinAttr_UIScrollView_Zoom_Scale = @"sv_z_s"; +LookinAttrIdentifier const LookinAttr_UIScrollView_Zoom_Bounce = @"sv_z_b"; +LookinAttrIdentifier const LookinAttr_UIScrollView_QMUIInitialInset_Inset = @"sv_qi_i"; + +LookinAttrIdentifier const LookinAttr_UITableView_Style_Style = @"tv_s_s"; +LookinAttrIdentifier const LookinAttr_UITableView_SectionsNumber_Number = @"tv_s_n"; +LookinAttrIdentifier const LookinAttr_UITableView_RowsNumber_Number = @"tv_r_n"; +LookinAttrIdentifier const LookinAttr_UITableView_SeparatorInset_Inset = @"tv_s_i"; +LookinAttrIdentifier const LookinAttr_UITableView_SeparatorColor_Color = @"tv_s_c"; +LookinAttrIdentifier const LookinAttr_UITableView_SeparatorStyle_Style = @"tv_ss_s"; + +LookinAttrIdentifier const LookinAttr_UITextView_Font_Name = @"te_f_n"; +LookinAttrIdentifier const LookinAttr_UITextView_Font_Size = @"te_f_s"; +LookinAttrIdentifier const LookinAttr_UITextView_Basic_Editable = @"te_b_e"; +LookinAttrIdentifier const LookinAttr_UITextView_Basic_Selectable = @"te_b_s"; +LookinAttrIdentifier const LookinAttr_UITextView_Text_Text = @"te_t_t"; +LookinAttrIdentifier const LookinAttr_UITextView_TextColor_Color = @"te_t_c"; +LookinAttrIdentifier const LookinAttr_UITextView_Alignment_Alignment = @"te_a_a"; +LookinAttrIdentifier const LookinAttr_UITextView_ContainerInset_Inset = @"te_c_i"; + +LookinAttrIdentifier const LookinAttr_UITextField_Text_Text = @"tf_t_t"; +LookinAttrIdentifier const LookinAttr_UITextField_Placeholder_Placeholder = @"tf_p_p"; +LookinAttrIdentifier const LookinAttr_UITextField_Font_Name = @"tf_f_n"; +LookinAttrIdentifier const LookinAttr_UITextField_Font_Size = @"tf_f_s"; +LookinAttrIdentifier const LookinAttr_UITextField_TextColor_Color = @"tf_t_c"; +LookinAttrIdentifier const LookinAttr_UITextField_Alignment_Alignment = @"tf_a_a"; +LookinAttrIdentifier const LookinAttr_UITextField_Clears_ClearsOnBeginEditing = @"tf_c_c"; +LookinAttrIdentifier const LookinAttr_UITextField_Clears_ClearsOnInsertion = @"tf_c_co"; +LookinAttrIdentifier const LookinAttr_UITextField_CanAdjustFont_CanAdjustFont = @"tf_c_ca"; +LookinAttrIdentifier const LookinAttr_UITextField_CanAdjustFont_MinSize = @"tf_c_m"; +LookinAttrIdentifier const LookinAttr_UITextField_ClearButtonMode_Mode = @"tf_cb_m"; + +LookinAttrIdentifier const LookinAttr_UIVisualEffectView_Style_Style = @"ve_s_s"; +LookinAttrIdentifier const LookinAttr_UIVisualEffectView_QMUIForegroundColor_Color = @"ve_f_c"; + +LookinAttrIdentifier const LookinAttr_UIStackView_Axis_Axis = @"usv_axis_axis"; +LookinAttrIdentifier const LookinAttr_UIStackView_Distribution_Distribution = @"usv_dis_dis"; +LookinAttrIdentifier const LookinAttr_UIStackView_Alignment_Alignment = @"usv_ali_ali"; +LookinAttrIdentifier const LookinAttr_UIStackView_Spacing_Spacing = @"usv_spa_spa"; + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttrType.h b/Pods/LookinServer/Src/Main/Shared/LookinAttrType.h new file mode 100644 index 0000000..feba9ce --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttrType.h @@ -0,0 +1,50 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttrIdentifiers.h +// Lookin +// +// Created by Li Kai on 2018/12/1. +// https://lookin.work +// + +/// 注意:新属性只能加到末尾,否则新旧版本搭配时可能有兼容问题 +typedef NS_ENUM(NSInteger, LookinAttrType) { + LookinAttrTypeNone, + LookinAttrTypeVoid, + LookinAttrTypeChar, + LookinAttrTypeInt, + LookinAttrTypeShort, + LookinAttrTypeLong, + LookinAttrTypeLongLong, + LookinAttrTypeUnsignedChar, + LookinAttrTypeUnsignedInt, + LookinAttrTypeUnsignedShort, + LookinAttrTypeUnsignedLong, + LookinAttrTypeUnsignedLongLong, + LookinAttrTypeFloat, + LookinAttrTypeDouble, + LookinAttrTypeBOOL, + LookinAttrTypeSel, + LookinAttrTypeClass, + LookinAttrTypeCGPoint, + LookinAttrTypeCGVector, + LookinAttrTypeCGSize, + LookinAttrTypeCGRect, + LookinAttrTypeCGAffineTransform, + LookinAttrTypeUIEdgeInsets, + LookinAttrTypeUIOffset, + LookinAttrTypeNSString, + LookinAttrTypeEnumInt, + LookinAttrTypeEnumLong, + /// value 实际为 RGBA 数组,即 @[NSNumber, NSNumber, NSNumber, NSNumber],NSNumber 范围是 0 ~ 1 + LookinAttrTypeUIColor, + /// 业务需要根据具体的 AttrIdentifier 来解析 + LookinAttrTypeCustomObj, + + LookinAttrTypeEnumString, + LookinAttrTypeShadow, + LookinAttrTypeJson +}; + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttribute.h b/Pods/LookinServer/Src/Main/Shared/LookinAttribute.h new file mode 100644 index 0000000..d86f298 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttribute.h @@ -0,0 +1,48 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttribute.h +// qmuidemo +// +// Created by Li Kai on 2018/11/17. +// Copyright © 2018 QMUI Team. All rights reserved. +// + +#import "LookinAttrIdentifiers.h" +#import "LookinCodingValueType.h" +#import "LookinAttrType.h" + +@class LookinDisplayItem; + +@interface LookinAttribute : NSObject + +@property(nonatomic, copy) LookinAttrIdentifier identifier; + +/// 只有 Custom Attr 才有该属性 +@property(nonatomic, copy) NSString *displayTitle; + +/// 标识 value 的具体类型(如 double / NSString /...) +@property(nonatomic, assign) LookinAttrType attrType; + +/// 具体的值,需配合 attrType 属性来解析它 +/// 对于 String、Color 等 attyType,该属性可能为 nil +@property(nonatomic, strong) id value; + +/// 额外信息,大部分情况下它是 nil +/// 当 attyType 为 LookinAttrTypeEnumString 时,extraValue 是一个 [String] 且保存了 allEnumCases +@property(nonatomic, strong) id extraValue; + +/// 仅 Custom Attr 可能有该属性 +/// 对于有 retainedSetter 的 Custom Attr,它的 setter 会以 customSetterID 作为 key 被保存到 LKS_CustomAttrSetterManager 里,后续可以通过这个 uniqueID 重新把 setter 从 LKS_CustomAttrSetterManager 里取出来并调用 +@property(nonatomic, copy) NSString *customSetterID; + +#pragma mark - 以下属性不会参与 encode/decode + +/// 标识该 LookinAttribute 对象隶属于哪一个 LookinDisplayItem +@property(nonatomic, weak) LookinDisplayItem *targetDisplayItem; + +- (BOOL)isUserCustom; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttribute.m b/Pods/LookinServer/Src/Main/Shared/LookinAttribute.m new file mode 100644 index 0000000..c0625d7 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttribute.m @@ -0,0 +1,64 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttribute.m +// qmuidemo +// +// Created by Li Kai on 2018/11/17. +// Copyright © 2018 QMUI Team. All rights reserved. +// + + + +#import "LookinAttribute.h" +#import "LookinDisplayItem.h" + +@implementation LookinAttribute + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinAttribute *newAttr = [[LookinAttribute allocWithZone:zone] init]; + newAttr.identifier = self.identifier; + newAttr.displayTitle = self.displayTitle; + newAttr.value = self.value; + newAttr.attrType = self.attrType; + newAttr.extraValue = self.extraValue; + newAttr.customSetterID = self.customSetterID; + return newAttr; +} + +#pragma mark - + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.displayTitle forKey:@"displayTitle"]; + [aCoder encodeObject:self.identifier forKey:@"identifier"]; + [aCoder encodeInteger:self.attrType forKey:@"attrType"]; + [aCoder encodeObject:self.value forKey:@"value"]; + [aCoder encodeObject:self.extraValue forKey:@"extraValue"]; + [aCoder encodeObject:self.customSetterID forKey:@"customSetterID"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.displayTitle = [aDecoder decodeObjectForKey:@"displayTitle"]; + self.identifier = [aDecoder decodeObjectForKey:@"identifier"]; + self.attrType = [aDecoder decodeIntegerForKey:@"attrType"]; + self.value = [aDecoder decodeObjectForKey:@"value"]; + self.extraValue = [aDecoder decodeObjectForKey:@"extraValue"]; + self.customSetterID = [aDecoder decodeObjectForKey:@"customSetterID"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (BOOL)isUserCustom { + return [self.identifier isEqualToString:LookinAttr_UserCustom]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttributeModification.h b/Pods/LookinServer/Src/Main/Shared/LookinAttributeModification.h new file mode 100644 index 0000000..c9357e0 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttributeModification.h @@ -0,0 +1,31 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttributeModification.h +// Lookin +// +// Created by Li Kai on 2018/11/20. +// https://lookin.work +// + + + +#import +#import "LookinAttrType.h" + +@interface LookinAttributeModification : NSObject + +@property(nonatomic, assign) unsigned long targetOid; + +@property(nonatomic, assign) SEL setterSelector; +@property(nonatomic, assign) SEL getterSelector; + +@property(nonatomic, assign) LookinAttrType attrType; +@property(nonatomic, strong) id value; + +/// 1.0.4 开始加入这个参数 +@property(nonatomic, copy) NSString *clientReadableVersion; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttributeModification.m b/Pods/LookinServer/Src/Main/Shared/LookinAttributeModification.m new file mode 100644 index 0000000..39f16c9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttributeModification.m @@ -0,0 +1,40 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttributeModification.m +// Lookin +// +// Created by Li Kai on 2018/11/20. +// https://lookin.work +// + +#import "LookinAttributeModification.h" + +@implementation LookinAttributeModification + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:@(self.targetOid) forKey:@"targetOid"]; + [aCoder encodeObject:NSStringFromSelector(self.setterSelector) forKey:@"setterSelector"]; + [aCoder encodeInteger:self.attrType forKey:@"attrType"]; + [aCoder encodeObject:self.value forKey:@"value"]; + [aCoder encodeObject:self.clientReadableVersion forKey:@"clientReadableVersion"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.targetOid = [[aDecoder decodeObjectForKey:@"targetOid"] unsignedLongValue]; + self.setterSelector = NSSelectorFromString([aDecoder decodeObjectForKey:@"setterSelector"]); + self.attrType = [aDecoder decodeIntegerForKey:@"attrType"]; + self.value = [aDecoder decodeObjectForKey:@"value"]; + self.clientReadableVersion = [aDecoder decodeObjectForKey:@"clientReadableVersion"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttributesGroup.h b/Pods/LookinServer/Src/Main/Shared/LookinAttributesGroup.h new file mode 100644 index 0000000..e8ee7ed --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttributesGroup.h @@ -0,0 +1,41 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttributesGroup.h +// Lookin +// +// Created by Li Kai on 2018/11/19. +// https://lookin.work +// + + + +#import +#import "LookinAttrIdentifiers.h" + +@class LookinAttributesSection; + +/** + In Lookin, a LookinAttributesGroup instance will be rendered as a property card. + + When isUserCustom is false: two LookinAttributesGroup instances will be regard as equal when they has the same LookinAttrGroupIdentifier. + When isUserCustom is true: two LookinAttributesGroup instances will be regard as equal when they has the same title. + 当 isUserCustom 为 false 时:若两个 attrGroup 有相同的 LookinAttrGroupIdentifier,则 isEqual: 返回 YES + */ +@interface LookinAttributesGroup : NSObject + +/// 只有在 identifier 为 custom 时,才存在该值 +@property(nonatomic, copy) NSString *userCustomTitle; + +@property(nonatomic, copy) LookinAttrGroupIdentifier identifier; + +@property(nonatomic, copy) NSArray *attrSections; + +/// 如果是 custom 则返回 userCustomTitle,如果不是 custom 则返回 identifier +- (NSString *)uniqueKey; + +- (BOOL)isUserCustom; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttributesGroup.m b/Pods/LookinServer/Src/Main/Shared/LookinAttributesGroup.m new file mode 100644 index 0000000..49a4825 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttributesGroup.m @@ -0,0 +1,92 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttributesGroup.m +// Lookin +// +// Created by Li Kai on 2018/11/19. +// https://lookin.work +// + + + +#import "LookinAttributesGroup.h" +#import "LookinAttribute.h" +#import "LookinAttributesSection.h" +#import "LookinDashboardBlueprint.h" +#import "NSArray+Lookin.h" + +@implementation LookinAttributesGroup + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinAttributesGroup *newGroup = [[LookinAttributesGroup allocWithZone:zone] init]; + newGroup.userCustomTitle = self.userCustomTitle; + newGroup.identifier = self.identifier; + newGroup.attrSections = [self.attrSections lookin_map:^id(NSUInteger idx, LookinAttributesSection *value) { + return value.copy; + }]; + return newGroup; +} + +#pragma mark - + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.userCustomTitle forKey:@"userCustomTitle"]; + [aCoder encodeObject:self.identifier forKey:@"identifier"]; + [aCoder encodeObject:self.attrSections forKey:@"attrSections"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.userCustomTitle = [aDecoder decodeObjectForKey:@"userCustomTitle"]; + self.identifier = [aDecoder decodeObjectForKey:@"identifier"]; + self.attrSections = [aDecoder decodeObjectForKey:@"attrSections"]; + } + return self; +} + +- (NSUInteger)hash { + return self.uniqueKey.hash; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[LookinAttributesGroup class]]) { + return NO; + } + LookinAttributesGroup *targetObject = object; + + if (![self.identifier isEqualToString:targetObject.identifier]) { + return false; + } + if ([self.identifier isEqualToString:LookinAttrGroup_UserCustom]) { + BOOL ret = [self.userCustomTitle isEqualToString:targetObject.userCustomTitle]; + return ret; + } else { + return true; + } +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (NSString *)uniqueKey { + if ([self.identifier isEqualToString:LookinAttrGroup_UserCustom]) { + return self.userCustomTitle; + } else { + return self.identifier; + } +} + +- (BOOL)isUserCustom { + return [self.identifier isEqualToString:LookinAttrSec_UserCustom]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttributesSection.h b/Pods/LookinServer/Src/Main/Shared/LookinAttributesSection.h new file mode 100644 index 0000000..32ddec8 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttributesSection.h @@ -0,0 +1,35 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttributesSection.h +// Lookin +// +// Created by Li Kai on 2019/3/2. +// https://lookin.work +// + + + +#import +#import "LookinAttrIdentifiers.h" + +@class LookinAttribute; + +typedef NS_ENUM (NSInteger, LookinAttributesSectionStyle) { + LookinAttributesSectionStyleDefault, // 每个 attr 独占一行 + LookinAttributesSectionStyle0, // frame 等卡片使用,前 4 个 attr 每行两个,之后每个 attr 在同一排,每个宽度为 1/4 + LookinAttributesSectionStyle1, // 第一个 attr 在第一排靠左,第二个 attr 在第一排靠右,之后的 attr 每个独占一行 + LookinAttributesSectionStyle2 // 第一排独占一行,剩下的在同一行且均分宽度 +}; + +@interface LookinAttributesSection : NSObject + +@property(nonatomic, copy) LookinAttrSectionIdentifier identifier; + +@property(nonatomic, copy) NSArray *attributes; + +- (BOOL)isUserCustom; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAttributesSection.m b/Pods/LookinServer/Src/Main/Shared/LookinAttributesSection.m new file mode 100644 index 0000000..7617c09 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAttributesSection.m @@ -0,0 +1,56 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAttributesSection.m +// Lookin +// +// Created by Li Kai on 2019/3/2. +// https://lookin.work +// + + + +#import "LookinAttributesSection.h" +#import "LookinAttribute.h" + +#import "NSArray+Lookin.h" + +@implementation LookinAttributesSection + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinAttributesSection *newSection = [[LookinAttributesSection allocWithZone:zone] init]; + newSection.identifier = self.identifier; + newSection.attributes = [self.attributes lookin_map:^id(NSUInteger idx, LookinAttribute *value) { + return value.copy; + }]; + return newSection; +} + +#pragma mark - + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.identifier forKey:@"identifier"]; + [aCoder encodeObject:self.attributes forKey:@"attributes"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.identifier = [aDecoder decodeObjectForKey:@"identifier"]; + self.attributes = [aDecoder decodeObjectForKey:@"attributes"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (BOOL)isUserCustom { + return [self.identifier isEqualToString:LookinAttrSec_UserCustom]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAutoLayoutConstraint.h b/Pods/LookinServer/Src/Main/Shared/LookinAutoLayoutConstraint.h new file mode 100644 index 0000000..3edf865 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAutoLayoutConstraint.h @@ -0,0 +1,51 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAutoLayoutConstraint.h +// Lookin +// +// Created by Li Kai on 2019/9/28. +// https://lookin.work +// + + + +#import "LookinDefines.h" + +@class LookinObject; + +typedef NS_ENUM(NSInteger, LookinConstraintItemType) { + LookinConstraintItemTypeUnknown, + LookinConstraintItemTypeNil, + LookinConstraintItemTypeView, + LookinConstraintItemTypeSelf, + LookinConstraintItemTypeSuper, + LookinConstraintItemTypeLayoutGuide +}; + +@interface LookinAutoLayoutConstraint : NSObject + +#if TARGET_OS_IPHONE ++ (instancetype)instanceFromNSConstraint:(NSLayoutConstraint *)constraint isEffective:(BOOL)isEffective firstItemType:(LookinConstraintItemType)firstItemType secondItemType:(LookinConstraintItemType)secondItemType; +#endif + +@property(nonatomic, assign) BOOL effective; +@property(nonatomic, assign) BOOL active; +@property(nonatomic, assign) BOOL shouldBeArchived; +@property(nonatomic, strong) LookinObject *firstItem; +@property(nonatomic, assign) LookinConstraintItemType firstItemType; +/// iOS 里的 NSLayoutAttribute,注意 iOS 和 macOS 虽然都有 NSLayoutAttribute 但是 value 非常不同,因此这里使用 NSInteger 避免混淆 +@property(nonatomic, assign) NSInteger firstAttribute; +@property(nonatomic, assign) NSLayoutRelation relation; +@property(nonatomic, strong) LookinObject *secondItem; +@property(nonatomic, assign) LookinConstraintItemType secondItemType; +/// iOS 里的 NSLayoutAttribute,注意 iOS 和 macOS 虽然都有 NSLayoutAttribute 但是 value 非常不同,因此这里使用 NSInteger 避免混淆 +@property(nonatomic, assign) NSInteger secondAttribute; +@property(nonatomic, assign) CGFloat multiplier; +@property(nonatomic, assign) CGFloat constant; +@property(nonatomic, assign) CGFloat priority; +@property(nonatomic, copy) NSString *identifier; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinAutoLayoutConstraint.m b/Pods/LookinServer/Src/Main/Shared/LookinAutoLayoutConstraint.m new file mode 100644 index 0000000..a8e4520 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinAutoLayoutConstraint.m @@ -0,0 +1,107 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinAutoLayoutConstraint.m +// Lookin +// +// Created by Li Kai on 2019/9/28. +// https://lookin.work +// + + + +#import "LookinAutoLayoutConstraint.h" +#import "LookinObject.h" + +@implementation LookinAutoLayoutConstraint + +#if TARGET_OS_IPHONE + ++ (instancetype)instanceFromNSConstraint:(NSLayoutConstraint *)constraint isEffective:(BOOL)isEffective firstItemType:(LookinConstraintItemType)firstItemType secondItemType:(LookinConstraintItemType)secondItemType { + LookinAutoLayoutConstraint *instance = [LookinAutoLayoutConstraint new]; + instance.effective = isEffective; + instance.active = constraint.active; + instance.shouldBeArchived = constraint.shouldBeArchived; + instance.firstItem = [LookinObject instanceWithObject:constraint.firstItem]; + instance.firstItemType = firstItemType; + instance.firstAttribute = constraint.firstAttribute; + instance.relation = constraint.relation; + instance.secondItem = [LookinObject instanceWithObject:constraint.secondItem]; + instance.secondItemType = secondItemType; + instance.secondAttribute = constraint.secondAttribute; + instance.multiplier = constraint.multiplier; + instance.constant = constraint.constant; + instance.priority = constraint.priority; + instance.identifier = constraint.identifier; + + return instance; +} + +- (void)setFirstAttribute:(NSInteger)firstAttribute { + _firstAttribute = firstAttribute; + [self _assertUnknownAttribute:firstAttribute]; +} + +- (void)setSecondAttribute:(NSInteger)secondAttribute { + _secondAttribute = secondAttribute; + [self _assertUnknownAttribute:secondAttribute]; +} + +- (void)_assertUnknownAttribute:(NSInteger)attribute { + // 以下几个 assert 用来帮助发现那些系统私有的定义,正式发布时应该去掉这几个 assert + if (attribute > 20 && attribute < 32) { + NSAssert(NO, nil); + } + if (attribute > 37) { + NSAssert(NO, nil); + } +} + +#endif + +#pragma mark - + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeBool:self.effective forKey:@"effective"]; + [aCoder encodeBool:self.active forKey:@"active"]; + [aCoder encodeBool:self.shouldBeArchived forKey:@"shouldBeArchived"]; + [aCoder encodeObject:self.firstItem forKey:@"firstItem"]; + [aCoder encodeInteger:self.firstItemType forKey:@"firstItemType"]; + [aCoder encodeInteger:self.firstAttribute forKey:@"firstAttribute"]; + [aCoder encodeInteger:self.relation forKey:@"relation"]; + [aCoder encodeObject:self.secondItem forKey:@"secondItem"]; + [aCoder encodeInteger:self.secondItemType forKey:@"secondItemType"]; + [aCoder encodeInteger:self.secondAttribute forKey:@"secondAttribute"]; + [aCoder encodeDouble:self.multiplier forKey:@"multiplier"]; + [aCoder encodeDouble:self.constant forKey:@"constant"]; + [aCoder encodeDouble:self.priority forKey:@"priority"]; + [aCoder encodeObject:self.identifier forKey:@"identifier"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.effective = [aDecoder decodeBoolForKey:@"effective"]; + self.active = [aDecoder decodeBoolForKey:@"active"]; + self.shouldBeArchived = [aDecoder decodeBoolForKey:@"shouldBeArchived"]; + self.firstItem = [aDecoder decodeObjectForKey:@"firstItem"]; + self.firstItemType = [aDecoder decodeIntegerForKey:@"firstItemType"]; + self.firstAttribute = [aDecoder decodeIntegerForKey:@"firstAttribute"]; + self.relation = [aDecoder decodeIntegerForKey:@"relation"]; + self.secondItem = [aDecoder decodeObjectForKey:@"secondItem"]; + self.secondItemType = [aDecoder decodeIntegerForKey:@"secondItemType"]; + self.secondAttribute = [aDecoder decodeIntegerForKey:@"secondAttribute"]; + self.multiplier = [aDecoder decodeDoubleForKey:@"multiplier"]; + self.constant = [aDecoder decodeDoubleForKey:@"constant"]; + self.priority = [aDecoder decodeDoubleForKey:@"priority"]; + self.identifier = [aDecoder decodeObjectForKey:@"identifier"]; + } + return self; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinCodingValueType.h b/Pods/LookinServer/Src/Main/Shared/LookinCodingValueType.h new file mode 100644 index 0000000..8349d68 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinCodingValueType.h @@ -0,0 +1,30 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinCodingValueType.h +// Lookin +// +// Created by Li Kai on 2019/2/13. +// https://lookin.work +// + +typedef NS_ENUM(NSInteger, LookinCodingValueType) { + LookinCodingValueTypeUnknown, + LookinCodingValueTypeChar, + LookinCodingValueTypeDouble, + LookinCodingValueTypeFloat, + LookinCodingValueTypeLongLong, +// LookinCodingValueTypePoint, +// LookinCodingValueTypeString, +// LookinCodingValueTypeStringArray, +// LookinCodingValueTypeEdgeInsets, +// LookinCodingValueTypeRect, + LookinCodingValueTypeBOOL, +// LookinCodingValueTypeSize, + LookinCodingValueTypeColor, + LookinCodingValueTypeEnum, +// LookinCodingValueTypeRange, + LookinCodingValueTypeImage +}; + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinConnectionAttachment.h b/Pods/LookinServer/Src/Main/Shared/LookinConnectionAttachment.h new file mode 100644 index 0000000..54a4b90 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinConnectionAttachment.h @@ -0,0 +1,24 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinConnectionAttachment.h +// Lookin +// +// Created by Li Kai on 2019/2/15. +// https://lookin.work +// + + + +#import +#import "LookinCodingValueType.h" + +@interface LookinConnectionAttachment : NSObject + +@property(nonatomic, assign) LookinCodingValueType dataType; + +@property(nonatomic, strong) id data; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinConnectionAttachment.m b/Pods/LookinServer/Src/Main/Shared/LookinConnectionAttachment.m new file mode 100644 index 0000000..99eda1e --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinConnectionAttachment.m @@ -0,0 +1,52 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinConnectionAttachment.m +// Lookin +// +// Created by Li Kai on 2019/2/15. +// https://lookin.work +// + + + +#import "LookinConnectionAttachment.h" +#import "LookinDefines.h" +#import "NSObject+Lookin.h" + +static NSString * const Key_Data = @"0"; +static NSString * const Key_DataType = @"1"; + +@interface LookinConnectionAttachment () + +@end + +@implementation LookinConnectionAttachment + +- (instancetype)init { + if (self = [super init]) { + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + + [aCoder encodeObject:[self.data lookin_encodedObjectWithType:self.dataType] forKey:Key_Data]; + [aCoder encodeInteger:self.dataType forKey:Key_DataType]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.dataType = [aDecoder decodeIntegerForKey:Key_DataType]; + self.data = [[aDecoder decodeObjectForKey:Key_Data] lookin_decodedObjectWithType:self.dataType]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinConnectionResponseAttachment.h b/Pods/LookinServer/Src/Main/Shared/LookinConnectionResponseAttachment.h new file mode 100644 index 0000000..46bb0e9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinConnectionResponseAttachment.h @@ -0,0 +1,36 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinConnectionResponse.h +// Lookin +// +// Created by Li Kai on 2019/1/15. +// https://lookin.work +// + + + +#import +#import "LookinConnectionAttachment.h" + +@interface LookinConnectionResponseAttachment : LookinConnectionAttachment + ++ (instancetype)attachmentWithError:(NSError *)error; + +@property(nonatomic, assign) int lookinServerVersion; + +@property(nonatomic, strong) NSError *error; + +/// 如果为 YES,则表示 app 正处于后台模式,默认为 NO +@property(nonatomic, assign) BOOL appIsInBackground; + +/** + dataTotalCount 为 0 时表示仅有这一个 response,默认为 0 + dataTotalCount 大于 0 时表示可能有多个 response,当所有 response 的 currentDataCount 的总和大于 dataTotalCount 即表示所有 response 已接收完毕 + */ +@property(nonatomic, assign) NSUInteger dataTotalCount; +@property(nonatomic, assign) NSUInteger currentDataCount; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinConnectionResponseAttachment.m b/Pods/LookinServer/Src/Main/Shared/LookinConnectionResponseAttachment.m new file mode 100644 index 0000000..71f62fe --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinConnectionResponseAttachment.m @@ -0,0 +1,62 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinConnectionResponse.m +// Lookin +// +// Created by Li Kai on 2019/1/15. +// https://lookin.work +// + + + +#import "LookinConnectionResponseAttachment.h" +#import "LookinDefines.h" + +@interface LookinConnectionResponseAttachment () + +@end + +@implementation LookinConnectionResponseAttachment + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [super encodeWithCoder:aCoder]; + [aCoder encodeInt:self.lookinServerVersion forKey:@"lookinServerVersion"]; + [aCoder encodeObject:self.error forKey:@"error"]; + [aCoder encodeObject:@(self.dataTotalCount) forKey:@"dataTotalCount"]; + [aCoder encodeObject:@(self.currentDataCount) forKey:@"currentDataCount"]; + [aCoder encodeBool:self.appIsInBackground forKey:@"appIsInBackground"]; +} + +- (instancetype)init { + if (self = [super init]) { + self.lookinServerVersion = LOOKIN_SERVER_VERSION; + self.dataTotalCount = 0; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super initWithCoder:aDecoder]) { + self.lookinServerVersion = [aDecoder decodeIntForKey:@"lookinServerVersion"]; + self.error = [aDecoder decodeObjectForKey:@"error"]; + self.dataTotalCount = [[aDecoder decodeObjectForKey:@"dataTotalCount"] unsignedIntegerValue]; + self.currentDataCount = [[aDecoder decodeObjectForKey:@"currentDataCount"] unsignedIntegerValue]; + self.appIsInBackground = [aDecoder decodeBoolForKey:@"appIsInBackground"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + ++ (instancetype)attachmentWithError:(NSError *)error { + LookinConnectionResponseAttachment *attachment = [LookinConnectionResponseAttachment new]; + attachment.error = error; + return attachment; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinCustomAttrModification.h b/Pods/LookinServer/Src/Main/Shared/LookinCustomAttrModification.h new file mode 100644 index 0000000..1be7926 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinCustomAttrModification.h @@ -0,0 +1,20 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LookinCustomAttrModification.h +// LookinShared +// +// Created by likaimacbookhome on 2023/11/4. +// + +#import +#import "LookinAttrType.h" + +@interface LookinCustomAttrModification : NSObject + +@property(nonatomic, assign) LookinAttrType attrType; +@property(nonatomic, copy) NSString *customSetterID; +@property(nonatomic, strong) id value; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinCustomAttrModification.m b/Pods/LookinServer/Src/Main/Shared/LookinCustomAttrModification.m new file mode 100644 index 0000000..6d49016 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinCustomAttrModification.m @@ -0,0 +1,34 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LookinCustomAttrModification.m +// LookinShared +// +// Created by likaimacbookhome on 2023/11/4. +// + +#import "LookinCustomAttrModification.h" + +@implementation LookinCustomAttrModification + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeInteger:self.attrType forKey:@"attrType"]; + [aCoder encodeObject:self.value forKey:@"value"]; + [aCoder encodeObject:self.customSetterID forKey:@"customSetterID"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.attrType = [aDecoder decodeIntegerForKey:@"attrType"]; + self.value = [aDecoder decodeObjectForKey:@"value"]; + self.customSetterID = [aDecoder decodeObjectForKey:@"customSetterID"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinCustomDisplayItemInfo.h b/Pods/LookinServer/Src/Main/Shared/LookinCustomDisplayItemInfo.h new file mode 100644 index 0000000..a74d6ed --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinCustomDisplayItemInfo.h @@ -0,0 +1,21 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER +// +// LookinCustomDisplayItemInfo.h +// LookinServer +// +// Created by likai.123 on 2023/11/1. +// + +#import + +@interface LookinCustomDisplayItemInfo : NSObject + +/// 该属性可能有值(CGRect)也可能是 nil(nil 时则表示无图像) +@property(nonatomic, strong) NSValue *frameInWindow; +@property(nonatomic, copy) NSString *title; +@property(nonatomic, copy) NSString *subtitle; +@property(nonatomic, copy) NSString *danceuiSource; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinCustomDisplayItemInfo.m b/Pods/LookinServer/Src/Main/Shared/LookinCustomDisplayItemInfo.m new file mode 100644 index 0000000..a59778a --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinCustomDisplayItemInfo.m @@ -0,0 +1,59 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinCustomDisplayItemInfo.m +// LookinServer +// +// Created by likai.123 on 2023/11/1. +// + +#import "LookinCustomDisplayItemInfo.h" +#if TARGET_OS_IPHONE +#import +#endif + +@implementation LookinCustomDisplayItemInfo + +- (id)copyWithZone:(NSZone *)zone { + LookinCustomDisplayItemInfo *newInstance = [[LookinCustomDisplayItemInfo allocWithZone:zone] init]; + + if (self.frameInWindow) { +#if TARGET_OS_IPHONE + CGRect rect = [self.frameInWindow CGRectValue]; + newInstance.frameInWindow = [NSValue valueWithCGRect:rect]; +#elif TARGET_OS_MAC + CGRect rect = [self.frameInWindow rectValue]; + newInstance.frameInWindow = [NSValue valueWithRect:rect]; +#endif + } + newInstance.title = self.title; + newInstance.subtitle = self.subtitle; + newInstance.danceuiSource = self.danceuiSource; + + return newInstance; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.frameInWindow forKey:@"frameInWindow"]; + [aCoder encodeObject:self.title forKey:@"title"]; + [aCoder encodeObject:self.subtitle forKey:@"subtitle"]; + [aCoder encodeObject:self.danceuiSource forKey:@"danceuiSource"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.frameInWindow = [aDecoder decodeObjectForKey:@"frameInWindow"]; + self.title = [aDecoder decodeObjectForKey:@"title"]; + self.subtitle = [aDecoder decodeObjectForKey:@"subtitle"]; + self.danceuiSource = [aDecoder decodeObjectForKey:@"danceuiSource"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinDashboardBlueprint.h b/Pods/LookinServer/Src/Main/Shared/LookinDashboardBlueprint.h new file mode 100644 index 0000000..361789a --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinDashboardBlueprint.h @@ -0,0 +1,77 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinDashboardBlueprint.h +// Lookin +// +// Created by Li Kai on 2019/6/5. +// https://lookin.work +// + + + +#import +#import "LookinAttrIdentifiers.h" +#import "LookinAttrType.h" + +/** + 该对象定义了: + - 每一个 Attr 的信息 + - 哪些 GroupID, SectionID, AttrID 是合法的 + - 这些 ID 的父子顺序,比如 LookinAttrGroup_Frame 包含哪些 Section + - 这些 ID 展示顺序(比如哪个 Group 在前、哪个 Group 在后) + */ +@interface LookinDashboardBlueprint : NSObject + ++ (NSArray *)groupIDs; + ++ (NSArray *)sectionIDsForGroupID:(LookinAttrGroupIdentifier)groupID; + ++ (NSArray *)attrIDsForSectionID:(LookinAttrSectionIdentifier)sectionID; + +/// 返回包含目标 attr 的 groupID 和 sectionID ++ (void)getHostGroupID:(inout LookinAttrGroupIdentifier *)groupID sectionID:(inout LookinAttrSectionIdentifier *)sectionID fromAttrID:(LookinAttrIdentifier)attrID; + +/// 返回某个 group 的标题 ++ (NSString *)groupTitleWithGroupID:(LookinAttrGroupIdentifier)groupID; + +/// 返回某个 section 的标题,nil 则表示不显示标题 ++ (NSString *)sectionTitleWithSectionID:(LookinAttrSectionIdentifier)secID; + +/// 当某个 LookinAttribute 确定是 NSObject 类型时,该方法返回它具体是什么对象,比如 UIColor 等 ++ (LookinAttrType)objectAttrTypeWithAttrID:(LookinAttrIdentifier)attrID; + +/// 返回某个 LookinAttribute 代表的属性是哪一个类拥有的,比如 LookinAttrSec_UILabel_TextColor 是 UILabel 才有的 ++ (NSString *)classNameWithAttrID:(LookinAttrIdentifier)attrID; + +/// 一个 attr 要么属于 UIView 要么属于 CALayer,如果它属于 UIView 那么该方法返回 YES ++ (BOOL)isUIViewPropertyWithAttrID:(LookinAttrIdentifier)attrID; + +/// 如果某个 attribute 是 enum,则这里会返回相应的 enum 的名称(如 @"NSTextAlignment"),进而可通过这个名称查询可用的枚举值列表 ++ (NSString *)enumListNameWithAttrID:(LookinAttrIdentifier)attrID; + +/// 如果返回 YES,则说明用户在 Lookin 里修改了该 Attribute 的值后,应该重新拉取和更新相关图层的位置、截图等信息 ++ (BOOL)needPatchAfterModificationWithAttrID:(LookinAttrIdentifier)attrID; + +/// 完整的名字 ++ (NSString *)fullTitleWithAttrID:(LookinAttrIdentifier)attrID; + +/// 在某些 textField 和 checkbox 里会显示这里返回的 title ++ (NSString *)briefTitleWithAttrID:(LookinAttrIdentifier)attrID; + +/// 获取 getter 方法 ++ (SEL)getterWithAttrID:(LookinAttrIdentifier)attrID; + +/// 获取 setter 方法 ++ (SEL)setterWithAttrID:(LookinAttrIdentifier)attrID; + +/// 获取 “hideIfNil” 的值。如果为 YES,则当读取 getter 获取的 value 为 nil 时,Lookin 不会传输该 attr +/// 如果为 NO,则即使 value 为 nil 也会传输(比如 label 的 text 属性,即使它是 nil 我们也要显示,所以它的 hideIfNil 应该为 NO) ++ (BOOL)hideIfNilWithAttrID:(LookinAttrIdentifier)attrID; + +/// 该属性需要的最低的 iOS 版本,比如 safeAreaInsets 从 iOS 11.0 开始出现,则该方法返回 11,如果返回 0 则表示不限制 iOS 版本(注意 Lookin 项目仅支持 iOS 8.0+) ++ (NSInteger)minAvailableOSVersionWithAttrID:(LookinAttrIdentifier)attrID; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinDashboardBlueprint.m b/Pods/LookinServer/Src/Main/Shared/LookinDashboardBlueprint.m new file mode 100644 index 0000000..3daf035 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinDashboardBlueprint.m @@ -0,0 +1,1196 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinDashboardBlueprint.m +// Lookin +// +// Created by Li Kai on 2019/6/5. +// https://lookin.work +// + + + +#import "LookinDashboardBlueprint.h" + +@implementation LookinDashboardBlueprint + ++ (NSArray *)groupIDs { + static NSArray *array; + static dispatch_once_t onceToken; + dispatch_once(&onceToken,^{ + array = @[ + LookinAttrGroup_Class, + LookinAttrGroup_Relation, + LookinAttrGroup_Layout, + LookinAttrGroup_AutoLayout, + LookinAttrGroup_ViewLayer, + LookinAttrGroup_UIStackView, + LookinAttrGroup_UIVisualEffectView, + LookinAttrGroup_UIImageView, + LookinAttrGroup_UILabel, + LookinAttrGroup_UIControl, + LookinAttrGroup_UIButton, + LookinAttrGroup_UIScrollView, + LookinAttrGroup_UITableView, + LookinAttrGroup_UITextView, + LookinAttrGroup_UITextField + ]; + }); + return array; +} + ++ (NSArray *)sectionIDsForGroupID:(LookinAttrGroupIdentifier)groupID { + static NSDictionary *> *dict; + static dispatch_once_t onceToken; + dispatch_once(&onceToken,^{ + dict = @{ + LookinAttrGroup_Class: @[LookinAttrSec_Class_Class], + + LookinAttrGroup_Relation: @[LookinAttrSec_Relation_Relation], + + LookinAttrGroup_Layout: @[LookinAttrSec_Layout_Frame, + LookinAttrSec_Layout_Bounds, + LookinAttrSec_Layout_SafeArea, + LookinAttrSec_Layout_Position, + LookinAttrSec_Layout_AnchorPoint], + + LookinAttrGroup_AutoLayout: @[LookinAttrSec_AutoLayout_Constraints, + LookinAttrSec_AutoLayout_IntrinsicSize, + LookinAttrSec_AutoLayout_Hugging, + LookinAttrSec_AutoLayout_Resistance], + + LookinAttrGroup_ViewLayer: @[ + LookinAttrSec_ViewLayer_Visibility, + LookinAttrSec_ViewLayer_InterationAndMasks, + LookinAttrSec_ViewLayer_BgColor, + LookinAttrSec_ViewLayer_Border, + LookinAttrSec_ViewLayer_Corner, + LookinAttrSec_ViewLayer_Shadow, + LookinAttrSec_ViewLayer_ContentMode, + LookinAttrSec_ViewLayer_TintColor, + LookinAttrSec_ViewLayer_Tag + ], + + LookinAttrGroup_UIStackView: @[ + LookinAttrSec_UIStackView_Axis, + LookinAttrSec_UIStackView_Distribution, + LookinAttrSec_UIStackView_Alignment, + LookinAttrSec_UIStackView_Spacing + ], + + LookinAttrGroup_UIVisualEffectView: @[ + LookinAttrSec_UIVisualEffectView_Style, + LookinAttrSec_UIVisualEffectView_QMUIForegroundColor + ], + + LookinAttrGroup_UIImageView: @[LookinAttrSec_UIImageView_Name, + LookinAttrSec_UIImageView_Open], + + LookinAttrGroup_UILabel: @[ + LookinAttrSec_UILabel_Text, + LookinAttrSec_UILabel_Font, + LookinAttrSec_UILabel_NumberOfLines, + LookinAttrSec_UILabel_TextColor, + LookinAttrSec_UILabel_BreakMode, + LookinAttrSec_UILabel_Alignment, + LookinAttrSec_UILabel_CanAdjustFont], + + LookinAttrGroup_UIControl: @[LookinAttrSec_UIControl_EnabledSelected, + LookinAttrSec_UIControl_QMUIOutsideEdge, + LookinAttrSec_UIControl_VerAlignment, + LookinAttrSec_UIControl_HorAlignment], + + LookinAttrGroup_UIButton: @[LookinAttrSec_UIButton_ContentInsets, + LookinAttrSec_UIButton_TitleInsets, + LookinAttrSec_UIButton_ImageInsets], + + LookinAttrGroup_UIScrollView: @[LookinAttrSec_UIScrollView_ContentInset, + LookinAttrSec_UIScrollView_AdjustedInset, + LookinAttrSec_UIScrollView_QMUIInitialInset, + LookinAttrSec_UIScrollView_IndicatorInset, + LookinAttrSec_UIScrollView_Offset, + LookinAttrSec_UIScrollView_ContentSize, + LookinAttrSec_UIScrollView_Behavior, + LookinAttrSec_UIScrollView_ShowsIndicator, + LookinAttrSec_UIScrollView_Bounce, + LookinAttrSec_UIScrollView_ScrollPaging, + LookinAttrSec_UIScrollView_ContentTouches, + LookinAttrSec_UIScrollView_Zoom], + + LookinAttrGroup_UITableView: @[LookinAttrSec_UITableView_Style, + LookinAttrSec_UITableView_SectionsNumber, + LookinAttrSec_UITableView_RowsNumber, + LookinAttrSec_UITableView_SeparatorStyle, + LookinAttrSec_UITableView_SeparatorColor, + LookinAttrSec_UITableView_SeparatorInset], + + LookinAttrGroup_UITextView: @[LookinAttrSec_UITextView_Basic, + LookinAttrSec_UITextView_Text, + LookinAttrSec_UITextView_Font, + LookinAttrSec_UITextView_TextColor, + LookinAttrSec_UITextView_Alignment, + LookinAttrSec_UITextView_ContainerInset], + + LookinAttrGroup_UITextField: @[LookinAttrSec_UITextField_Text, + LookinAttrSec_UITextField_Placeholder, + LookinAttrSec_UITextField_Font, + LookinAttrSec_UITextField_TextColor, + LookinAttrSec_UITextField_Alignment, + LookinAttrSec_UITextField_Clears, + LookinAttrSec_UITextField_CanAdjustFont, + LookinAttrSec_UITextField_ClearButtonMode], + + }; + }); + return dict[groupID]; +} + ++ (NSArray *)attrIDsForSectionID:(LookinAttrSectionIdentifier)sectionID { + static NSDictionary *> *dict; + static dispatch_once_t onceToken; + dispatch_once(&onceToken,^{ + dict = @{ + LookinAttrSec_Class_Class: @[LookinAttr_Class_Class_Class], + + LookinAttrSec_Relation_Relation: @[LookinAttr_Relation_Relation_Relation], + + LookinAttrSec_Layout_Frame: @[LookinAttr_Layout_Frame_Frame], + LookinAttrSec_Layout_Bounds: @[LookinAttr_Layout_Bounds_Bounds], + LookinAttrSec_Layout_SafeArea: @[LookinAttr_Layout_SafeArea_SafeArea], + LookinAttrSec_Layout_Position: @[LookinAttr_Layout_Position_Position], + LookinAttrSec_Layout_AnchorPoint: @[LookinAttr_Layout_AnchorPoint_AnchorPoint], + + LookinAttrSec_AutoLayout_Hugging: @[LookinAttr_AutoLayout_Hugging_Hor, + LookinAttr_AutoLayout_Hugging_Ver], + LookinAttrSec_AutoLayout_Resistance: @[LookinAttr_AutoLayout_Resistance_Hor, + LookinAttr_AutoLayout_Resistance_Ver], + LookinAttrSec_AutoLayout_Constraints: @[LookinAttr_AutoLayout_Constraints_Constraints], + LookinAttrSec_AutoLayout_IntrinsicSize: @[LookinAttr_AutoLayout_IntrinsicSize_Size], + + LookinAttrSec_ViewLayer_Visibility: @[LookinAttr_ViewLayer_Visibility_Hidden, + LookinAttr_ViewLayer_Visibility_Opacity], + + LookinAttrSec_ViewLayer_InterationAndMasks: @[LookinAttr_ViewLayer_InterationAndMasks_Interaction, + LookinAttr_ViewLayer_InterationAndMasks_MasksToBounds], + + LookinAttrSec_ViewLayer_Corner: @[LookinAttr_ViewLayer_Corner_Radius], + + LookinAttrSec_ViewLayer_BgColor: @[LookinAttr_ViewLayer_BgColor_BgColor], + + LookinAttrSec_ViewLayer_Border: @[LookinAttr_ViewLayer_Border_Color, + LookinAttr_ViewLayer_Border_Width], + + LookinAttrSec_ViewLayer_Shadow: @[LookinAttr_ViewLayer_Shadow_Color, + LookinAttr_ViewLayer_Shadow_Opacity, + LookinAttr_ViewLayer_Shadow_Radius, + LookinAttr_ViewLayer_Shadow_OffsetW, + LookinAttr_ViewLayer_Shadow_OffsetH], + + LookinAttrSec_ViewLayer_ContentMode: @[LookinAttr_ViewLayer_ContentMode_Mode], + + LookinAttrSec_ViewLayer_TintColor: @[LookinAttr_ViewLayer_TintColor_Color, + LookinAttr_ViewLayer_TintColor_Mode], + + LookinAttrSec_ViewLayer_Tag: @[LookinAttr_ViewLayer_Tag_Tag], + + LookinAttrSec_UIStackView_Axis: @[LookinAttr_UIStackView_Axis_Axis], + + LookinAttrSec_UIStackView_Distribution: @[LookinAttr_UIStackView_Distribution_Distribution], + + LookinAttrSec_UIStackView_Alignment: @[LookinAttr_UIStackView_Alignment_Alignment], + + LookinAttrSec_UIStackView_Spacing: @[LookinAttr_UIStackView_Spacing_Spacing], + + LookinAttrSec_UIVisualEffectView_Style: @[LookinAttr_UIVisualEffectView_Style_Style], + + LookinAttrSec_UIVisualEffectView_QMUIForegroundColor: @[LookinAttr_UIVisualEffectView_QMUIForegroundColor_Color], + + LookinAttrSec_UIImageView_Name: @[LookinAttr_UIImageView_Name_Name], + + LookinAttrSec_UIImageView_Open: @[LookinAttr_UIImageView_Open_Open], + + LookinAttrSec_UILabel_Font: @[LookinAttr_UILabel_Font_Name, + LookinAttr_UILabel_Font_Size], + + LookinAttrSec_UILabel_NumberOfLines: @[LookinAttr_UILabel_NumberOfLines_NumberOfLines], + + LookinAttrSec_UILabel_Text: @[LookinAttr_UILabel_Text_Text], + + LookinAttrSec_UILabel_TextColor: @[LookinAttr_UILabel_TextColor_Color], + + LookinAttrSec_UILabel_BreakMode: @[LookinAttr_UILabel_BreakMode_Mode], + + LookinAttrSec_UILabel_Alignment: @[LookinAttr_UILabel_Alignment_Alignment], + + LookinAttrSec_UILabel_CanAdjustFont: @[LookinAttr_UILabel_CanAdjustFont_CanAdjustFont], + + LookinAttrSec_UIControl_EnabledSelected: @[LookinAttr_UIControl_EnabledSelected_Enabled, + LookinAttr_UIControl_EnabledSelected_Selected], + + LookinAttrSec_UIControl_QMUIOutsideEdge: @[LookinAttr_UIControl_QMUIOutsideEdge_Edge], + + LookinAttrSec_UIControl_VerAlignment: @[LookinAttr_UIControl_VerAlignment_Alignment], + + LookinAttrSec_UIControl_HorAlignment: @[LookinAttr_UIControl_HorAlignment_Alignment], + + LookinAttrSec_UIButton_ContentInsets: @[LookinAttr_UIButton_ContentInsets_Insets], + + LookinAttrSec_UIButton_TitleInsets: @[LookinAttr_UIButton_TitleInsets_Insets], + + LookinAttrSec_UIButton_ImageInsets: @[LookinAttr_UIButton_ImageInsets_Insets], + + LookinAttrSec_UIScrollView_ContentInset: @[LookinAttr_UIScrollView_ContentInset_Inset], + + LookinAttrSec_UIScrollView_AdjustedInset: @[LookinAttr_UIScrollView_AdjustedInset_Inset], + + LookinAttrSec_UIScrollView_QMUIInitialInset: @[LookinAttr_UIScrollView_QMUIInitialInset_Inset], + + LookinAttrSec_UIScrollView_IndicatorInset: @[LookinAttr_UIScrollView_IndicatorInset_Inset], + + LookinAttrSec_UIScrollView_Offset: @[LookinAttr_UIScrollView_Offset_Offset], + + LookinAttrSec_UIScrollView_ContentSize: @[LookinAttr_UIScrollView_ContentSize_Size], + + LookinAttrSec_UIScrollView_Behavior: @[LookinAttr_UIScrollView_Behavior_Behavior], + + LookinAttrSec_UIScrollView_ShowsIndicator: @[LookinAttr_UIScrollView_ShowsIndicator_Hor, + LookinAttr_UIScrollView_ShowsIndicator_Ver], + + LookinAttrSec_UIScrollView_Bounce: @[LookinAttr_UIScrollView_Bounce_Hor, + LookinAttr_UIScrollView_Bounce_Ver], + + LookinAttrSec_UIScrollView_ScrollPaging: @[LookinAttr_UIScrollView_ScrollPaging_ScrollEnabled, + LookinAttr_UIScrollView_ScrollPaging_PagingEnabled], + + LookinAttrSec_UIScrollView_ContentTouches: @[LookinAttr_UIScrollView_ContentTouches_Delay, + LookinAttr_UIScrollView_ContentTouches_CanCancel], + + LookinAttrSec_UIScrollView_Zoom: @[LookinAttr_UIScrollView_Zoom_Bounce, + LookinAttr_UIScrollView_Zoom_Scale, + LookinAttr_UIScrollView_Zoom_MinScale, + LookinAttr_UIScrollView_Zoom_MaxScale], + + LookinAttrSec_UITableView_Style: @[LookinAttr_UITableView_Style_Style], + + LookinAttrSec_UITableView_SectionsNumber: @[LookinAttr_UITableView_SectionsNumber_Number], + + LookinAttrSec_UITableView_RowsNumber: @[LookinAttr_UITableView_RowsNumber_Number], + + LookinAttrSec_UITableView_SeparatorInset: @[LookinAttr_UITableView_SeparatorInset_Inset], + + LookinAttrSec_UITableView_SeparatorColor: @[LookinAttr_UITableView_SeparatorColor_Color], + + LookinAttrSec_UITableView_SeparatorStyle: @[LookinAttr_UITableView_SeparatorStyle_Style], + + LookinAttrSec_UITextView_Basic: @[LookinAttr_UITextView_Basic_Editable, + LookinAttr_UITextView_Basic_Selectable], + + LookinAttrSec_UITextView_Text: @[LookinAttr_UITextView_Text_Text], + + LookinAttrSec_UITextView_Font: @[LookinAttr_UITextView_Font_Name, + LookinAttr_UITextView_Font_Size], + + LookinAttrSec_UITextView_TextColor: @[LookinAttr_UITextView_TextColor_Color], + + LookinAttrSec_UITextView_Alignment: @[LookinAttr_UITextView_Alignment_Alignment], + + LookinAttrSec_UITextView_ContainerInset: @[LookinAttr_UITextView_ContainerInset_Inset], + + LookinAttrSec_UITextField_Text: @[LookinAttr_UITextField_Text_Text], + + LookinAttrSec_UITextField_Placeholder: @[LookinAttr_UITextField_Placeholder_Placeholder], + + LookinAttrSec_UITextField_Font: @[LookinAttr_UITextField_Font_Name, + LookinAttr_UITextField_Font_Size], + + LookinAttrSec_UITextField_TextColor: @[LookinAttr_UITextField_TextColor_Color], + + LookinAttrSec_UITextField_Alignment: @[LookinAttr_UITextField_Alignment_Alignment], + + LookinAttrSec_UITextField_Clears: @[LookinAttr_UITextField_Clears_ClearsOnBeginEditing, + LookinAttr_UITextField_Clears_ClearsOnInsertion], + + LookinAttrSec_UITextField_CanAdjustFont: @[LookinAttr_UITextField_CanAdjustFont_CanAdjustFont, + LookinAttr_UITextField_CanAdjustFont_MinSize], + + LookinAttrSec_UITextField_ClearButtonMode: @[LookinAttr_UITextField_ClearButtonMode_Mode] + }; + }); + return dict[sectionID]; +} + ++ (void)getHostGroupID:(inout LookinAttrGroupIdentifier *)groupID_inout sectionID:(inout LookinAttrSectionIdentifier *)sectionID_inout fromAttrID:(LookinAttrIdentifier)targetAttrID { + __block LookinAttrGroupIdentifier targetGroupID = nil; + __block LookinAttrSectionIdentifier targetSecID = nil; + [[self groupIDs] enumerateObjectsUsingBlock:^(LookinAttrGroupIdentifier _Nonnull groupID, NSUInteger idx, BOOL * _Nonnull stop0) { + [[self sectionIDsForGroupID:groupID] enumerateObjectsUsingBlock:^(LookinAttrSectionIdentifier _Nonnull secID, NSUInteger idx, BOOL * _Nonnull stop1) { + [[self attrIDsForSectionID:secID] enumerateObjectsUsingBlock:^(LookinAttrIdentifier _Nonnull attrID, NSUInteger idx, BOOL * _Nonnull stop2) { + if ([attrID isEqualToString:targetAttrID]) { + targetGroupID = groupID; + targetSecID = secID; + *stop0 = YES; + *stop1 = YES; + *stop2 = YES; + } + }]; + }]; + }]; + + if (groupID_inout && targetGroupID) { + *groupID_inout = targetGroupID; + } + if (sectionID_inout && targetSecID) { + *sectionID_inout = targetSecID; + } +} + ++ (NSString *)groupTitleWithGroupID:(LookinAttrGroupIdentifier)groupID { + static dispatch_once_t onceToken; + static NSDictionary *rawInfo = nil; + dispatch_once(&onceToken,^{ + rawInfo = @{ + LookinAttrGroup_Class: @"Class", + LookinAttrGroup_Relation: @"Relation", + LookinAttrGroup_Layout: @"Layout", + LookinAttrGroup_AutoLayout: @"AutoLayout", + LookinAttrGroup_ViewLayer: @"CALayer / UIView", + LookinAttrGroup_UIImageView: @"UIImageView", + LookinAttrGroup_UILabel: @"UILabel", + LookinAttrGroup_UIControl: @"UIControl", + LookinAttrGroup_UIButton: @"UIButton", + LookinAttrGroup_UIScrollView: @"UIScrollView", + LookinAttrGroup_UITableView: @"UITableView", + LookinAttrGroup_UITextView: @"UITextView", + LookinAttrGroup_UITextField: @"UITextField", + LookinAttrGroup_UIVisualEffectView: @"UIVisualEffectView", + LookinAttrGroup_UIStackView: @"UIStackView" + }; + }); + NSString *title = rawInfo[groupID]; + NSAssert(title.length, @""); + return title; +} + ++ (NSString *)sectionTitleWithSectionID:(LookinAttrSectionIdentifier)secID { + static dispatch_once_t onceToken; + static NSDictionary *rawInfo = nil; + dispatch_once(&onceToken,^{ + rawInfo = @{ + LookinAttrSec_Layout_Frame: @"Frame", + LookinAttrSec_Layout_Bounds: @"Bounds", + LookinAttrSec_Layout_SafeArea: @"SafeArea", + LookinAttrSec_Layout_Position: @"Position", + LookinAttrSec_Layout_AnchorPoint: @"AnchorPoint", + LookinAttrSec_AutoLayout_Hugging: @"HuggingPriority", + LookinAttrSec_AutoLayout_Resistance: @"ResistancePriority", + LookinAttrSec_AutoLayout_IntrinsicSize: @"IntrinsicSize", + LookinAttrSec_ViewLayer_Corner: @"CornerRadius", + LookinAttrSec_ViewLayer_BgColor: @"BackgroundColor", + LookinAttrSec_ViewLayer_Border: @"Border", + LookinAttrSec_ViewLayer_Shadow: @"Shadow", + LookinAttrSec_ViewLayer_ContentMode: @"ContentMode", + LookinAttrSec_ViewLayer_TintColor: @"TintColor", + LookinAttrSec_ViewLayer_Tag: @"Tag", + LookinAttrSec_UIStackView_Axis: @"Axis", + LookinAttrSec_UIStackView_Distribution: @"Distribution", + LookinAttrSec_UIStackView_Alignment: @"Alignment", + LookinAttrSec_UIVisualEffectView_Style: @"Style", + LookinAttrSec_UIVisualEffectView_QMUIForegroundColor: @"ForegroundColor", + LookinAttrSec_UIImageView_Name: @"ImageName", + LookinAttrSec_UILabel_TextColor: @"TextColor", + LookinAttrSec_UITextView_TextColor: @"TextColor", + LookinAttrSec_UITextField_TextColor: @"TextColor", + LookinAttrSec_UILabel_BreakMode: @"LineBreakMode", + LookinAttrSec_UILabel_NumberOfLines: @"NumberOfLines", + LookinAttrSec_UILabel_Text: @"Text", + LookinAttrSec_UITextView_Text: @"Text", + LookinAttrSec_UITextField_Text: @"Text", + LookinAttrSec_UITextField_Placeholder: @"Placeholder", + LookinAttrSec_UILabel_Alignment: @"TextAlignment", + LookinAttrSec_UITextView_Alignment: @"TextAlignment", + LookinAttrSec_UITextField_Alignment: @"TextAlignment", + LookinAttrSec_UIControl_HorAlignment: @"HorizontalAlignment", + LookinAttrSec_UIControl_VerAlignment: @"VerticalAlignment", + LookinAttrSec_UIControl_QMUIOutsideEdge: @"QMUI_outsideEdge", + LookinAttrSec_UIButton_ContentInsets: @"ContentInsets", + LookinAttrSec_UIButton_TitleInsets: @"TitleInsets", + LookinAttrSec_UIButton_ImageInsets: @"ImageInsets", + LookinAttrSec_UIScrollView_QMUIInitialInset: @"QMUI_initialContentInset", + LookinAttrSec_UIScrollView_ContentInset: @"ContentInset", + LookinAttrSec_UIScrollView_AdjustedInset: @"AdjustedContentInset", + LookinAttrSec_UIScrollView_IndicatorInset: @"ScrollIndicatorInsets", + LookinAttrSec_UIScrollView_Offset: @"ContentOffset", + LookinAttrSec_UIScrollView_ContentSize: @"ContentSize", + LookinAttrSec_UIScrollView_Behavior: @"InsetAdjustmentBehavior", + LookinAttrSec_UIScrollView_ShowsIndicator: @"ShowsScrollIndicator", + LookinAttrSec_UIScrollView_Bounce: @"AlwaysBounce", + LookinAttrSec_UIScrollView_Zoom: @"Zoom", + LookinAttrSec_UITableView_Style: @"Style", + LookinAttrSec_UITableView_SectionsNumber: @"NumberOfSections", + LookinAttrSec_UITableView_RowsNumber: @"NumberOfRows", + LookinAttrSec_UITableView_SeparatorColor: @"SeparatorColor", + LookinAttrSec_UITableView_SeparatorInset: @"SeparatorInset", + LookinAttrSec_UITableView_SeparatorStyle: @"SeparatorStyle", + LookinAttrSec_UILabel_Font: @"Font", + LookinAttrSec_UITextField_Font: @"Font", + LookinAttrSec_UITextView_Font: @"Font", + LookinAttrSec_UITextView_ContainerInset: @"ContainerInset", + LookinAttrSec_UITextField_ClearButtonMode: @"ClearButtonMode", + }; + }); + return rawInfo[secID]; +} + +/** + className: 必填项,标识该属性是哪一个类拥有的 + + fullTitle: 完整的名字,将作为搜索的 keywords,也会展示在搜索结果中,如果为 nil 则不会被搜索到 + + briefTitle:简略的名字,仅 checkbox 和那种自带标题的 input 才需要这个属性,如果需要该属性但该属性又为空,则会读取 fullTitle + + setterString:用户试图修改属性值时会用到,若该字段为空字符串(即 @“”)则该属性不可修改,若该字段为 nil 则会在 fullTitle 的基础上自动生成(自动改首字母大小写、加前缀后缀,比如 alpha 会被转换为 setAlpha:) + + getterString:必填项,业务中读取属性值时会用到。如果该字段为 nil ,则会在 fullTitle 的基础上自动生成(自动把 fullTitle 的第一个字母改成小写,比如 Alpha 会被转换为 alpha)。如果该字段为空字符串(比如 image_open_open)则属性值会被固定为 nil,attrType 会被指为 LookinAttrTypeCustomObj + + typeIfObj:当某个 LookinAttribute 确定是 NSObject 类型时,该方法返回它具体是什么对象,比如 UIColor、NSString + + enumList:如果某个 attribute 是 enum,则这里标识了相应的 enum 的名称(如 "NSTextAlignment"),业务可通过这个名称进而查询可用的枚举值列表 + + patch:如果为 YES,则用户修改了该 Attribute 的值后,Lookin 会重新拉取和更新相关图层的位置、截图等信息,如果为 nil 则默认是 NO + + hideIfNil:如果为 YES,则当获取的 value 为 nil 时,Lookin 不会传输该 attr。如果为 NO,则即使 value 为 nil 也会传输(比如 label 的 text 属性,即使它是 nil 我们也要显示,所以它的 hideIfNil 应该为 NO)。如果该字段为 nil 则默认是 NO + + osVersion: 该属性需要的最低的 iOS 版本,比如 safeAreaInsets 从 iOS 11.0 开始出现,则该属性应该为 @11,如果为 nil 则表示不限制 iOS 版本 + + */ ++ (NSDictionary *)_infoForAttrID:(LookinAttrIdentifier)attrID { + static NSDictionary *> *dict; + static dispatch_once_t onceToken; + dispatch_once(&onceToken,^{ + dict = @{ + LookinAttr_Class_Class_Class: @{ + @"className": @"CALayer", + @"getterString": @"lks_relatedClassChainList", + @"setterString": @"", + @"typeIfObj": @(LookinAttrTypeCustomObj) + }, + + LookinAttr_Relation_Relation_Relation: @{ + @"className": @"CALayer", + @"getterString": @"lks_selfRelation", + @"setterString": @"", + @"typeIfObj": @(LookinAttrTypeCustomObj), + @"hideIfNil": @(YES) + }, + + LookinAttr_Layout_Frame_Frame: @{ + @"className": @"CALayer", + @"fullTitle": @"Frame", + @"patch": @(YES) + }, + LookinAttr_Layout_Bounds_Bounds: @{ + @"className": @"CALayer", + @"fullTitle": @"Bounds", + @"patch": @(YES) + }, + LookinAttr_Layout_SafeArea_SafeArea: @{ + @"className": @"UIView", + @"fullTitle": @"SafeAreaInsets", + @"setterString": @"", + @"osVersion": @(11) + }, + LookinAttr_Layout_Position_Position: @{ + @"className": @"CALayer", + @"fullTitle": @"Position", + @"patch": @(YES) + }, + LookinAttr_Layout_AnchorPoint_AnchorPoint: @{ + @"className": @"CALayer", + @"fullTitle": @"AnchorPoint", + @"patch": @(YES) + }, + + LookinAttr_AutoLayout_Hugging_Hor: @{ + @"className": @"UIView", + @"fullTitle": @"ContentHuggingPriority(Horizontal)", + @"getterString": @"lks_horizontalContentHuggingPriority", + @"setterString": @"setLks_horizontalContentHuggingPriority:", + @"briefTitle": @"H", + @"patch": @(YES) + }, + LookinAttr_AutoLayout_Hugging_Ver: @{ + @"className": @"UIView", + @"fullTitle": @"ContentHuggingPriority(Vertical)", + @"getterString": @"lks_verticalContentHuggingPriority", + @"setterString": @"setLks_verticalContentHuggingPriority:", + @"briefTitle": @"V", + @"patch": @(YES) + }, + LookinAttr_AutoLayout_Resistance_Hor: @{ + @"className": @"UIView", + @"fullTitle": @"ContentCompressionResistancePriority(Horizontal)", + @"getterString": @"lks_horizontalContentCompressionResistancePriority", + @"setterString": @"setLks_horizontalContentCompressionResistancePriority:", + @"briefTitle": @"H", + @"patch": @(YES) + }, + LookinAttr_AutoLayout_Resistance_Ver: @{ + @"className": @"UIView", + @"fullTitle": @"ContentCompressionResistancePriority(Vertical)", + @"getterString": @"lks_verticalContentCompressionResistancePriority", + @"setterString": @"setLks_verticalContentCompressionResistancePriority:", + @"briefTitle": @"V", + @"patch": @(YES) + }, + LookinAttr_AutoLayout_Constraints_Constraints: @{ + @"className": @"UIView", + @"getterString": @"lks_constraints", + @"setterString": @"", + @"typeIfObj": @(LookinAttrTypeCustomObj), + @"hideIfNil": @(YES) + }, + LookinAttr_AutoLayout_IntrinsicSize_Size: @{ + @"className": @"UIView", + @"fullTitle": @"IntrinsicContentSize", + @"setterString": @"" + }, + + LookinAttr_ViewLayer_Visibility_Hidden: @{ + @"className": @"CALayer", + @"fullTitle": @"Hidden", + @"getterString": @"isHidden", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Visibility_Opacity: @{ + @"className": @"CALayer", + @"fullTitle": @"Opacity / Alpha", + @"setterString": @"setOpacity:", + @"getterString": @"opacity", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_InterationAndMasks_Interaction: @{ + @"className": @"UIView", + @"fullTitle": @"UserInteractionEnabled", + @"getterString": @"isUserInteractionEnabled", + @"patch": @(NO) + }, + LookinAttr_ViewLayer_InterationAndMasks_MasksToBounds: @{ + @"className": @"CALayer", + @"fullTitle": @"MasksToBounds / ClipsToBounds", + @"briefTitle": @"MasksToBounds", + @"setterString": @"setMasksToBounds:", + @"getterString": @"masksToBounds", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Corner_Radius: @{ + @"className": @"CALayer", + @"fullTitle": @"CornerRadius", + @"briefTitle": @"", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_BgColor_BgColor: @{ + @"className": @"CALayer", + @"fullTitle": @"BackgroundColor", + @"setterString": @"setLks_backgroundColor:", + @"getterString": @"lks_backgroundColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Border_Color: @{ + @"className": @"CALayer", + @"fullTitle": @"BorderColor", + @"setterString": @"setLks_borderColor:", + @"getterString": @"lks_borderColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Border_Width: @{ + @"className": @"CALayer", + @"fullTitle": @"BorderWidth", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Shadow_Color: @{ + @"className": @"CALayer", + @"fullTitle": @"ShadowColor", + @"setterString": @"setLks_shadowColor:", + @"getterString": @"lks_shadowColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Shadow_Opacity: @{ + @"className": @"CALayer", + @"fullTitle": @"ShadowOpacity", + @"briefTitle": @"Opacity", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Shadow_Radius: @{ + @"className": @"CALayer", + @"fullTitle": @"ShadowRadius", + @"briefTitle": @"Radius", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Shadow_OffsetW: @{ + @"className": @"CALayer", + @"fullTitle": @"ShadowOffsetWidth", + @"briefTitle": @"OffsetW", + @"setterString": @"setLks_shadowOffsetWidth:", + @"getterString": @"lks_shadowOffsetWidth", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Shadow_OffsetH: @{ + @"className": @"CALayer", + @"fullTitle": @"ShadowOffsetHeight", + @"briefTitle": @"OffsetH", + @"setterString": @"setLks_shadowOffsetHeight:", + @"getterString": @"lks_shadowOffsetHeight", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_ContentMode_Mode: @{ + @"className": @"UIView", + @"fullTitle": @"ContentMode", + @"enumList": @"UIViewContentMode", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_TintColor_Color: @{ + @"className": @"UIView", + @"fullTitle": @"TintColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES) + }, + LookinAttr_ViewLayer_TintColor_Mode: @{ + @"className": @"UIView", + @"fullTitle": @"TintAdjustmentMode", + @"enumList": @"UIViewTintAdjustmentMode", + @"patch": @(YES) + }, + LookinAttr_ViewLayer_Tag_Tag: @{ + @"className": @"UIView", + @"fullTitle": @"Tag", + @"briefTitle": @"", + @"patch": @(NO) + }, + + LookinAttr_UIStackView_Axis_Axis: @{ + @"className": @"UIStackView", + @"fullTitle": @"Axis", + @"enumList": @"UILayoutConstraintAxis", + @"patch": @(YES) + }, + + LookinAttr_UIStackView_Distribution_Distribution: @{ + @"className": @"UIStackView", + @"fullTitle": @"Distribution", + @"enumList": @"UIStackViewDistribution", + @"patch": @(YES) + }, + + LookinAttr_UIStackView_Alignment_Alignment: @{ + @"className": @"UIStackView", + @"fullTitle": @"Alignment", + @"enumList": @"UIStackViewAlignment", + @"patch": @(YES) + }, + + LookinAttr_UIStackView_Spacing_Spacing: @{ + @"className": @"UIStackView", + @"fullTitle": @"Spacing", + @"patch": @(YES) + }, + + LookinAttr_UIVisualEffectView_Style_Style: @{ + @"className": @"UIVisualEffectView", + @"setterString": @"setLks_blurEffectStyleNumber:", + @"getterString": @"lks_blurEffectStyleNumber", + @"enumList": @"UIBlurEffectStyle", + @"typeIfObj": @(LookinAttrTypeCustomObj), + @"patch": @(YES), + @"hideIfNil": @(YES) + }, + + LookinAttr_UIVisualEffectView_QMUIForegroundColor_Color: @{ + @"className": @"QMUIVisualEffectView", + @"fullTitle": @"ForegroundColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES), + }, + + LookinAttr_UIImageView_Name_Name: @{ + @"className": @"UIImageView", + @"fullTitle": @"ImageName", + @"setterString": @"", + @"getterString": @"lks_imageSourceName", + @"typeIfObj": @(LookinAttrTypeNSString), + @"hideIfNil": @(YES) + }, + LookinAttr_UIImageView_Open_Open: @{ + @"className": @"UIImageView", + @"setterString": @"", + @"getterString": @"lks_imageViewOidIfHasImage", + @"typeIfObj": @(LookinAttrTypeCustomObj), + @"hideIfNil": @(YES) + }, + + LookinAttr_UILabel_Text_Text: @{ + @"className": @"UILabel", + @"fullTitle": @"Text", + @"typeIfObj": @(LookinAttrTypeNSString), + @"patch": @(YES) + }, + LookinAttr_UILabel_NumberOfLines_NumberOfLines: @{ + @"className": @"UILabel", + @"fullTitle": @"NumberOfLines", + @"briefTitle": @"", + @"patch": @(YES) + }, + LookinAttr_UILabel_Font_Size: @{ + @"className": @"UILabel", + @"fullTitle": @"FontSize", + @"briefTitle": @"FontSize", + @"setterString": @"setLks_fontSize:", + @"getterString": @"lks_fontSize", + @"patch": @(YES) + }, + LookinAttr_UILabel_Font_Name: @{ + @"className": @"UILabel", + @"fullTitle": @"FontName", + @"setterString": @"", + @"getterString": @"lks_fontName", + @"typeIfObj": @(LookinAttrTypeNSString), + @"patch": @(NO) + }, + LookinAttr_UILabel_TextColor_Color: @{ + @"className": @"UILabel", + @"fullTitle": @"TextColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES) + }, + LookinAttr_UILabel_Alignment_Alignment: @{ + @"className": @"UILabel", + @"fullTitle": @"TextAlignment", + @"enumList": @"NSTextAlignment", + @"patch": @(YES) + }, + LookinAttr_UILabel_BreakMode_Mode: @{ + @"className": @"UILabel", + @"fullTitle": @"LineBreakMode", + @"enumList": @"NSLineBreakMode", + @"patch": @(YES) + }, + LookinAttr_UILabel_CanAdjustFont_CanAdjustFont: @{ + @"className": @"UILabel", + @"fullTitle": @"AdjustsFontSizeToFitWidth", + @"patch": @(YES) + }, + + LookinAttr_UIControl_EnabledSelected_Enabled: @{ + @"className": @"UIControl", + @"fullTitle": @"Enabled", + @"getterString": @"isEnabled", + @"patch": @(NO) + }, + LookinAttr_UIControl_EnabledSelected_Selected: @{ + @"className": @"UIControl", + @"fullTitle": @"Selected", + @"getterString": @"isSelected", + @"patch": @(YES) + }, + LookinAttr_UIControl_VerAlignment_Alignment: @{ + @"className": @"UIControl", + @"fullTitle": @"ContentVerticalAlignment", + @"enumList": @"UIControlContentVerticalAlignment", + @"patch": @(YES) + }, + LookinAttr_UIControl_HorAlignment_Alignment: @{ + @"className": @"UIControl", + @"fullTitle": @"ContentHorizontalAlignment", + @"enumList": @"UIControlContentHorizontalAlignment", + @"patch": @(YES) + }, + LookinAttr_UIControl_QMUIOutsideEdge_Edge: @{ + @"className": @"UIControl", + @"fullTitle": @"qmui_outsideEdge" + }, + + LookinAttr_UIButton_ContentInsets_Insets: @{ + @"className": @"UIButton", + @"fullTitle": @"ContentEdgeInsets", + @"patch": @(YES) + }, + LookinAttr_UIButton_TitleInsets_Insets: @{ + @"className": @"UIButton", + @"fullTitle": @"TitleEdgeInsets", + @"patch": @(YES) + }, + LookinAttr_UIButton_ImageInsets_Insets: @{ + @"className": @"UIButton", + @"fullTitle": @"ImageEdgeInsets", + @"patch": @(YES) + }, + + LookinAttr_UIScrollView_Offset_Offset: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ContentOffset", + @"patch": @(YES) + }, + LookinAttr_UIScrollView_ContentSize_Size: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ContentSize", + @"patch": @(YES) + }, + LookinAttr_UIScrollView_ContentInset_Inset: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ContentInset", + @"patch": @(YES) + }, + LookinAttr_UIScrollView_QMUIInitialInset_Inset: @{ + @"className": @"UIScrollView", + @"fullTitle": @"qmui_initialContentInset", + @"patch": @(YES) + }, + LookinAttr_UIScrollView_AdjustedInset_Inset: @{ + @"className": @"UIScrollView", + @"fullTitle": @"AdjustedContentInset", + @"setterString": @"", + @"osVersion": @(11) + }, + LookinAttr_UIScrollView_Behavior_Behavior: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ContentInsetAdjustmentBehavior", + @"enumList": @"UIScrollViewContentInsetAdjustmentBehavior", + @"patch": @(YES), + @"osVersion": @(11) + }, + LookinAttr_UIScrollView_IndicatorInset_Inset: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ScrollIndicatorInsets", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_ScrollPaging_ScrollEnabled: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ScrollEnabled", + @"getterString": @"isScrollEnabled", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_ScrollPaging_PagingEnabled: @{ + @"className": @"UIScrollView", + @"fullTitle": @"PagingEnabled", + @"getterString": @"isPagingEnabled", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_Bounce_Ver: @{ + @"className": @"UIScrollView", + @"fullTitle": @"AlwaysBounceVertical", + @"briefTitle": @"Vertical", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_Bounce_Hor: @{ + @"className": @"UIScrollView", + @"fullTitle": @"AlwaysBounceHorizontal", + @"briefTitle": @"Horizontal", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_ShowsIndicator_Hor: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ShowsHorizontalScrollIndicator", + @"briefTitle": @"Horizontal", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_ShowsIndicator_Ver: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ShowsVerticalScrollIndicator", + @"briefTitle": @"Vertical", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_ContentTouches_Delay: @{ + @"className": @"UIScrollView", + @"fullTitle": @"DelaysContentTouches", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_ContentTouches_CanCancel: @{ + @"className": @"UIScrollView", + @"fullTitle": @"CanCancelContentTouches", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_Zoom_MinScale: @{ + @"className": @"UIScrollView", + @"fullTitle": @"MinimumZoomScale", + @"briefTitle": @"MinScale", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_Zoom_MaxScale: @{ + @"className": @"UIScrollView", + @"fullTitle": @"MaximumZoomScale", + @"briefTitle": @"MaxScale", + @"patch": @(NO) + }, + LookinAttr_UIScrollView_Zoom_Scale: @{ + @"className": @"UIScrollView", + @"fullTitle": @"ZoomScale", + @"briefTitle": @"Scale", + @"patch": @(YES) + }, + LookinAttr_UIScrollView_Zoom_Bounce: @{ + @"className": @"UIScrollView", + @"fullTitle": @"BouncesZoom", + @"patch": @(NO) + }, + + LookinAttr_UITableView_Style_Style: @{ + @"className": @"UITableView", + @"fullTitle": @"Style", + @"setterString": @"", + @"enumList": @"UITableViewStyle", + @"patch": @(YES) + }, + LookinAttr_UITableView_SectionsNumber_Number: @{ + @"className": @"UITableView", + @"fullTitle": @"NumberOfSections", + @"setterString": @"", + @"patch": @(YES) + }, + LookinAttr_UITableView_RowsNumber_Number: @{ + @"className": @"UITableView", + @"setterString": @"", + @"getterString": @"lks_numberOfRows", + @"typeIfObj": @(LookinAttrTypeCustomObj) + }, + LookinAttr_UITableView_SeparatorInset_Inset: @{ + @"className": @"UITableView", + @"fullTitle": @"SeparatorInset", + @"patch": @(NO) + }, + LookinAttr_UITableView_SeparatorColor_Color: @{ + @"className": @"UITableView", + @"fullTitle": @"SeparatorColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES) + }, + LookinAttr_UITableView_SeparatorStyle_Style: @{ + @"className": @"UITableView", + @"fullTitle": @"SeparatorStyle", + @"enumList": @"UITableViewCellSeparatorStyle", + @"patch": @(YES) + }, + + LookinAttr_UITextView_Text_Text: @{ + @"className": @"UITextView", + @"fullTitle": @"Text", + @"typeIfObj": @(LookinAttrTypeNSString), + @"patch": @(YES) + }, + LookinAttr_UITextView_Font_Name: @{ + @"className": @"UITextView", + @"fullTitle": @"FontName", + @"setterString": @"", + @"getterString": @"lks_fontName", + @"typeIfObj": @(LookinAttrTypeNSString), + @"patch": @(NO) + }, + LookinAttr_UITextView_Font_Size: @{ + @"className": @"UITextView", + @"fullTitle": @"FontSize", + @"setterString": @"setLks_fontSize:", + @"getterString": @"lks_fontSize", + @"patch": @(YES) + }, + LookinAttr_UITextView_Basic_Editable: @{ + @"className": @"UITextView", + @"fullTitle": @"Editable", + @"getterString": @"isEditable", + @"patch": @(NO) + }, + LookinAttr_UITextView_Basic_Selectable: @{ + @"className": @"UITextView", + @"fullTitle": @"Selectable", + @"getterString": @"isSelectable", + @"patch": @(NO) + }, + LookinAttr_UITextView_TextColor_Color: @{ + @"className": @"UITextView", + @"fullTitle": @"TextColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES) + }, + LookinAttr_UITextView_Alignment_Alignment: @{ + @"className": @"UITextView", + @"fullTitle": @"TextAlignment", + @"enumList": @"NSTextAlignment", + @"patch": @(YES) + }, + LookinAttr_UITextView_ContainerInset_Inset: @{ + @"className": @"UITextView", + @"fullTitle": @"TextContainerInset", + @"patch": @(YES) + }, + + LookinAttr_UITextField_Font_Name: @{ + @"className": @"UITextField", + @"fullTitle": @"FontName", + @"setterString": @"", + @"getterString": @"lks_fontName", + @"typeIfObj": @(LookinAttrTypeNSString), + @"patch": @(NO) + }, + LookinAttr_UITextField_Font_Size: @{ + @"className": @"UITextField", + @"fullTitle": @"FontSize", + @"setterString": @"setLks_fontSize:", + @"getterString": @"lks_fontSize", + @"patch": @(YES) + }, + LookinAttr_UITextField_TextColor_Color: @{ + @"className": @"UITextField", + @"fullTitle": @"TextColor", + @"typeIfObj": @(LookinAttrTypeUIColor), + @"patch": @(YES) + }, + LookinAttr_UITextField_Alignment_Alignment: @{ + @"className": @"UITextField", + @"fullTitle": @"TextAlignment", + @"enumList": @"NSTextAlignment", + @"patch": @(YES) + }, + LookinAttr_UITextField_Text_Text: @{ + @"className": @"UITextField", + @"fullTitle": @"Text", + @"typeIfObj": @(LookinAttrTypeNSString), + @"patch": @(YES) + }, + LookinAttr_UITextField_Placeholder_Placeholder: @{ + @"className": @"UITextField", + @"fullTitle": @"Placeholder", + @"typeIfObj": @(LookinAttrTypeNSString), + @"patch": @(YES) + }, + LookinAttr_UITextField_Clears_ClearsOnBeginEditing: @{ + @"className": @"UITextField", + @"fullTitle": @"ClearsOnBeginEditing", + @"patch": @(NO) + }, + LookinAttr_UITextField_Clears_ClearsOnInsertion: @{ + @"className": @"UITextField", + @"fullTitle": @"ClearsOnInsertion", + @"patch": @(NO) + }, + LookinAttr_UITextField_CanAdjustFont_CanAdjustFont: @{ + @"className": @"UITextField", + @"fullTitle": @"AdjustsFontSizeToFitWidth", + @"patch": @(YES) + }, + LookinAttr_UITextField_CanAdjustFont_MinSize: @{ + @"className": @"UITextField", + @"fullTitle": @"MinimumFontSize", + @"patch": @(YES) + }, + LookinAttr_UITextField_ClearButtonMode_Mode: @{ + @"className": @"UITextField", + @"fullTitle": @"ClearButtonMode", + @"enumList": @"UITextFieldViewMode", + @"patch": @(NO) + }, + }; + }); + + NSDictionary *targetInfo = dict[attrID]; + return targetInfo; +} + ++ (LookinAttrType)objectAttrTypeWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSNumber *typeIfObj = attrInfo[@"typeIfObj"]; + return [typeIfObj integerValue]; +} + ++ (NSString *)classNameWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSString *className = attrInfo[@"className"]; + + NSAssert(className.length > 0, @""); + + return className; +} + ++ (BOOL)isUIViewPropertyWithAttrID:(LookinAttrIdentifier)attrID { + NSString *className = [self classNameWithAttrID:attrID]; + + if ([className isEqualToString:@"CALayer"]) { + return NO; + } + return YES; +} + ++ (NSString *)enumListNameWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSString *name = attrInfo[@"enumList"]; + return name; +} + ++ (BOOL)needPatchAfterModificationWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSNumber *needPatch = attrInfo[@"patch"]; + return [needPatch boolValue]; +} + ++ (NSString *)fullTitleWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSString *fullTitle = attrInfo[@"fullTitle"]; + return fullTitle; +} + ++ (NSString *)briefTitleWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSString *briefTitle = attrInfo[@"briefTitle"]; + if (!briefTitle) { + briefTitle = attrInfo[@"fullTitle"]; + } + return briefTitle; +} + ++ (SEL)getterWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSString *getterString = attrInfo[@"getterString"]; + if (getterString && getterString.length == 0) { + // 空字符串,比如 image_open_open + return nil; + } + if (!getterString) { + NSString *fullTitle = attrInfo[@"fullTitle"]; + NSAssert(fullTitle.length > 0, @""); + + getterString = [NSString stringWithFormat:@"%@%@", [fullTitle substringToIndex:1].lowercaseString, [fullTitle substringFromIndex:1]].copy; + } + return NSSelectorFromString(getterString); +} + ++ (SEL)setterWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSString *setterString = attrInfo[@"setterString"]; + if ([setterString isEqualToString:@""]) { + // 该属性不可在 Lookin 客户端中被修改 + return nil; + } + if (!setterString) { + NSString *fullTitle = attrInfo[@"fullTitle"]; + NSAssert(fullTitle.length > 0, @""); + + setterString = [NSString stringWithFormat:@"set%@%@:", [fullTitle substringToIndex:1].uppercaseString, [fullTitle substringFromIndex:1]]; + } + return NSSelectorFromString(setterString); +} + ++ (BOOL)hideIfNilWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSNumber *boolValue = attrInfo[@"hideIfNil"]; + return boolValue.boolValue; +} + ++ (NSInteger)minAvailableOSVersionWithAttrID:(LookinAttrIdentifier)attrID { + NSDictionary *attrInfo = [self _infoForAttrID:attrID]; + NSNumber *minVerNum = attrInfo[@"osVersion"]; + NSInteger minVer = [minVerNum integerValue]; + return minVer; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinDefines.h b/Pods/LookinServer/Src/Main/Shared/LookinDefines.h new file mode 100644 index 0000000..f00540d --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinDefines.h @@ -0,0 +1,172 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinMessageProtocol.h +// Lookin +// +// Created by Li Kai on 2018/8/6. +// https://lookin.work +// + +#import "TargetConditionals.h" +#if TARGET_OS_IPHONE +#import +#elif TARGET_OS_MAC +#import +#endif + +#include + +#pragma mark - Version + +/// current connection protocol version of LookinServer +static const int LOOKIN_SERVER_VERSION = 7; + +/// current release version of LookinServer +static NSString * const LOOKIN_SERVER_READABLE_VERSION = @"1.2.8"; + +/// current connection protocol version of LookinClient +static const int LOOKIN_CLIENT_VERSION = 7; + +/// the minimum connection protocol version supported by current LookinClient +static const int LOOKIN_SUPPORTED_SERVER_MIN = 7; +/// the maximum connection protocol version supported by current LookinClient +static const int LOOKIN_SUPPORTED_SERVER_MAX = 7; + +#pragma mark - Connection + +/// LookinServer 在真机上会依次尝试监听 47175 ~ 47179 这几个端口 +static const int LookinUSBDeviceIPv4PortNumberStart = 47175; +static const int LookinUSBDeviceIPv4PortNumberEnd = 47179; + +/// LookinServer 在模拟器中会依次尝试监听 47164 ~ 47169 这几个端口 +static const int LookinSimulatorIPv4PortNumberStart = 47164; +static const int LookinSimulatorIPv4PortNumberEnd = 47169; + +enum { + /// 确认两端是否可以响应通讯 + LookinRequestTypePing = 200, + /// 请求 App 的截图、设备型号等信息 + LookinRequestTypeApp = 201, + /// 请求 Hierarchy 信息 + LookinRequestTypeHierarchy = 202, + /// 请求 screenshots 和 attrGroups 信息 + LookinRequestTypeHierarchyDetails = 203, + /// 请求修改某个内置的 Attribute 的值 + LookinRequestTypeInbuiltAttrModification = 204, + /// 修改某个 attr 后,请求一系列最新的 Screenshots、属性值等信息 + LookinRequestTypeAttrModificationPatch = 205, + /// 执行某个方法 + LookinRequestTypeInvokeMethod = 206, + /** + @request: @{@"oid":} + @response: LookinObject * + */ + LookinRequestTypeFetchObject = 207, + + LookinRequestTypeFetchImageViewImage = 208, + + LookinRequestTypeModifyRecognizerEnable = 209, + + /// 请求 attribute group list + LookinRequestTypeAllAttrGroups = 210, + + /// 请求 iOS App 里某个 class 的所有 selector 名字列表(包括 superclass) + LookinRequestTypeAllSelectorNames = 213, + + /// 请求修改某个自定义 Attribute 的值 + LookinRequestTypeCustomAttrModification = 214, + + /// 从 LookinServer 1.2.7 & Lookin 1.0.7 开始,该属性被废弃、不再使用 + LookinPush_BringForwardScreenshotTask = 303, + + // 用户在 Lookin 客户端取消了之前 HierarchyDetails 的拉取 + LookinPush_CanceHierarchyDetails = 304, +}; + +static NSString * const LookinParam_ViewLayerTag = @"tag"; + +static NSString * const LookinParam_SelectorName = @"sn"; +static NSString * const LookinParam_MethodType = @"mt"; +static NSString * const LookinParam_SelectorClassName = @"scn"; + +static NSString * const LookinStringFlag_VoidReturn = @"LOOKIN_TAG_RETURN_VALUE_VOID"; + +#pragma mark - Error + +static NSString * const LookinErrorDomain = @"LookinError"; + +enum { + LookinErrCode_Default = -400, + /// Lookin 内部业务逻辑错误 + LookinErrCode_Inner = -401, + /// PeerTalk 内部错误 + LookinErrCode_PeerTalk = -402, + /// 连接不存在或已断开 + LookinErrCode_NoConnect = -403, + /// ping 失败了,原因是 ping 请求超时 + LookinErrCode_PingFailForTimeout = -404, + /// 请求超时未返回 + LookinErrCode_Timeout = -405, + /// 有相同 Type 的新请求被发出,因此旧请求被丢弃 + LookinErrCode_Discard = -406, + /// ping 失败了,原因是 app 主动报告自身正处于后台模式 + LookinErrCode_PingFailForBackgroundState = -407, + + /// 没有找到对应的对象,可能已被释放 + LookinErrCode_ObjectNotFound = -500, + /// 不支持修改当前类型的 LookinCodingValueType + LookinErrCode_ModifyValueTypeInvalid = -501, + LookinErrCode_Exception = -502, + + // LookinServer 版本过高,要升级 client + LookinErrCode_ServerVersionTooHigh = -600, + // LookinServer 版本过低,要升级 server + LookinErrCode_ServerVersionTooLow = -601, + + // 不支持的文件类型 + LookinErrCode_UnsupportedFileType = -700, +}; + +#define LookinErr_ObjNotFound [NSError errorWithDomain:LookinErrorDomain code:LookinErrCode_ObjectNotFound userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"Failed to get target object in iOS app", nil), NSLocalizedRecoverySuggestionErrorKey:NSLocalizedString(@"Perhaps the related object was deallocated. You can reload Lookin to get newest data.", nil)}] + +#define LookinErr_NoConnect [NSError errorWithDomain:LookinErrorDomain code:LookinErrCode_NoConnect userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"The operation failed due to disconnection with the iOS app.", nil)}] + +#define LookinErr_Inner [NSError errorWithDomain:LookinErrorDomain code:LookinErrCode_Inner userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"The operation failed due to an inner error.", nil)}] + +#define LookinErrorMake(errorTitle, errorDetail) [NSError errorWithDomain:LookinErrorDomain code:LookinErrCode_Default userInfo:@{NSLocalizedDescriptionKey:errorTitle, NSLocalizedRecoverySuggestionErrorKey:errorDetail}] + +#define LookinErrorText_Timeout NSLocalizedString(@"Perhaps your iOS app is paused with breakpoint in Xcode, blocked by other tasks in main thread, or moved to background state.", nil) + +#pragma mark - Colors + +#if TARGET_OS_IPHONE +#define LookinColor UIColor +#define LookinInsets UIEdgeInsets +#define LookinImage UIImage +#elif TARGET_OS_MAC +#define LookinColor NSColor +#define LookinInsets NSEdgeInsets +#define LookinImage NSImage +#endif + +#define LookinColorRGBAMake(r, g, b, a) [LookinColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a] +#define LookinColorMake(r, g, b) [LookinColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1] + +#pragma mark - Preview + +/// SCNNode 所允许的图片的最大的长和宽,单位是 px,这个值是 Scenekit 自身指定的 +/// Max pixel size of a SCNNode object. It is designated by SceneKit. +static const double LookinNodeImageMaxLengthInPx = 16384; + +typedef NS_OPTIONS(NSUInteger, LookinPreviewBitMask) { + LookinPreviewBitMask_None = 0, + + LookinPreviewBitMask_Selectable = 1 << 1, + LookinPreviewBitMask_Unselectable = 1 << 2, + + LookinPreviewBitMask_HasLight = 1 << 3, + LookinPreviewBitMask_NoLight = 1 << 4 +}; + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinDisplayItem.h b/Pods/LookinServer/Src/Main/Shared/LookinDisplayItem.h new file mode 100644 index 0000000..cea7247 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinDisplayItem.h @@ -0,0 +1,186 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinDisplayItem.h +// qmuidemo +// +// Created by Li Kai on 2018/11/15. +// Copyright © 2018 QMUI Team. All rights reserved. +// + +#import "TargetConditionals.h" +#import "LookinObject.h" +#import "LookinDefines.h" +#import "LookinCustomDisplayItemInfo.h" +#if TARGET_OS_IPHONE +#import +#elif TARGET_OS_MAC +#import +#endif + +@class LookinAttributesGroup, LookinIvarTrace, LookinPreviewItemLayer, LookinEventHandler, LKDisplayItemNode, LookinDisplayItem; + +typedef NS_ENUM(NSUInteger, LookinDisplayItemImageEncodeType) { + LookinDisplayItemImageEncodeTypeNone, // 不进行 encode + LookinDisplayItemImageEncodeTypeNSData, // 转换为 NSData + LookinDisplayItemImageEncodeTypeImage // 使用 NSImage / UIImage 自身的 encode 方法 +}; + +typedef NS_ENUM(NSUInteger, LookinDoNotFetchScreenshotReason) { + // can sync screenshot + LookinFetchScreenshotPermitted, + // layer is too large + LookinDoNotFetchScreenshotForTooLarge, + // refused by user config in LookinServer + LookinDoNotFetchScreenshotForUserConfig +}; + + +typedef NS_ENUM(NSUInteger, LookinDisplayItemProperty) { + // 当初次设置 delegate 对象时,会立即以该值触发一次 displayItem:propertyDidChange: + LookinDisplayItemProperty_None, + LookinDisplayItemProperty_FrameToRoot, + LookinDisplayItemProperty_DisplayingInHierarchy, + LookinDisplayItemProperty_InHiddenHierarchy, + LookinDisplayItemProperty_IsExpandable, + LookinDisplayItemProperty_IsExpanded, + LookinDisplayItemProperty_SoloScreenshot, + LookinDisplayItemProperty_GroupScreenshot, + LookinDisplayItemProperty_IsSelected, + LookinDisplayItemProperty_IsHovered, + LookinDisplayItemProperty_AvoidSyncScreenshot, + LookinDisplayItemProperty_InNoPreviewHierarchy, + LookinDisplayItemProperty_IsInSearch, + LookinDisplayItemProperty_HighlightedSearchString, +}; + +@protocol LookinDisplayItemDelegate + +- (void)displayItem:(LookinDisplayItem *)displayItem propertyDidChange:(LookinDisplayItemProperty)property; + +@end + +@interface LookinDisplayItem : NSObject + +/// 当 customInfo 不为 nil 时,意思是该 DisplayItem 为 UserCustom 配置的。此时,Encode 属性中仅 subitems 和 customAttrGroupList 属性有意义,其它几乎所有属性都无意义 +@property(nonatomic, strong) LookinCustomDisplayItemInfo *customInfo; + +@property(nonatomic, copy) NSArray *subitems; + +@property(nonatomic, assign) BOOL isHidden; + +@property(nonatomic, assign) float alpha; + +@property(nonatomic, assign) CGRect frame; + +@property(nonatomic, assign) CGRect bounds; + +/// 不存在 subitems 时,该属性的值为 nil +@property(nonatomic, strong) LookinImage *soloScreenshot; +/// 无论是否存在 subitems,该属性始终存在 +@property(nonatomic, strong) LookinImage *groupScreenshot; + +@property(nonatomic, strong) LookinObject *viewObject; +@property(nonatomic, strong) LookinObject *layerObject; +@property(nonatomic, strong) LookinObject *hostViewControllerObject; + +/// attrGroups 列表 +@property(nonatomic, copy) NSArray *attributesGroupList; +/// 通过 lookin_customDebugInfos 返回的属性列表 +@property(nonatomic, copy) NSArray *customAttrGroupList; +/// attributesGroupList + customAttrGroupList +- (NSArray *)queryAllAttrGroupList; + +@property(nonatomic, copy) NSArray *eventHandlers; + +// 如果当前 item 代表 UIWindow 且是 keyWindow,则该属性为 YES +@property(nonatomic, assign) BOOL representedAsKeyWindow; + + +/// view 或 layer 的 backgroundColor,利用该属性来提前渲染 node 的背景色,使得用户感觉加载的快一点 +/// 注意有一个缺点是,理论上应该像 screenshot 一样拆成 soloBackgroundColor 和 groupBackgroundColor,这里的 backgroundColor 实际上是 soloBackgroundColor,因此某些场景的显示会有瑕疵 +@property(nonatomic, strong) LookinColor *backgroundColor; + +/// 用户可以在 iOS 项目中添加 Lookin 自定义配置来显式地拒绝传输某些图层的图像,通常是屏蔽一些不重要的 View 以提升刷新速度。如果用户这么配置了,那么这个 shouldCaptureImage 就会被置为 NO +/// 默认为 YES +@property(nonatomic, assign) BOOL shouldCaptureImage; + +/// 用户通过重写 lookin_customDebugInfos 而自定义的该实例的名字 +/// 可能为 nil +@property(nonatomic, copy) NSString *customDisplayTitle; + +/// 为 DanceUI SDK 预留的内部字段,用于文件跳转 +/// 可能为 nil +@property(nonatomic, copy) NSString *danceuiSource; + +#pragma mark - No Encode/Decode + +@property(nonatomic, weak) id previewItemDelegate; +@property(nonatomic, weak) id rowViewDelegate; + +/// 父节点 +@property(nonatomic, weak) LookinDisplayItem *superItem; + +/// 如果存在 viewObject 则返回 viewObject,否则返回 layerObject +- (LookinObject *)displayingObject; + +/// 在 hierarchy 中的层级,比如顶层的 UIWindow.indentLevel 为 0,UIWindow 的 subitem 的 indentLevel 为 1 +- (NSInteger)indentLevel; + +/** + 该项是否被展开 + @note 假如自己没有被折叠,但是 superItem 被折叠了,则自己仍然不会被看到,但是 self.isExpanded 值仍然为 NO + @note 如果 item 没有 subitems(也就是 isExpandable 为 NO),则该值没有意义。换句话说,在获取该值之前,必须先判断一下 isExpandable + */ +@property(nonatomic, assign) BOOL isExpanded; + +/// 如果有 subitems,则该属性返回 YES,否则返回 NO +@property(nonatomic, assign, readonly) BOOL isExpandable; + +/** + 是否能在 hierarchy panel 上被看到,假如有任意一层的父级元素的 isExpanded 为 NO,则 displayingInHierarchy 为 NO。如果所有父级元素的 isExpanded 均为 YES,则 displayingInHierarchy 为 YES + */ +@property(nonatomic, assign, readonly) BOOL displayingInHierarchy; + +/** + 如果自身或任意一个上层元素的 isHidden 为 YES 或 alpha 为 0,则该属性返回 YES + */ +@property(nonatomic, assign, readonly) BOOL inHiddenHierarchy; + +@property(nonatomic, assign) LookinDisplayItemImageEncodeType screenshotEncodeType; + +/// Whether to fetch screenshot and why. Default to LookinFetchScreenshotPermitted. +@property(nonatomic, assign) LookinDoNotFetchScreenshotReason doNotFetchScreenshotReason; + +@property(nonatomic, weak) LookinPreviewItemLayer *previewLayer; + +@property(nonatomic, weak) LKDisplayItemNode *previewNode; + +/// 如果该值为 YES,则该 item 及所有子 item 均不会在 preview 中被显示出来,只能在 hierarchy 中选择。默认为 NO +@property(nonatomic, assign) BOOL noPreview; + +/// 如果自身或某个上级元素的 noPreview 值为 YES,则该方法返回 YES +/// 注意:当 userCustom 为 YES 时,该属性也可能返回 YES +@property(nonatomic, assign, readonly) BOOL inNoPreviewHierarchy; + +/// 当小于 0 时表示未被设置 +@property(nonatomic, assign) NSInteger previewZIndex; + +@property(nonatomic, assign) BOOL preferToBeCollapsed; + +- (void)notifySelectionChangeToDelegates; +- (void)notifyHoverChangeToDelegates; + +/// 根据 subItems 属性将 items 打平为一维数组 ++ (NSArray *)flatItemsFromHierarchicalItems:(NSArray *)items; + +@property(nonatomic, assign) BOOL hasDeterminedExpansion; + +/// 设置当前是否处于搜索状态 +@property(nonatomic, assign) BOOL isInSearch; +/// 因为搜索而应该被高亮的字符串 +@property(nonatomic, copy) NSString *highlightedSearchString; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinDisplayItem.m b/Pods/LookinServer/Src/Main/Shared/LookinDisplayItem.m new file mode 100644 index 0000000..82ef8d9 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinDisplayItem.m @@ -0,0 +1,450 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinDisplayItem.m +// qmuidemo +// +// Created by Li Kai on 2018/11/15. +// Copyright © 2018 QMUI Team. All rights reserved. +// + +#import "LookinDisplayItem.h" +#import "LookinAttributesGroup.h" +#import "LookinAttributesSection.h" +#import "LookinAttribute.h" +#import "LookinEventHandler.h" +#import "LookinIvarTrace.h" +#import "Color+Lookin.h" +#import "NSArray+Lookin.h" +#import "NSObject+Lookin.h" +#import "LookinDashboardBlueprint.h" + +#if TARGET_OS_IPHONE +#import "UIColor+LookinServer.h" +#import "UIImage+LookinServer.h" +#elif TARGET_OS_MAC +#endif + +@interface LookinDisplayItem () + +@property(nonatomic, assign, readwrite) CGRect frameToRoot; +@property(nonatomic, assign, readwrite) BOOL inNoPreviewHierarchy; +@property(nonatomic, assign) NSInteger indentLevel; +@property(nonatomic, assign, readwrite) BOOL isExpandable; +@property(nonatomic, assign, readwrite) BOOL inHiddenHierarchy; +@property(nonatomic, assign, readwrite) BOOL displayingInHierarchy; + +@end + +@implementation LookinDisplayItem + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinDisplayItem *newDisplayItem = [[LookinDisplayItem allocWithZone:zone] init]; + newDisplayItem.subitems = [self.subitems lookin_map:^id(NSUInteger idx, LookinDisplayItem *value) { + return value.copy; + }]; + newDisplayItem.customInfo = self.customInfo.copy; + newDisplayItem.isHidden = self.isHidden; + newDisplayItem.alpha = self.alpha; + newDisplayItem.frame = self.frame; + newDisplayItem.bounds = self.bounds; + newDisplayItem.soloScreenshot = self.soloScreenshot; + newDisplayItem.groupScreenshot = self.groupScreenshot; + newDisplayItem.viewObject = self.viewObject.copy; + newDisplayItem.layerObject = self.layerObject.copy; + newDisplayItem.hostViewControllerObject = self.hostViewControllerObject.copy; + newDisplayItem.attributesGroupList = [self.attributesGroupList lookin_map:^id(NSUInteger idx, LookinAttributesGroup *value) { + return value.copy; + }]; + newDisplayItem.customAttrGroupList = [self.customAttrGroupList lookin_map:^id(NSUInteger idx, LookinAttributesGroup *value) { + return value.copy; + }]; + newDisplayItem.eventHandlers = [self.eventHandlers lookin_map:^id(NSUInteger idx, LookinEventHandler *value) { + return value.copy; + }]; + newDisplayItem.shouldCaptureImage = self.shouldCaptureImage; + newDisplayItem.representedAsKeyWindow = self.representedAsKeyWindow; + newDisplayItem.customDisplayTitle = self.customDisplayTitle; + newDisplayItem.danceuiSource = self.danceuiSource; + [newDisplayItem _updateDisplayingInHierarchyProperty]; + return newDisplayItem; +} +#pragma mark - + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.customInfo forKey:@"customInfo"]; + [aCoder encodeObject:self.subitems forKey:@"subitems"]; + [aCoder encodeBool:self.isHidden forKey:@"hidden"]; + [aCoder encodeFloat:self.alpha forKey:@"alpha"]; + [aCoder encodeObject:self.viewObject forKey:@"viewObject"]; + [aCoder encodeObject:self.layerObject forKey:@"layerObject"]; + [aCoder encodeObject:self.hostViewControllerObject forKey:@"hostViewControllerObject"]; + [aCoder encodeObject:self.attributesGroupList forKey:@"attributesGroupList"]; + [aCoder encodeObject:self.customAttrGroupList forKey:@"customAttrGroupList"]; + [aCoder encodeBool:self.representedAsKeyWindow forKey:@"representedAsKeyWindow"]; + [aCoder encodeObject:self.eventHandlers forKey:@"eventHandlers"]; + [aCoder encodeBool:self.shouldCaptureImage forKey:@"shouldCaptureImage"]; + if (self.screenshotEncodeType == LookinDisplayItemImageEncodeTypeNSData) { + [aCoder encodeObject:[self.soloScreenshot lookin_encodedObjectWithType:LookinCodingValueTypeImage] forKey:@"soloScreenshot"]; + [aCoder encodeObject:[self.groupScreenshot lookin_encodedObjectWithType:LookinCodingValueTypeImage] forKey:@"groupScreenshot"]; + } else if (self.screenshotEncodeType == LookinDisplayItemImageEncodeTypeImage) { + [aCoder encodeObject:self.soloScreenshot forKey:@"soloScreenshot"]; + [aCoder encodeObject:self.groupScreenshot forKey:@"groupScreenshot"]; + } + [aCoder encodeObject:self.customDisplayTitle forKey:@"customDisplayTitle"]; + [aCoder encodeObject:self.danceuiSource forKey:@"danceuiSource"]; +#if TARGET_OS_IPHONE + [aCoder encodeCGRect:self.frame forKey:@"frame"]; + [aCoder encodeCGRect:self.bounds forKey:@"bounds"]; + [aCoder encodeObject:self.backgroundColor.lks_rgbaComponents forKey:@"backgroundColor"]; + +#elif TARGET_OS_MAC + [aCoder encodeRect:self.frame forKey:@"frame"]; + [aCoder encodeRect:self.bounds forKey:@"bounds"]; + [aCoder encodeObject:self.backgroundColor.lookin_rgbaComponents forKey:@"backgroundColor"]; +#endif +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.customInfo = [aDecoder decodeObjectForKey:@"customInfo"]; + self.subitems = [aDecoder decodeObjectForKey:@"subitems"]; + self.isHidden = [aDecoder decodeBoolForKey:@"hidden"]; + self.alpha = [aDecoder decodeFloatForKey:@"alpha"]; + self.viewObject = [aDecoder decodeObjectForKey:@"viewObject"]; + self.layerObject = [aDecoder decodeObjectForKey:@"layerObject"]; + self.hostViewControllerObject = [aDecoder decodeObjectForKey:@"hostViewControllerObject"]; + self.attributesGroupList = [aDecoder decodeObjectForKey:@"attributesGroupList"]; + self.customAttrGroupList = [aDecoder decodeObjectForKey:@"customAttrGroupList"]; + self.representedAsKeyWindow = [aDecoder decodeBoolForKey:@"representedAsKeyWindow"]; + + id soloScreenshotObj = [aDecoder decodeObjectForKey:@"soloScreenshot"]; + if (soloScreenshotObj) { + if ([soloScreenshotObj isKindOfClass:[NSData class]]) { + self.soloScreenshot = [soloScreenshotObj lookin_decodedObjectWithType:LookinCodingValueTypeImage]; + } else if ([soloScreenshotObj isKindOfClass:[LookinImage class]]) { + self.soloScreenshot = soloScreenshotObj; + } else { + NSAssert(NO, @""); + } + } + + id groupScreenshotObj = [aDecoder decodeObjectForKey:@"groupScreenshot"]; + if (groupScreenshotObj) { + if ([groupScreenshotObj isKindOfClass:[NSData class]]) { + self.groupScreenshot = [groupScreenshotObj lookin_decodedObjectWithType:LookinCodingValueTypeImage]; + } else if ([groupScreenshotObj isKindOfClass:[LookinImage class]]) { + self.groupScreenshot = groupScreenshotObj; + } else { + NSAssert(NO, @""); + } + } + + self.eventHandlers = [aDecoder decodeObjectForKey:@"eventHandlers"]; + /// this property was added in LookinServer 1.1.3 + self.shouldCaptureImage = [aDecoder containsValueForKey:@"shouldCaptureImage"] ? [aDecoder decodeBoolForKey:@"shouldCaptureImage"] : YES; + self.customDisplayTitle = [aDecoder decodeObjectForKey:@"customDisplayTitle"]; + self.danceuiSource = [aDecoder decodeObjectForKey:@"danceuiSource"]; +#if TARGET_OS_IPHONE + self.frame = [aDecoder decodeCGRectForKey:@"frame"]; + self.bounds = [aDecoder decodeCGRectForKey:@"bounds"]; + self.backgroundColor = [UIColor lks_colorFromRGBAComponents:[aDecoder decodeObjectForKey:@"backgroundColor"]]; +#elif TARGET_OS_MAC + self.frame = [aDecoder decodeRectForKey:@"frame"]; + self.bounds = [aDecoder decodeRectForKey:@"bounds"]; + self.backgroundColor = [NSColor lookin_colorFromRGBAComponents:[aDecoder decodeObjectForKey:@"backgroundColor"]]; + +#endif + [self _updateDisplayingInHierarchyProperty]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (instancetype)init { + if (self = [super init]) { + /// 在手机端,displayItem 被创建时会调用这个方法 + [self _updateDisplayingInHierarchyProperty]; + } + return self; +} + +- (LookinObject *)displayingObject { + return self.viewObject ? : self.layerObject; +} + +- (void)setAttributesGroupList:(NSArray *)attributesGroupList { + _attributesGroupList = attributesGroupList; + + [_attributesGroupList enumerateObjectsUsingBlock:^(LookinAttributesGroup * _Nonnull group, NSUInteger idx, BOOL * _Nonnull stop) { + [group.attrSections enumerateObjectsUsingBlock:^(LookinAttributesSection * _Nonnull section, NSUInteger idx, BOOL * _Nonnull stop) { + [section.attributes enumerateObjectsUsingBlock:^(LookinAttribute * _Nonnull attr, NSUInteger idx, BOOL * _Nonnull stop) { + attr.targetDisplayItem = self; + }]; + }]; + }]; +} + +- (void)setCustomAttrGroupList:(NSArray *)customAttrGroupList { + _customAttrGroupList = customAttrGroupList; + // 传进来的时候就已经排好序了 + [customAttrGroupList enumerateObjectsUsingBlock:^(LookinAttributesGroup * _Nonnull group, NSUInteger idx, BOOL * _Nonnull stop) { + [group.attrSections enumerateObjectsUsingBlock:^(LookinAttributesSection * _Nonnull section, NSUInteger idx, BOOL * _Nonnull stop) { + [section.attributes enumerateObjectsUsingBlock:^(LookinAttribute * _Nonnull attr, NSUInteger idx, BOOL * _Nonnull stop) { + attr.targetDisplayItem = self; + }]; + }]; + }]; +} + +- (void)setSubitems:(NSArray *)subitems { + [_subitems enumerateObjectsUsingBlock:^(LookinDisplayItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + obj.superItem = nil; + }]; + + _subitems = subitems; + + self.isExpandable = (subitems.count > 0); + + [subitems enumerateObjectsUsingBlock:^(LookinDisplayItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + NSAssert(!obj.superItem, @""); + obj.superItem = self; + + [obj _updateInHiddenHierarchyProperty]; + [obj _updateDisplayingInHierarchyProperty]; + }]; +} + +- (void)setIsExpandable:(BOOL)isExpandable { + if (_isExpandable == isExpandable) { + return; + } + _isExpandable = isExpandable; + [self _notifyDelegatesWith:LookinDisplayItemProperty_IsExpandable]; +} + +- (void)setIsExpanded:(BOOL)isExpanded { + if (_isExpanded == isExpanded) { + return; + } + _isExpanded = isExpanded; + [self.subitems enumerateObjectsUsingBlock:^(LookinDisplayItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [obj _updateDisplayingInHierarchyProperty]; + }]; + [self _notifyDelegatesWith:LookinDisplayItemProperty_IsExpanded]; +} + +- (void)setSoloScreenshot:(LookinImage *)soloScreenshot { + if (_soloScreenshot == soloScreenshot) { + return; + } + _soloScreenshot = soloScreenshot; + [self _notifyDelegatesWith:LookinDisplayItemProperty_SoloScreenshot]; +} + +- (void)notifySelectionChangeToDelegates { + [self _notifyDelegatesWith:LookinDisplayItemProperty_IsSelected]; +} + +- (void)notifyHoverChangeToDelegates { + [self _notifyDelegatesWith:LookinDisplayItemProperty_IsHovered]; +} + +- (void)setDoNotFetchScreenshotReason:(LookinDoNotFetchScreenshotReason)doNotFetchScreenshotReason { + if (_doNotFetchScreenshotReason == doNotFetchScreenshotReason) { + return; + } + _doNotFetchScreenshotReason = doNotFetchScreenshotReason; + [self _notifyDelegatesWith:LookinDisplayItemProperty_AvoidSyncScreenshot]; +} + +- (void)setGroupScreenshot:(LookinImage *)groupScreenshot { + if (_groupScreenshot == groupScreenshot) { + return; + } + _groupScreenshot = groupScreenshot; + [self _notifyDelegatesWith:LookinDisplayItemProperty_GroupScreenshot]; +} + +- (void)setDisplayingInHierarchy:(BOOL)displayingInHierarchy { + if (_displayingInHierarchy == displayingInHierarchy) { + return; + } + _displayingInHierarchy = displayingInHierarchy; + [self.subitems enumerateObjectsUsingBlock:^(LookinDisplayItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [obj _updateDisplayingInHierarchyProperty]; + }]; + + [self _notifyDelegatesWith:LookinDisplayItemProperty_DisplayingInHierarchy]; +} + +- (void)_updateDisplayingInHierarchyProperty { + if (self.superItem && (!self.superItem.displayingInHierarchy || !self.superItem.isExpanded)) { + self.displayingInHierarchy = NO; + } else { + self.displayingInHierarchy = YES; + } +} + +- (void)setIsHidden:(BOOL)isHidden { + _isHidden = isHidden; + [self _updateInHiddenHierarchyProperty]; +} + +- (void)setAlpha:(float)alpha { + _alpha = alpha; + [self _updateInHiddenHierarchyProperty]; +} + +- (void)setInHiddenHierarchy:(BOOL)inHiddenHierarchy { + if (_inHiddenHierarchy == inHiddenHierarchy) { + return; + } + _inHiddenHierarchy = inHiddenHierarchy; + [self.subitems enumerateObjectsUsingBlock:^(LookinDisplayItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [obj _updateInHiddenHierarchyProperty]; + }]; + + [self _notifyDelegatesWith:LookinDisplayItemProperty_InHiddenHierarchy]; +} + +- (void)_updateInHiddenHierarchyProperty { + if (self.superItem.inHiddenHierarchy || self.isHidden || self.alpha <= 0) { + self.inHiddenHierarchy = YES; + } else { + self.inHiddenHierarchy = NO; + } +} + ++ (NSArray *)flatItemsFromHierarchicalItems:(NSArray *)items { + NSMutableArray *resultArray = [NSMutableArray array]; + + [items enumerateObjectsUsingBlock:^(LookinDisplayItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.superItem) { + obj.indentLevel = obj.superItem.indentLevel + 1; + } + [resultArray addObject:obj]; + if (obj.subitems.count) { + [resultArray addObjectsFromArray:[self flatItemsFromHierarchicalItems:obj.subitems]]; + } + }]; + + return resultArray; +} + +- (NSString *)description { + if (self.viewObject) { + return self.viewObject.rawClassName; + } else if (self.layerObject) { + return self.layerObject.rawClassName; + } else { + return [super description]; + } +} + +- (void)setPreviewItemDelegate:(id)previewItemDelegate { + _previewItemDelegate = previewItemDelegate; + + if (![previewItemDelegate respondsToSelector:@selector(displayItem:propertyDidChange:)]) { + NSAssert(NO, @""); + _previewItemDelegate = nil; + return; + } + [self.previewItemDelegate displayItem:self propertyDidChange:LookinDisplayItemProperty_None]; +} + +- (void)setRowViewDelegate:(id)rowViewDelegate { + if (_rowViewDelegate == rowViewDelegate) { + return; + } + _rowViewDelegate = rowViewDelegate; + + if (![rowViewDelegate respondsToSelector:@selector(displayItem:propertyDidChange:)]) { + NSAssert(NO, @""); + _rowViewDelegate = nil; + return; + } + [self.rowViewDelegate displayItem:self propertyDidChange:LookinDisplayItemProperty_None]; +} + +- (void)setFrame:(CGRect)frame { + _frame = frame; + [self recursivelyNotifyFrameToRootMayChange]; +} + +- (void)recursivelyNotifyFrameToRootMayChange { + [self _notifyDelegatesWith:LookinDisplayItemProperty_FrameToRoot]; + + [self.subitems enumerateObjectsUsingBlock:^(LookinDisplayItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [obj recursivelyNotifyFrameToRootMayChange]; + }]; +} + +- (void)setBounds:(CGRect)bounds { + _bounds = bounds; + [self recursivelyNotifyFrameToRootMayChange]; +} + +- (void)setInNoPreviewHierarchy:(BOOL)inNoPreviewHierarchy { + if (_inNoPreviewHierarchy == inNoPreviewHierarchy) { + return; + } + _inNoPreviewHierarchy = inNoPreviewHierarchy; + [self.subitems enumerateObjectsUsingBlock:^(LookinDisplayItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [obj _updateInNoPreviewHierarchy]; + }]; + [self _notifyDelegatesWith:LookinDisplayItemProperty_InNoPreviewHierarchy]; +} + +- (void)setNoPreview:(BOOL)noPreview { + _noPreview = noPreview; + [self _updateInNoPreviewHierarchy]; +} + +- (void)_updateInNoPreviewHierarchy { + if (self.superItem.inNoPreviewHierarchy || self.noPreview) { + self.inNoPreviewHierarchy = YES; + } else { + self.inNoPreviewHierarchy = NO; + } +} + +- (void)_notifyDelegatesWith:(LookinDisplayItemProperty)property { + [self.previewItemDelegate displayItem:self propertyDidChange:property]; + [self.rowViewDelegate displayItem:self propertyDidChange:property]; +} + +- (void)setIsInSearch:(BOOL)isInSearch { + _isInSearch = isInSearch; + [self _notifyDelegatesWith:LookinDisplayItemProperty_IsInSearch]; +} + +- (void)setHighlightedSearchString:(NSString *)highlightedSearchString { + _highlightedSearchString = highlightedSearchString; + [self _notifyDelegatesWith:LookinDisplayItemProperty_HighlightedSearchString]; +} + +- (NSArray *)queryAllAttrGroupList { + NSMutableArray *array = [NSMutableArray array]; + if (self.attributesGroupList) { + [array addObjectsFromArray:self.attributesGroupList]; + } + if (self.customAttrGroupList) { + [array addObjectsFromArray:self.customAttrGroupList]; + } + return array; +} + +//- (void)dealloc +//{ +// NSLog(@"moss dealloc -%@", self); +//} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinDisplayItemDetail.h b/Pods/LookinServer/Src/Main/Shared/LookinDisplayItemDetail.h new file mode 100644 index 0000000..adb60c3 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinDisplayItemDetail.h @@ -0,0 +1,51 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinDisplayItemDetail.h +// Lookin +// +// Created by Li Kai on 2019/2/19. +// https://lookin.work +// + +#import "LookinDefines.h" + +@class LookinAttributesGroup; +@class LookinDisplayItem; + +@interface LookinDisplayItemDetail : NSObject + +@property(nonatomic, assign) unsigned long displayItemOid; + +@property(nonatomic, strong) LookinImage *groupScreenshot; + +@property(nonatomic, strong) LookinImage *soloScreenshot; + +@property(nonatomic, strong) NSValue *frameValue; + +@property(nonatomic, strong) NSValue *boundsValue; + +@property(nonatomic, strong) NSNumber *hiddenValue; + +@property(nonatomic, strong) NSNumber *alphaValue; + +@property(nonatomic, copy) NSString *customDisplayTitle; + +@property(nonatomic, copy) NSString *danceUISource; + +@property(nonatomic, copy) NSArray *attributesGroupList; +@property(nonatomic, copy) NSArray *customAttrGroupList; + +/// 注意 nil 和空数组的区别:nil 表示该属性无意义,空数组表示 subviews 为空 +/// Client 1.0.7 & Server 1.2.7 开始支持该属性 +/// 默认为 nil +@property(nonatomic, copy) NSArray *subitems; + +/// 当 Server 找不到 task 对应的图层时,会返回一个特殊的 LookinDisplayItemDetail 对象,这个对象会被设置 displayItemOid 和 failureCode,其中 failureCode 会被置为 -1 +/// Client 1.0.7 & Server 1.2.7 开始支持该属性 +/// 默认为 0 +@property(nonatomic, assign) NSInteger failureCode; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinDisplayItemDetail.m b/Pods/LookinServer/Src/Main/Shared/LookinDisplayItemDetail.m new file mode 100644 index 0000000..195c03c --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinDisplayItemDetail.m @@ -0,0 +1,71 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinDisplayItemDetail.m +// Lookin +// +// Created by Li Kai on 2019/2/19. +// https://lookin.work +// + +#import "LookinDisplayItemDetail.h" +#import "Image+Lookin.h" + +#if TARGET_OS_IPHONE +#import "UIImage+LookinServer.h" +#endif + +@implementation LookinDisplayItemDetail + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:@(self.displayItemOid) forKey:@"displayItemOid"]; + [aCoder encodeObject:self.groupScreenshot.lookin_data forKey:@"groupScreenshot"]; + [aCoder encodeObject:self.soloScreenshot.lookin_data forKey:@"soloScreenshot"]; + [aCoder encodeObject:self.frameValue forKey:@"frameValue"]; + [aCoder encodeObject:self.boundsValue forKey:@"boundsValue"]; + [aCoder encodeObject:self.hiddenValue forKey:@"hiddenValue"]; + [aCoder encodeObject:self.alphaValue forKey:@"alphaValue"]; + [aCoder encodeObject:self.attributesGroupList forKey:@"attributesGroupList"]; + [aCoder encodeObject:self.customAttrGroupList forKey:@"customAttrGroupList"]; + [aCoder encodeObject:self.customDisplayTitle forKey:@"customDisplayTitle"]; + [aCoder encodeObject:self.danceUISource forKey:@"danceUISource"]; + [aCoder encodeInteger:self.failureCode forKey:@"failureCode"]; + if (self.subitems) { + [aCoder encodeObject:self.subitems forKey:@"subitems"]; + } +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.displayItemOid = [[aDecoder decodeObjectForKey:@"displayItemOid"] unsignedLongValue]; + self.groupScreenshot = [[LookinImage alloc] initWithData:[aDecoder decodeObjectForKey:@"groupScreenshot"]]; + self.soloScreenshot = [[LookinImage alloc] initWithData:[aDecoder decodeObjectForKey:@"soloScreenshot"]]; + self.frameValue = [aDecoder decodeObjectForKey:@"frameValue"]; + self.boundsValue = [aDecoder decodeObjectForKey:@"boundsValue"]; + self.hiddenValue = [aDecoder decodeObjectForKey:@"hiddenValue"]; + self.alphaValue = [aDecoder decodeObjectForKey:@"alphaValue"]; + self.attributesGroupList = [aDecoder decodeObjectForKey:@"attributesGroupList"]; + self.customAttrGroupList = [aDecoder decodeObjectForKey:@"customAttrGroupList"]; + self.customDisplayTitle = [aDecoder decodeObjectForKey:@"customDisplayTitle"]; + self.danceUISource = [aDecoder decodeObjectForKey:@"danceUISource"]; + + if ([aDecoder containsValueForKey:@"failureCode"]) { + self.failureCode = [aDecoder decodeIntegerForKey:@"failureCode"]; + } else { + self.failureCode = 0; + } + + if ([aDecoder containsValueForKey:@"subitems"]) { + self.subitems = [aDecoder decodeObjectForKey:@"subitems"]; + } + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinEventHandler.h b/Pods/LookinServer/Src/Main/Shared/LookinEventHandler.h new file mode 100644 index 0000000..cf44b76 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinEventHandler.h @@ -0,0 +1,43 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinEventHandler.h +// Lookin +// +// Created by Li Kai on 2019/8/7. +// https://lookin.work +// + + + +#import + +@class LookinObject, LookinIvarTrace, LookinStringTwoTuple; + +typedef NS_ENUM(NSInteger, LookinEventHandlerType) { + LookinEventHandlerTypeTargetAction, + LookinEventHandlerTypeGesture +}; + +@interface LookinEventHandler : NSObject + +@property(nonatomic, assign) LookinEventHandlerType handlerType; + +/// 比如 "UIControlEventTouchUpInside", "UITapGestureRecognizer" +@property(nonatomic, copy) NSString *eventName; +/// tuple.first => @"",tuple.second => @"handleTap" +@property(nonatomic, copy) NSArray *targetActions; + +/// 返回当前 recognizer 是继承自哪一个基本款 recognizer。 +/// 基本款 recognizer 指的是 TapRecognizer, PinchRecognizer 之类的常见 recognizer +/// 如果当前 recognizer 本身就是基本款 recognizer,则该属性为 nil +@property(nonatomic, copy) NSString *inheritedRecognizerName; +@property(nonatomic, assign) BOOL gestureRecognizerIsEnabled; +@property(nonatomic, copy) NSString *gestureRecognizerDelegator; +@property(nonatomic, copy) NSArray *recognizerIvarTraces; +/// recognizer 对象 +@property(nonatomic, assign) unsigned long long recognizerOid; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinEventHandler.m b/Pods/LookinServer/Src/Main/Shared/LookinEventHandler.m new file mode 100644 index 0000000..8a1576c --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinEventHandler.m @@ -0,0 +1,71 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinEventHandler.m +// Lookin +// +// Created by Li Kai on 2019/8/7. +// https://lookin.work +// + + + +#import "LookinEventHandler.h" +#import "LookinObject.h" +#import "LookinTuple.h" + +#import "NSArray+Lookin.h" + +@implementation LookinEventHandler + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinEventHandler *newHandler = [[LookinEventHandler allocWithZone:zone] init]; + newHandler.handlerType = self.handlerType; + newHandler.eventName = self.eventName; + newHandler.targetActions = [self.targetActions lookin_map:^id(NSUInteger idx, LookinStringTwoTuple *value) { + return value.copy; + }]; + newHandler.gestureRecognizerIsEnabled = self.gestureRecognizerIsEnabled; + newHandler.gestureRecognizerDelegator = self.gestureRecognizerDelegator; + newHandler.inheritedRecognizerName = self.inheritedRecognizerName; + newHandler.recognizerIvarTraces = self.recognizerIvarTraces.copy; + newHandler.recognizerOid = self.recognizerOid; + return newHandler; +} + +#pragma mark - + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeInteger:self.handlerType forKey:@"handlerType"]; + [aCoder encodeBool:self.gestureRecognizerIsEnabled forKey:@"gestureRecognizerIsEnabled"]; + [aCoder encodeObject:self.eventName forKey:@"eventName"]; + [aCoder encodeObject:self.gestureRecognizerDelegator forKey:@"gestureRecognizerDelegator"]; + [aCoder encodeObject:self.targetActions forKey:@"targetActions"]; + [aCoder encodeObject:self.inheritedRecognizerName forKey:@"inheritedRecognizerName"]; + [aCoder encodeObject:self.recognizerIvarTraces forKey:@"recognizerIvarTraces"]; + [aCoder encodeObject:@(self.recognizerOid) forKey:@"recognizerOid"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.handlerType = [aDecoder decodeIntegerForKey:@"handlerType"]; + self.gestureRecognizerIsEnabled = [aDecoder decodeBoolForKey:@"gestureRecognizerIsEnabled"]; + self.eventName = [aDecoder decodeObjectForKey:@"eventName"]; + self.gestureRecognizerDelegator = [aDecoder decodeObjectForKey:@"gestureRecognizerDelegator"]; + self.targetActions = [aDecoder decodeObjectForKey:@"targetActions"]; + self.inheritedRecognizerName = [aDecoder decodeObjectForKey:@"inheritedRecognizerName"]; + self.recognizerIvarTraces = [aDecoder decodeObjectForKey:@"recognizerIvarTraces"]; + self.recognizerOid = ((NSNumber *)[aDecoder decodeObjectForKey:@"recognizerOid"]).unsignedLongValue; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinHierarchyFile.h b/Pods/LookinServer/Src/Main/Shared/LookinHierarchyFile.h new file mode 100644 index 0000000..afa02cd --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinHierarchyFile.h @@ -0,0 +1,32 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinHierarchyFile.h +// Lookin +// +// Created by Li Kai on 2019/5/12. +// https://lookin.work +// + + + +#import + +@class LookinHierarchyInfo; + +@interface LookinHierarchyFile : NSObject + +/// 记录创建该文件的 LookinServer 的版本 +@property(nonatomic, assign) int serverVersion; + +@property(nonatomic, strong) LookinHierarchyInfo *hierarchyInfo; + +@property(nonatomic, copy) NSDictionary *soloScreenshots; +@property(nonatomic, copy) NSDictionary *groupScreenshots; + +/// 验证 file 的版本之类的是否和当前 Lookin 客户端匹配,如果没有问题则返回 nil,如果有问题则返回 error ++ (NSError *)verifyHierarchyFile:(LookinHierarchyFile *)file; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinHierarchyFile.m b/Pods/LookinServer/Src/Main/Shared/LookinHierarchyFile.m new file mode 100644 index 0000000..4b07e4a --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinHierarchyFile.m @@ -0,0 +1,64 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinHierarchyFile.m +// Lookin +// +// Created by Li Kai on 2019/5/12. +// https://lookin.work +// + + + +#import "LookinHierarchyFile.h" + +#import "NSArray+Lookin.h" + +@implementation LookinHierarchyFile + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeInt:self.serverVersion forKey:@"serverVersion"]; + [aCoder encodeObject:self.hierarchyInfo forKey:@"hierarchyInfo"]; + [aCoder encodeObject:self.soloScreenshots forKey:@"soloScreenshots"]; + [aCoder encodeObject:self.groupScreenshots forKey:@"groupScreenshots"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.serverVersion = [aDecoder decodeIntForKey:@"serverVersion"]; + self.hierarchyInfo = [aDecoder decodeObjectForKey:@"hierarchyInfo"]; + self.soloScreenshots = [aDecoder decodeObjectForKey:@"soloScreenshots"]; + self.groupScreenshots = [aDecoder decodeObjectForKey:@"groupScreenshots"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + ++ (NSError *)verifyHierarchyFile:(LookinHierarchyFile *)hierarchyFile { + if (![hierarchyFile isKindOfClass:[LookinHierarchyFile class]]) { + return LookinErr_Inner; + } + + if (hierarchyFile.serverVersion < LOOKIN_SUPPORTED_SERVER_MIN) { + // 文件版本太旧 + // 如果不存在 serverVersion 这个字段,说明版本是 6 + int fileVersion = hierarchyFile.serverVersion ? : 6; + NSString *detail = [NSString stringWithFormat:NSLocalizedString(@"The document was created by a Lookin app with too old version. Current Lookin app version is %@, but the document version is %@.", nil), @(LOOKIN_CLIENT_VERSION), @(fileVersion)]; + return [NSError errorWithDomain:LookinErrorDomain code:LookinErrCode_ServerVersionTooLow userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"Failed to open the document.", nil), NSLocalizedRecoverySuggestionErrorKey:detail}]; + } + + if (hierarchyFile.serverVersion > LOOKIN_SUPPORTED_SERVER_MAX) { + // 文件版本太新 + NSString *detail = [NSString stringWithFormat:NSLocalizedString(@"Current Lookin app is too old to open this document. Current Lookin app version is %@, but the document version is %@.", nil), @(LOOKIN_CLIENT_VERSION), @(hierarchyFile.serverVersion)]; + return [NSError errorWithDomain:LookinErrorDomain code:LookinErrCode_ServerVersionTooHigh userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"Failed to open the document.", nil), NSLocalizedRecoverySuggestionErrorKey:detail}]; + } + + return nil; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinHierarchyInfo.h b/Pods/LookinServer/Src/Main/Shared/LookinHierarchyInfo.h new file mode 100644 index 0000000..048d2f6 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinHierarchyInfo.h @@ -0,0 +1,47 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinDisplayInfo.h +// WeRead +// +// Created by Li Kai on 2018/10/22. +// Copyright © 2018年 tencent. All rights reserved. +// + + + +#import "LookinDefines.h" +#import "TargetConditionals.h" +#if TARGET_OS_IPHONE +#import +#elif TARGET_OS_MAC +#import +#endif + +@class LookinDisplayItem, LookinAttributesGroup, LookinAppInfo; + +@interface LookinHierarchyInfo : NSObject + +#if TARGET_OS_IPHONE + +/// version 可能为 nil,此时说明 Client 版本号 < 1.0.4 ++ (instancetype)staticInfoWithLookinVersion:(NSString *)version; + ++ (instancetype)exportedInfo; + +#endif + +/// 这里其实就是顶端的那几个 UIWindow +@property(nonatomic, copy) NSArray *displayItems; + +@property(nonatomic, copy) NSDictionary *colorAlias; + +@property(nonatomic, copy) NSArray *collapsedClassList; + +@property(nonatomic, strong) LookinAppInfo *appInfo; + +@property(nonatomic, assign) int serverVersion; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinHierarchyInfo.m b/Pods/LookinServer/Src/Main/Shared/LookinHierarchyInfo.m new file mode 100644 index 0000000..1048260 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinHierarchyInfo.m @@ -0,0 +1,106 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinDisplayInfo.m +// WeRead +// +// Created by Li Kai on 2018/10/22. +// Copyright © 2018年 tencent. All rights reserved. +// + +#import +#import "LookinHierarchyInfo.h" +#import "LookinAttributesGroup.h" +#import "LookinDisplayItem.h" +#import "LookinAppInfo.h" +#import "NSArray+Lookin.h" +#import "NSString+Lookin.h" + +#if TARGET_OS_IPHONE +#import "LKS_HierarchyDisplayItemsMaker.h" +#import "LKSConfigManager.h" +#import "LKS_CustomAttrSetterManager.h" +#endif + +@implementation LookinHierarchyInfo + +#if TARGET_OS_IPHONE + ++ (instancetype)staticInfoWithLookinVersion:(NSString *)version { + BOOL readCustomInfo = NO; + // Client 1.0.4 开始支持 customInfo + if (version && [version lookin_numbericOSVersion] >= 10004) { + readCustomInfo = YES; + } + + [[LKS_CustomAttrSetterManager sharedInstance] removeAll]; + + LookinHierarchyInfo *info = [LookinHierarchyInfo new]; + info.serverVersion = LOOKIN_SERVER_VERSION; + info.displayItems = [LKS_HierarchyDisplayItemsMaker itemsWithScreenshots:NO attrList:NO lowImageQuality:NO readCustomInfo:readCustomInfo saveCustomSetter:YES]; + info.appInfo = [LookinAppInfo currentInfoWithScreenshot:NO icon:YES localIdentifiers:nil]; + info.collapsedClassList = [LKSConfigManager collapsedClassList]; + info.colorAlias = [LKSConfigManager colorAlias]; + return info; +} + ++ (instancetype)exportedInfo { + LookinHierarchyInfo *info = [LookinHierarchyInfo new]; + info.serverVersion = LOOKIN_SERVER_VERSION; + info.displayItems = [LKS_HierarchyDisplayItemsMaker itemsWithScreenshots:YES attrList:YES lowImageQuality:YES readCustomInfo:YES saveCustomSetter:NO]; + info.appInfo = [LookinAppInfo currentInfoWithScreenshot:NO icon:YES localIdentifiers:nil]; + info.collapsedClassList = [LKSConfigManager collapsedClassList]; + info.colorAlias = [LKSConfigManager colorAlias]; + return info; +} + +#endif + +#pragma mark - + +static NSString * const LookinHierarchyInfoCodingKey_DisplayItems = @"1"; +static NSString * const LookinHierarchyInfoCodingKey_AppInfo = @"2"; +static NSString * const LookinHierarchyInfoCodingKey_ColorAlias = @"3"; +static NSString * const LookinHierarchyInfoCodingKey_CollapsedClassList = @"4"; + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.displayItems forKey:LookinHierarchyInfoCodingKey_DisplayItems]; + [aCoder encodeObject:self.colorAlias forKey:LookinHierarchyInfoCodingKey_ColorAlias]; + [aCoder encodeObject:self.collapsedClassList forKey:LookinHierarchyInfoCodingKey_CollapsedClassList]; + [aCoder encodeObject:self.appInfo forKey:LookinHierarchyInfoCodingKey_AppInfo]; + [aCoder encodeInt:self.serverVersion forKey:@"serverVersion"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.displayItems = [aDecoder decodeObjectForKey:LookinHierarchyInfoCodingKey_DisplayItems]; + self.colorAlias = [aDecoder decodeObjectForKey:LookinHierarchyInfoCodingKey_ColorAlias]; + self.collapsedClassList = [aDecoder decodeObjectForKey:LookinHierarchyInfoCodingKey_CollapsedClassList]; + self.appInfo = [aDecoder decodeObjectForKey:LookinHierarchyInfoCodingKey_AppInfo]; + self.serverVersion = [aDecoder decodeIntForKey:@"serverVersion"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinHierarchyInfo *newAppInfo = [[LookinHierarchyInfo allocWithZone:zone] init]; + newAppInfo.serverVersion = self.serverVersion; + newAppInfo.appInfo = self.appInfo.copy; + newAppInfo.collapsedClassList = self.collapsedClassList; + newAppInfo.colorAlias = self.colorAlias; + newAppInfo.displayItems = [self.displayItems lookin_map:^id(NSUInteger idx, LookinDisplayItem *oldItem) { + return oldItem.copy; + }]; + + return newAppInfo; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinObject.h b/Pods/LookinServer/Src/Main/Shared/LookinObject.h new file mode 100644 index 0000000..285749d --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinObject.h @@ -0,0 +1,42 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinObject.h +// Lookin +// +// Created by Li Kai on 2019/4/20. +// https://lookin.work +// + + + +#import + +@class LookinObjectIvar, LookinIvarTrace; + +@interface LookinObject : NSObject + +#if TARGET_OS_IPHONE ++ (instancetype)instanceWithObject:(NSObject *)object; +#endif + +@property(nonatomic, assign) unsigned long oid; + +@property(nonatomic, copy) NSString *memoryAddress; + +/** + 比如有一个 UILabel 对象,则它的 classChainList 为 @[@"UILabel", @"UIView", @"UIResponder", @"NSObject"],而它的 ivarList 长度为 4,idx 从小到大分别是 UILabel 层级的 ivars, UIView 层级的 ivars..... + */ +@property(nonatomic, copy) NSArray *classChainList; + +@property(nonatomic, copy) NSString *specialTrace; + +@property(nonatomic, copy) NSArray *ivarTraces; + +/// 没有 demangle,会包含 Swift Module Name +/// 在 Lookin 的展示中,绝大多数情况下应该使用 lk_demangledSwiftName +- (NSString *)rawClassName; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinObject.m b/Pods/LookinServer/Src/Main/Shared/LookinObject.m new file mode 100644 index 0000000..89d8fed --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinObject.m @@ -0,0 +1,82 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinObject.m +// Lookin +// +// Created by Li Kai on 2019/4/20. +// https://lookin.work +// + +#import "LookinObject.h" +#import "LookinIvarTrace.h" +#import "NSArray+Lookin.h" +#import "NSString+Lookin.h" + +#if TARGET_OS_IPHONE +#import "NSObject+LookinServer.h" +#endif + +@implementation LookinObject + +#if TARGET_OS_IPHONE ++ (instancetype)instanceWithObject:(NSObject *)object { + LookinObject *lookinObj = [LookinObject new]; + lookinObj.oid = [object lks_registerOid]; + + lookinObj.memoryAddress = [NSString stringWithFormat:@"%p", object]; + lookinObj.classChainList = [object lks_classChainList]; + + lookinObj.specialTrace = object.lks_specialTrace; + lookinObj.ivarTraces = object.lks_ivarTraces; + + return lookinObj; +} +#endif + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinObject *newObject = [[LookinObject allocWithZone:zone] init]; + newObject.oid = self.oid; + newObject.memoryAddress = self.memoryAddress; + newObject.classChainList = self.classChainList; + newObject.specialTrace = self.specialTrace; + newObject.ivarTraces = [self.ivarTraces lookin_map:^id(NSUInteger idx, LookinIvarTrace *value) { + return value.copy; + }]; + return newObject; +} + +#pragma mark - + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:@(self.oid) forKey:@"oid"]; + [aCoder encodeObject:self.memoryAddress forKey:@"memoryAddress"]; + [aCoder encodeObject:self.classChainList forKey:@"classChainList"]; + [aCoder encodeObject:self.specialTrace forKey:@"specialTrace"]; + [aCoder encodeObject:self.ivarTraces forKey:@"ivarTraces"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.oid = [(NSNumber *)[aDecoder decodeObjectForKey:@"oid"] unsignedLongValue]; + self.memoryAddress = [aDecoder decodeObjectForKey:@"memoryAddress"]; + self.classChainList = [aDecoder decodeObjectForKey:@"classChainList"]; + self.specialTrace = [aDecoder decodeObjectForKey:@"specialTrace"]; + self.ivarTraces = [aDecoder decodeObjectForKey:@"ivarTraces"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (NSString *)rawClassName { + return self.classChainList.firstObject; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinStaticAsyncUpdateTask.h b/Pods/LookinServer/Src/Main/Shared/LookinStaticAsyncUpdateTask.h new file mode 100644 index 0000000..85e1925 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinStaticAsyncUpdateTask.h @@ -0,0 +1,67 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinStaticAsyncUpdateTask.h +// Lookin +// +// Created by Li Kai on 2019/6/21. +// https://lookin.work +// + + + +#import "LookinDefines.h" + +typedef NS_ENUM(NSInteger, LookinStaticAsyncUpdateTaskType) { + LookinStaticAsyncUpdateTaskTypeNoScreenshot, + LookinStaticAsyncUpdateTaskTypeSoloScreenshot, + LookinStaticAsyncUpdateTaskTypeGroupScreenshot +}; + +typedef NS_ENUM(NSInteger, LookinDetailUpdateTaskAttrRequest) { + /// 由 Server 端自己决定:同一批 task 里,server 端会保证同一个 layer 只会构造一次 attr + /// 在 Lookin turbo 模式下,由于同一个 layer 的 task 可能位于不同批的 task 里,因此这会导致冗余的 attr 构造行为、浪费一定时间 + LookinDetailUpdateTaskAttrRequest_Automatic, + /// 需要返回 attr + LookinDetailUpdateTaskAttrRequest_Need, + /// 不需要返回 attr + LookinDetailUpdateTaskAttrRequest_NotNeed +}; + +/// 业务重写了 isEqual +@interface LookinStaticAsyncUpdateTask : NSObject + +@property(nonatomic, assign) unsigned long oid; + +@property(nonatomic, assign) LookinStaticAsyncUpdateTaskType taskType; + +/// 是否需要返回 attr 数据,默认为 Automatic +/// Client 1.0.7 & Server 1.2.7 开始支持这个参数 +@property(nonatomic, assign) LookinDetailUpdateTaskAttrRequest attrRequest; + +/// 如果置为 YES,则 server 侧会返回这些基础信息:frameValue, boundsValue, hiddenValue, alphaValue +/// 默认为 NO +/// Client 1.0.7 & Server 1.2.7 开始支持这个参数 +@property(nonatomic, assign) BOOL needBasisVisualInfo; + +/// 如果置为 YES,则 server 侧会返回 subitems +/// 默认为 NO +/// Client 1.0.7 & Server 1.2.7 开始支持这个参数 +@property(nonatomic, assign) BOOL needSubitems; + +/// Client 1.0.4 开始加入这个参数 +@property(nonatomic, copy) NSString *clientReadableVersion; + +#pragma mark - Non Coding + +@property(nonatomic, assign) CGSize frameSize; + +@end + +@interface LookinStaticAsyncUpdateTasksPackage : NSObject + +@property(nonatomic, copy) NSArray *tasks; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinStaticAsyncUpdateTask.m b/Pods/LookinServer/Src/Main/Shared/LookinStaticAsyncUpdateTask.m new file mode 100644 index 0000000..aef73a1 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinStaticAsyncUpdateTask.m @@ -0,0 +1,105 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinStaticAsyncUpdateTask.m +// Lookin +// +// Created by Li Kai on 2019/6/21. +// https://lookin.work +// + + + +#import "LookinStaticAsyncUpdateTask.h" + +@implementation LookinStaticAsyncUpdateTask + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:@(self.oid) forKey:@"oid"]; + [aCoder encodeInteger:self.taskType forKey:@"taskType"]; + [aCoder encodeObject:self.clientReadableVersion forKey:@"clientReadableVersion"]; + [aCoder encodeInteger:self.attrRequest forKey:@"attrRequest"]; + [aCoder encodeBool:self.needBasisVisualInfo forKey:@"needBasisVisualInfo"]; + [aCoder encodeBool:self.needSubitems forKey:@"needSubitems"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.oid = [[aDecoder decodeObjectForKey:@"oid"] unsignedLongValue]; + self.taskType = [aDecoder decodeIntegerForKey:@"taskType"]; + self.clientReadableVersion = [aDecoder decodeObjectForKey:@"clientReadableVersion"]; + if ([aDecoder containsValueForKey:@"attrRequest"]) { + NSInteger value = [aDecoder decodeIntegerForKey:@"attrRequest"]; + if (value >= LookinDetailUpdateTaskAttrRequest_Automatic && value <= LookinDetailUpdateTaskAttrRequest_NotNeed) { + self.attrRequest = value; + } else { + self.attrRequest = LookinDetailUpdateTaskAttrRequest_Automatic; + } + } else { + self.attrRequest = LookinDetailUpdateTaskAttrRequest_Automatic; + } + + if ([aDecoder containsValueForKey:@"needBasisVisualInfo"]) { + self.needBasisVisualInfo = [aDecoder decodeBoolForKey:@"needBasisVisualInfo"]; + } else { + self.needBasisVisualInfo = NO; + } + + if ([aDecoder containsValueForKey:@"needSubitems"]) { + self.needSubitems = [aDecoder decodeBoolForKey:@"needSubitems"]; + } else { + self.needSubitems = NO; + } + + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (NSUInteger)hash { + return self.oid ^ self.taskType ^ self.attrRequest ^ self.needBasisVisualInfo ^ self.needSubitems; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[LookinStaticAsyncUpdateTask class]]) { + return NO; + } + LookinStaticAsyncUpdateTask *targetTask = object; + if (self.oid == targetTask.oid + && self.taskType == targetTask.taskType + && self.attrRequest == targetTask.attrRequest + && self.needBasisVisualInfo == targetTask.needBasisVisualInfo + && self.needSubitems == targetTask.needSubitems) { + return YES; + } + return NO; +} + +@end + +@implementation LookinStaticAsyncUpdateTasksPackage + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.tasks forKey:@"tasks"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.tasks = [aDecoder decodeObjectForKey:@"tasks"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinTuple.h b/Pods/LookinServer/Src/Main/Shared/LookinTuple.h new file mode 100644 index 0000000..296a4b8 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinTuple.h @@ -0,0 +1,31 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinTuples.h +// Lookin +// +// Created by Li Kai on 2019/8/14. +// https://lookin.work +// + + + +#import + +@interface LookinTwoTuple : NSObject + +@property(nonatomic, strong) NSObject *first; +@property(nonatomic, strong) NSObject *second; + +@end + +@interface LookinStringTwoTuple : NSObject + ++ (instancetype)tupleWithFirst:(NSString *)firstString second:(NSString *)secondString; + +@property(nonatomic, copy) NSString *first; +@property(nonatomic, copy) NSString *second; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinTuple.m b/Pods/LookinServer/Src/Main/Shared/LookinTuple.m new file mode 100644 index 0000000..b84a960 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinTuple.m @@ -0,0 +1,93 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinTuples.m +// Lookin +// +// Created by Li Kai on 2019/8/14. +// https://lookin.work +// + + + +#import "LookinTuple.h" + +@implementation LookinTwoTuple + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.first forKey:@"first"]; + [aCoder encodeObject:self.second forKey:@"second"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.first = [aDecoder decodeObjectForKey:@"first"]; + self.second = [aDecoder decodeObjectForKey:@"second"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +- (NSUInteger)hash { + return self.first.hash ^ self.second.hash; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[LookinTwoTuple class]]) { + return NO; + } + LookinTwoTuple *comparedObj = object; + if ([self.first isEqual:comparedObj.first] && [self.second isEqual:comparedObj.second]) { + return YES; + } + return NO; +} + +@end + +@implementation LookinStringTwoTuple + ++ (instancetype)tupleWithFirst:(NSString *)firstString second:(NSString *)secondString { + LookinStringTwoTuple *tuple = [LookinStringTwoTuple new]; + tuple.first = firstString; + tuple.second = secondString; + return tuple; +} + +#pragma mark - + +- (id)copyWithZone:(NSZone *)zone { + LookinStringTwoTuple *newTuple = [[LookinStringTwoTuple allocWithZone:zone] init]; + newTuple.first = self.first; + newTuple.second = self.second; + return newTuple; +} + +#pragma mark - + +- (void)encodeWithCoder:(NSCoder *)aCoder { + [aCoder encodeObject:self.first forKey:@"first"]; + [aCoder encodeObject:self.second forKey:@"second"]; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + if (self = [super init]) { + self.first = [aDecoder decodeObjectForKey:@"first"]; + self.second = [aDecoder decodeObjectForKey:@"second"]; + } + return self; +} + ++ (BOOL)supportsSecureCoding { + return YES; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinWeakContainer.h b/Pods/LookinServer/Src/Main/Shared/LookinWeakContainer.h new file mode 100644 index 0000000..af7b2ff --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinWeakContainer.h @@ -0,0 +1,23 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinWeakContainer.h +// Lookin +// +// Created by Li Kai on 2019/8/14. +// https://lookin.work +// + + + +#import + +@interface LookinWeakContainer : NSObject + ++ (instancetype)containerWithObject:(id)object; + +@property (nonatomic, weak) id object; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/LookinWeakContainer.m b/Pods/LookinServer/Src/Main/Shared/LookinWeakContainer.m new file mode 100644 index 0000000..ff9d2aa --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/LookinWeakContainer.m @@ -0,0 +1,43 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// LookinWeakContainer.m +// Lookin +// +// Created by Li Kai on 2019/8/14. +// https://lookin.work +// + + + +#import "LookinWeakContainer.h" + +@implementation LookinWeakContainer + ++ (instancetype)containerWithObject:(id)object { + LookinWeakContainer *container = [LookinWeakContainer new]; + container.object = object; + return container; +} + +- (NSUInteger)hash { + return [self.object hash]; +} + +- (BOOL)isEqual:(id)object { + if (self == object) { + return YES; + } + if (![object isKindOfClass:[LookinWeakContainer class]]) { + return NO; + } + LookinWeakContainer *comparedObj = object; + if ([self.object isEqual:comparedObj.object]) { + return YES; + } + return NO; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTChannel.h b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTChannel.h new file mode 100644 index 0000000..498a604 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTChannel.h @@ -0,0 +1,136 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + + + +// +// Represents a communication channel between two endpoints talking the same +// Lookin_PTProtocol. +// +#import +#import +#import +#import + +#import "Lookin_PTProtocol.h" +#import "Lookin_PTUSBHub.h" + +@class Lookin_PTData, Lookin_PTAddress; +@protocol Lookin_PTChannelDelegate; + +@interface Lookin_PTChannel : NSObject + +// Delegate +@property (strong) id delegate; + +// Communication protocol. Must not be nil. +@property Lookin_PTProtocol *protocol; + +// YES if this channel is a listening server +@property (readonly) BOOL isListening; + +// YES if this channel is a connected peer +@property (readonly) BOOL isConnected; + +// Arbitrary attachment. Note that if you set this, the object will grow by +// 8 bytes (64 bits). +@property (strong) id userInfo; + +@property(nonatomic, assign) int uniqueID; +@property(nonatomic, assign) NSInteger targetPort; +- (NSString *)debugTag; + +// Create a new channel using the shared Lookin_PTProtocol for the current dispatch +// queue, with *delegate*. ++ (Lookin_PTChannel*)channelWithDelegate:(id)delegate; + + +// Initialize a new frame channel, configuring it to use the calling queue's +// protocol instance (as returned by [Lookin_PTProtocol sharedProtocolForQueue: +// dispatch_get_current_queue()]) +- (id)init; + +// Initialize a new frame channel with a specific protocol. +- (id)initWithProtocol:(Lookin_PTProtocol*)protocol; + +// Initialize a new frame channel with a specific protocol and delegate. +- (id)initWithProtocol:(Lookin_PTProtocol*)protocol delegate:(id)delegate; + + +// Connect to a TCP port on a device connected over USB +- (void)connectToPort:(int)port overUSBHub:(Lookin_PTUSBHub*)usbHub deviceID:(NSNumber*)deviceID callback:(void(^)(NSError *error))callback; + +// Connect to a TCP port at IPv4 address. Provided port must NOT be in network +// byte order. Provided in_addr_t must NOT be in network byte order. A value returned +// from inet_aton() will be in network byte order. You can use a value of inet_aton() +// as the address parameter here, but you must flip the byte order before passing the +// in_addr_t to this function. +- (void)connectToPort:(in_port_t)port IPv4Address:(in_addr_t)address callback:(void(^)(NSError *error, Lookin_PTAddress *address))callback; + +// Listen for connections on port and address, effectively starting a socket +// server. Provided port must NOT be in network byte order. Provided in_addr_t +// must NOT be in network byte order. +// For this to make sense, you should provide a onAccept block handler +// or a delegate implementing ioFrameChannel:didAcceptConnection:. +- (void)listenOnPort:(in_port_t)port IPv4Address:(in_addr_t)address callback:(void(^)(NSError *error))callback; + +// Send a frame with an optional payload and optional callback. +// If *callback* is not NULL, the block is invoked when either an error occured +// or when the frame (and payload, if any) has been completely sent. +- (void)sendFrameOfType:(uint32_t)frameType tag:(uint32_t)tag withPayload:(dispatch_data_t)payload callback:(void(^)(NSError *error))callback; + +// Lower-level method to assign a connected dispatch IO channel to this channel +- (BOOL)startReadingFromConnectedChannel:(dispatch_io_t)channel error:(__autoreleasing NSError**)error; + +// Close the channel, preventing further reading and writing. Any ongoing and +// queued reads and writes will be aborted. +- (void)close; + +// "graceful" close -- any ongoing and queued reads and writes will complete +// before the channel ends. +- (void)cancel; + +@end + + +// Wraps a mapped dispatch_data_t object. The memory pointed to by *data* is +// valid until *dispatchData* is deallocated (normally when the receiver is +// deallocated). +@interface Lookin_PTData : NSObject +@property (readonly) dispatch_data_t dispatchData; +@property (readonly) void *data; +@property (readonly) size_t length; +@end + + +// Represents a peer's address +@interface Lookin_PTAddress : NSObject +// For network addresses, this is the IP address in textual format +@property (readonly) NSString *name; +// For network addresses, this is the port number. Otherwise 0 (zero). +@property (readonly) NSInteger port; +@end + + +// Protocol for Lookin_PTChannel delegates +@protocol Lookin_PTChannelDelegate + +@required +// Invoked when a new frame has arrived on a channel. +- (void)ioFrameChannel:(Lookin_PTChannel*)channel didReceiveFrameOfType:(uint32_t)type tag:(uint32_t)tag payload:(Lookin_PTData*)payload; + +@optional +// Invoked to accept an incoming frame on a channel. Reply NO ignore the +// incoming frame. If not implemented by the delegate, all frames are accepted. +- (BOOL)ioFrameChannel:(Lookin_PTChannel*)channel shouldAcceptFrameOfType:(uint32_t)type tag:(uint32_t)tag payloadSize:(uint32_t)payloadSize; + +// Invoked when the channel closed. If it closed because of an error, *error* is +// a non-nil NSError object. +- (void)ioFrameChannel:(Lookin_PTChannel*)channel didEndWithError:(NSError*)error; + +// For listening channels, this method is invoked when a new connection has been +// accepted. +- (void)ioFrameChannel:(Lookin_PTChannel*)channel didAcceptConnection:(Lookin_PTChannel*)otherChannel fromAddress:(Lookin_PTAddress*)address; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTChannel.m b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTChannel.m new file mode 100644 index 0000000..bb8529e --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTChannel.m @@ -0,0 +1,675 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +#import "Lookin_PTChannel.h" +#import "Lookin_PTPrivate.h" +#include +#include +#include +#include +#include +#import + +// Read member of sockaddr_in without knowing the family +#define PT_SOCKADDR_ACCESS(ss, member4, member6) \ + (((ss)->ss_family == AF_INET) ? ( \ + ((const struct sockaddr_in *)(ss))->member4 \ + ) : ( \ + ((const struct sockaddr_in6 *)(ss))->member6 \ + )) + +// Connection state (storage: uint8_t) +#define kConnStateNone 0 +#define kConnStateConnecting 1 +#define kConnStateConnected 2 +#define kConnStateListening 3 + +// Delegate support optimization (storage: uint8_t) +#define kDelegateFlagImplements_ioFrameChannel_shouldAcceptFrameOfType_tag_payloadSize 1 +#define kDelegateFlagImplements_ioFrameChannel_didEndWithError 2 +#define kDelegateFlagImplements_ioFrameChannel_didAcceptConnection_fromAddress 4 + + +static int ChannelInstanceCount = 0; +static int ChannelUniqueID = 0; + +#pragma mark - +// Note: We are careful about the size of this struct as each connected peer +// implies one allocation of this struct. +@interface Lookin_PTChannel () { + dispatch_io_t dispatchObj_channel_; + dispatch_source_t dispatchObj_source_; + NSError *endError_; // 64 bit +@public // here be hacks + id delegate_; // 64 bit + uint8_t delegateFlags_; // 8 bit +@private + uint8_t connState_; // 8 bit + //char padding_[6]; // 48 bit -- only if allocation speed is important +} +- (id)initWithProtocol:(Lookin_PTProtocol*)protocol delegate:(id)delegate; +- (BOOL)acceptIncomingConnection:(dispatch_fd_t)serverSocketFD; +@end +static const uint8_t kUserInfoKey; + +#pragma mark - +@interface Lookin_PTData () +- (id)initWithMappedDispatchData:(dispatch_data_t)mappedContiguousData data:(void*)data length:(size_t)length; +@end + +#pragma mark - +@interface Lookin_PTAddress () { + struct sockaddr_storage sockaddr_; +} +- (id)initWithSockaddr:(const struct sockaddr_storage*)addr; +@end + +#pragma mark - +@implementation Lookin_PTChannel + +@synthesize protocol = protocol_; + + ++ (Lookin_PTChannel*)channelWithDelegate:(id)delegate { + return [[Lookin_PTChannel alloc] initWithProtocol:[Lookin_PTProtocol sharedProtocolForQueue:dispatch_get_main_queue()] delegate:delegate]; +} + + +- (id)initWithProtocol:(Lookin_PTProtocol*)protocol delegate:(id)delegate { + if (!(self = [super init])) return nil; + protocol_ = protocol; + self.delegate = delegate; + + [self didInit]; + + return self; +} + + +- (id)initWithProtocol:(Lookin_PTProtocol*)protocol { + if (!(self = [super init])) return nil; + protocol_ = protocol; + + [self didInit]; + + return self; +} + + +- (id)init { + [self didInit]; + + return [self initWithProtocol:[Lookin_PTProtocol sharedProtocolForQueue:dispatch_get_main_queue()]]; +} + +- (void)didInit { + ChannelUniqueID++; + ChannelInstanceCount++; + self.uniqueID = ChannelUniqueID; +// NSLog(@"LookinServer - Init channel(ID: %@). Total count: %@", @(self.uniqueID), @(ChannelInstanceCount)); +} + +- (void)dealloc { + ChannelInstanceCount--; +// NSLog(@"LookinServer - Dealloc channel%@. Still lives count: %@", self.debugTag, @(ChannelInstanceCount)); +#if PT_DISPATCH_RETAIN_RELEASE + if (dispatchObj_channel_) dispatch_release(dispatchObj_channel_); + else if (dispatchObj_source_) dispatch_release(dispatchObj_source_); +#endif +} + + +- (BOOL)isConnected { + return connState_ == kConnStateConnecting || connState_ == kConnStateConnected; +} + + +- (BOOL)isListening { + return connState_ == kConnStateListening; +} + + +- (id)userInfo { + return objc_getAssociatedObject(self, (void*)&kUserInfoKey); +} + +- (void)setUserInfo:(id)userInfo { + objc_setAssociatedObject(self, (const void*)&kUserInfoKey, userInfo, OBJC_ASSOCIATION_RETAIN); +} + + +- (void)setConnState:(char)connState { + connState_ = connState; +} + + +- (void)setDispatchChannel:(dispatch_io_t)channel { + assert(connState_ == kConnStateConnecting || connState_ == kConnStateConnected || connState_ == kConnStateNone); + dispatch_io_t prevChannel = dispatchObj_channel_; + if (prevChannel != channel) { + dispatchObj_channel_ = channel; +#if PT_DISPATCH_RETAIN_RELEASE + if (dispatchObj_channel_) dispatch_retain(dispatchObj_channel_); + if (prevChannel) dispatch_release(prevChannel); +#endif + if (!dispatchObj_channel_ && !dispatchObj_source_) { + connState_ = kConnStateNone; + } + } +} + + +- (void)setDispatchSource:(dispatch_source_t)source { + assert(connState_ == kConnStateListening || connState_ == kConnStateNone); + dispatch_source_t prevSource = dispatchObj_source_; + if (prevSource != source) { + dispatchObj_source_ = source; +#if PT_DISPATCH_RETAIN_RELEASE + if (dispatchObj_source_) dispatch_retain(dispatchObj_source_); + if (prevSource) dispatch_release(prevSource); +#endif + if (!dispatchObj_channel_ && !dispatchObj_source_) { + connState_ = kConnStateNone; + } + } +} + + +- (id)delegate { + return delegate_; +} + + +- (void)setDelegate:(id)delegate { + delegate_ = delegate; + delegateFlags_ = 0; + if (!delegate_) { + return; + } + + if ([delegate respondsToSelector:@selector(ioFrameChannel:shouldAcceptFrameOfType:tag:payloadSize:)]) { + delegateFlags_ |= kDelegateFlagImplements_ioFrameChannel_shouldAcceptFrameOfType_tag_payloadSize; + } + + if (delegate_ && [delegate respondsToSelector:@selector(ioFrameChannel:didEndWithError:)]) { + delegateFlags_ |= kDelegateFlagImplements_ioFrameChannel_didEndWithError; + } + + if (delegate_ && [delegate respondsToSelector:@selector(ioFrameChannel:didAcceptConnection:fromAddress:)]) { + delegateFlags_ |= kDelegateFlagImplements_ioFrameChannel_didAcceptConnection_fromAddress; + } +} + +- (NSString *)debugTag { + NSString *state = @""; + if (connState_ == kConnStateNone) { + state = @"None"; + } else if (connState_ == kConnStateConnecting) { + state = @"Connecting"; + } else if (connState_ == kConnStateConnected) { + state = @"Connected"; + } else if (connState_ == kConnStateListening) { + state = @"Listening"; + } else { + state = @"Undefined"; + } + return [NSString stringWithFormat:@"[%@-%@,%@]", @(self.uniqueID), @(self.targetPort), state]; +} + + +//- (void)setFileDescriptor:(dispatch_fd_t)fd { +// [self setDispatchChannel:dispatch_io_create(DISPATCH_IO_STREAM, fd, protocol_.queue, ^(int error) { +// close(fd); +// })]; +//} + + +#pragma mark - Connecting + + +- (void)connectToPort:(int)port overUSBHub:(Lookin_PTUSBHub*)usbHub deviceID:(NSNumber*)deviceID callback:(void(^)(NSError *error))callback { + assert(protocol_ != NULL); + if (connState_ != kConnStateNone) { + if (callback) callback([NSError errorWithDomain:NSPOSIXErrorDomain code:EPERM userInfo:nil]); + return; + } + connState_ = kConnStateConnecting; + [usbHub connectToDevice:deviceID port:port onStart:^(NSError *err, dispatch_io_t dispatchChannel) { + NSError *error = err; + if (!error) { + [self startReadingFromConnectedChannel:dispatchChannel error:&error]; + } else { + self->connState_ = kConnStateNone; + } + if (callback) callback(error); + } onEnd:^(NSError *error) { + if (self->delegateFlags_ & kDelegateFlagImplements_ioFrameChannel_didEndWithError) { + [self->delegate_ ioFrameChannel:self didEndWithError:error]; + } + self->endError_ = nil; + }]; +} + + +- (void)connectToPort:(in_port_t)port IPv4Address:(in_addr_t)address callback:(void(^)(NSError *error, Lookin_PTAddress *address))callback { + assert(protocol_ != NULL); + if (connState_ != kConnStateNone) { + if (callback) callback([NSError errorWithDomain:NSPOSIXErrorDomain code:EPERM userInfo:nil], nil); + return; + } + connState_ = kConnStateConnecting; + + int error = 0; + + // Create socket + dispatch_fd_t fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd == -1) { + perror("socket(AF_INET, SOCK_STREAM, 0) failed"); + error = errno; + if (callback) callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil], nil); + return; + } + + // Connect socket + struct sockaddr_in addr; + bzero((char *)&addr, sizeof(addr)); + + addr.sin_len = sizeof(addr); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + //addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + //addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_addr.s_addr = htonl(address); + + // prevent SIGPIPE + int on = 1; + setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)); + + // int socket, const struct sockaddr *address, socklen_t address_len + if (connect(fd, (const struct sockaddr *)&addr, addr.sin_len) == -1) { + //perror("connect"); + error = errno; + close(fd); + if (callback) callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil], nil); + return; + } + + // get actual address + //if (getsockname(fd, (struct sockaddr*)&addr, (socklen_t*)&addr.sin_len) == -1) { + // error = errno; + // close(fd); + // if (callback) callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil], nil); + // return; + //} + + dispatch_io_t dispatchChannel = dispatch_io_create(DISPATCH_IO_STREAM, fd, protocol_.queue, ^(int error) { + close(fd); + if (self->delegateFlags_ & kDelegateFlagImplements_ioFrameChannel_didEndWithError) { + NSError *err = error == 0 ? self->endError_ : [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil]; + [self->delegate_ ioFrameChannel:self didEndWithError:err]; + self->endError_ = nil; + } + }); + + if (!dispatchChannel) { + close(fd); + if (callback) callback([[NSError alloc] initWithDomain:@"PTError" code:0 userInfo:nil], nil); + return; + } + + // Success + NSError *err = nil; + Lookin_PTAddress *ptAddr = [[Lookin_PTAddress alloc] initWithSockaddr:(struct sockaddr_storage*)&addr]; + [self startReadingFromConnectedChannel:dispatchChannel error:&err]; + if (callback) callback(err, ptAddr); +} + + +#pragma mark - Listening and serving + + +- (void)listenOnPort:(in_port_t)port IPv4Address:(in_addr_t)address callback:(void(^)(NSError *error))callback { + assert(dispatchObj_source_ == nil); + + // Create socket + dispatch_fd_t fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd == -1) { + if (callback) callback([NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]); + return; + } + + // Connect socket + struct sockaddr_in addr; + bzero((char *)&addr, sizeof(addr)); + + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + //addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + //addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_addr.s_addr = htonl(address); + + socklen_t socklen = sizeof(addr); + + int on = 1; + + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) { + close(fd); + if (callback) callback([NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]); + return; + } + + if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1) { + close(fd); + if (callback) callback([NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]); + return; + } + + if (bind(fd, (struct sockaddr*)&addr, socklen) != 0) { + close(fd); + if (callback) callback([NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]); + return; + } + + if (listen(fd, 512) != 0) { + close(fd); + if (callback) callback([NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]); + return; + } + + [self setDispatchSource:dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, fd, 0, protocol_.queue)]; + + dispatch_source_set_event_handler(dispatchObj_source_, ^{ + unsigned long nconns = dispatch_source_get_data(self->dispatchObj_source_); + while ([self acceptIncomingConnection:fd] && --nconns); + }); + + dispatch_source_set_cancel_handler(dispatchObj_source_, ^{ + // Captures *self*, effectively holding a reference to *self* until cancelled. + self->dispatchObj_source_ = nil; + close(fd); + if (self->delegateFlags_ & kDelegateFlagImplements_ioFrameChannel_didEndWithError) { + [self->delegate_ ioFrameChannel:self didEndWithError:self->endError_]; + self->endError_ = nil; + } + }); + + dispatch_resume(dispatchObj_source_); + //NSLog(@"%@ opened on fd #%d", self, fd); + + connState_ = kConnStateListening; + if (callback) callback(nil); +} + + +- (BOOL)acceptIncomingConnection:(dispatch_fd_t)serverSocketFD { + struct sockaddr_in addr; + socklen_t addrLen = sizeof(addr); + dispatch_fd_t clientSocketFD = accept(serverSocketFD, (struct sockaddr*)&addr, &addrLen); + + if (clientSocketFD == -1) { + perror("accept()"); + return NO; + } + + // prevent SIGPIPE + int on = 1; + setsockopt(clientSocketFD, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)); + + if (fcntl(clientSocketFD, F_SETFL, O_NONBLOCK) == -1) { + perror("fcntl(.. O_NONBLOCK)"); + close(clientSocketFD); + return NO; + } + + if (delegateFlags_ & kDelegateFlagImplements_ioFrameChannel_didAcceptConnection_fromAddress) { + Lookin_PTChannel *peerChannel = [[Lookin_PTChannel alloc] initWithProtocol:protocol_ delegate:delegate_]; + __block Lookin_PTChannel *localChannelRef = self; + dispatch_io_t dispatchChannel = dispatch_io_create(DISPATCH_IO_STREAM, clientSocketFD, protocol_.queue, ^(int error) { + // Important note: This block captures *self*, thus a reference is held to + // *self* until the fd is truly closed. + localChannelRef = nil; + + close(clientSocketFD); + + if (peerChannel->delegateFlags_ & kDelegateFlagImplements_ioFrameChannel_didEndWithError) { + NSError *err = error == 0 ? peerChannel->endError_ : [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil]; + [peerChannel->delegate_ ioFrameChannel:peerChannel didEndWithError:err]; + peerChannel->endError_ = nil; + } + }); + + [peerChannel setConnState:kConnStateConnected]; + [peerChannel setDispatchChannel:dispatchChannel]; + + assert(((struct sockaddr_storage*)&addr)->ss_len == addrLen); + Lookin_PTAddress *address = [[Lookin_PTAddress alloc] initWithSockaddr:(struct sockaddr_storage*)&addr]; + [delegate_ ioFrameChannel:self didAcceptConnection:peerChannel fromAddress:address]; + + NSError *err = nil; + if (![peerChannel startReadingFromConnectedChannel:dispatchChannel error:&err]) { +// NSLog(@"startReadingFromConnectedChannel failed in accept: %@", err); + } + } else { + close(clientSocketFD); + } + return YES; +} + + +#pragma mark - Closing the channel + + +- (void)close { +// NSLog(@"LookinServer - Will close chanel: %@", self.debugTag); + + if ((connState_ == kConnStateConnecting || connState_ == kConnStateConnected) && dispatchObj_channel_) { + dispatch_io_close(dispatchObj_channel_, DISPATCH_IO_STOP); + [self setDispatchChannel:NULL]; + } else if (connState_ == kConnStateListening && dispatchObj_source_) { + dispatch_source_cancel(dispatchObj_source_); + } +} + +/// 曾经连接上 Client,然后 Client 端关闭时,Peertalk 内部会对之前 connect 的 channel 调用该方法 +- (void)cancel { +// NSLog(@"LookinServer - Will cancel chanel: %@", self.debugTag); + + if ((connState_ == kConnStateConnecting || connState_ == kConnStateConnected) && dispatchObj_channel_) { + dispatch_io_close(dispatchObj_channel_, 0); + [self setDispatchChannel:NULL]; + } else if (connState_ == kConnStateListening && dispatchObj_source_) { + dispatch_source_cancel(dispatchObj_source_); + } +} + + +#pragma mark - Reading + + +- (BOOL)startReadingFromConnectedChannel:(dispatch_io_t)channel error:(__autoreleasing NSError**)error { + if (connState_ != kConnStateNone && connState_ != kConnStateConnecting && connState_ != kConnStateConnected) { + if (error) *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:EPERM userInfo:nil]; + return NO; + } + + if (dispatchObj_channel_ != channel) { + [self close]; + [self setDispatchChannel:channel]; + } + + connState_ = kConnStateConnected; + + // helper + BOOL(^handleError)(NSError*,BOOL) = ^BOOL(NSError *error, BOOL isEOS) { + if (error) { + //NSLog(@"Error while communicating: %@", error); + self->endError_ = error; + [self close]; + return YES; + } else if (isEOS) { + [self cancel]; + return YES; + } + return NO; + }; + + [protocol_ readFramesOverChannel:channel onFrame:^(NSError *error, uint32_t type, uint32_t tag, uint32_t payloadSize, dispatch_block_t resumeReadingFrames) { + if (handleError(error, type == PTFrameTypeEndOfStream)) { + return; + } + + BOOL accepted = (channel == self->dispatchObj_channel_); + if (accepted && (self->delegateFlags_ & kDelegateFlagImplements_ioFrameChannel_shouldAcceptFrameOfType_tag_payloadSize)) { + accepted = [self->delegate_ ioFrameChannel:self shouldAcceptFrameOfType:type tag:tag payloadSize:payloadSize]; + } + + if (payloadSize == 0) { + if (accepted && self->delegate_) { + [self->delegate_ ioFrameChannel:self didReceiveFrameOfType:type tag:tag payload:nil]; + } else { + // simply ignore the frame + } + resumeReadingFrames(); + } else { + // has payload + if (!accepted) { + // Read and discard payload, ignoring frame + [self->protocol_ readAndDiscardDataOfSize:payloadSize overChannel:channel callback:^(NSError *error, BOOL endOfStream) { + if (!handleError(error, endOfStream)) { + resumeReadingFrames(); + } + }]; + } else { + [self->protocol_ readPayloadOfSize:payloadSize overChannel:channel callback:^(NSError *error, dispatch_data_t contiguousData, const uint8_t *buffer, size_t bufferSize) { + if (handleError(error, bufferSize == 0)) { + return; + } + + if (self->delegate_) { + Lookin_PTData *payload = [[Lookin_PTData alloc] initWithMappedDispatchData:contiguousData data:(void*)buffer length:bufferSize]; + [self->delegate_ ioFrameChannel:self didReceiveFrameOfType:type tag:tag payload:payload]; + } + + resumeReadingFrames(); + }]; + } + } + }]; + + return YES; +} + + +#pragma mark - Sending + +- (void)sendFrameOfType:(uint32_t)frameType tag:(uint32_t)tag withPayload:(dispatch_data_t)payload callback:(void(^)(NSError *error))callback { + if (connState_ == kConnStateConnecting || connState_ == kConnStateConnected) { + [protocol_ sendFrameOfType:frameType tag:tag withPayload:payload overChannel:dispatchObj_channel_ callback:callback]; + } else if (callback) { + callback([NSError errorWithDomain:NSPOSIXErrorDomain code:EPERM userInfo:nil]); + } +} + +#pragma mark - NSObject + +- (NSString*)description { + id userInfo = objc_getAssociatedObject(self, (void*)&kUserInfoKey); + return [NSString stringWithFormat:@"", self, ( connState_ == kConnStateConnecting ? @"connecting" + : connState_ == kConnStateConnected ? @"connected" + : connState_ == kConnStateListening ? @"listening" + : @"closed"), + userInfo ? " " : "", userInfo ? userInfo : @""]; +} + + +@end + + +#pragma mark - +@implementation Lookin_PTAddress + +- (id)initWithSockaddr:(const struct sockaddr_storage*)addr { + if (!(self = [super init])) return nil; + assert(addr); + memcpy((void*)&sockaddr_, (const void*)addr, addr->ss_len); + return self; +} + + +- (NSString*)name { + if (sockaddr_.ss_len) { + const void *sin_addr = NULL; + size_t bufsize = 0; + if (sockaddr_.ss_family == AF_INET6) { + bufsize = INET6_ADDRSTRLEN; + sin_addr = (const void *)&((const struct sockaddr_in6*)&sockaddr_)->sin6_addr; + } else { + bufsize = INET_ADDRSTRLEN; + sin_addr = (const void *)&((const struct sockaddr_in*)&sockaddr_)->sin_addr; + } + char *buf = CFAllocatorAllocate(kCFAllocatorDefault, bufsize+1, 0); + if (inet_ntop(sockaddr_.ss_family, sin_addr, buf, (unsigned int)bufsize-1) == NULL) { + CFAllocatorDeallocate(kCFAllocatorDefault, buf); + return nil; + } + return [[NSString alloc] initWithBytesNoCopy:(void*)buf length:strlen(buf) encoding:NSUTF8StringEncoding freeWhenDone:YES]; + } else { + return nil; + } +} + + +- (NSInteger)port { + if (sockaddr_.ss_len) { + return ntohs(PT_SOCKADDR_ACCESS(&sockaddr_, sin_port, sin6_port)); + } else { + return 0; + } +} + + +- (NSString*)description { + if (sockaddr_.ss_len) { + return [NSString stringWithFormat:@"%@:%u", self.name, (unsigned)self.port]; + } else { + return @"(?)"; + } +} + +@end + + +#pragma mark - +@implementation Lookin_PTData + +@synthesize dispatchData = dispatchData_; +@synthesize data = data_; +@synthesize length = length_; + +- (id)initWithMappedDispatchData:(dispatch_data_t)mappedContiguousData data:(void*)data length:(size_t)length { + if (!(self = [super init])) return nil; + dispatchData_ = mappedContiguousData; +#if PT_DISPATCH_RETAIN_RELEASE + if (dispatchData_) dispatch_retain(dispatchData_); +#endif + data_ = data; + length_ = length; + return self; +} + +- (void)dealloc { +#if PT_DISPATCH_RETAIN_RELEASE + if (dispatchData_) dispatch_release(dispatchData_); +#endif + data_ = NULL; + length_ = 0; +} + +#pragma mark - NSObject + +- (NSString*)description { + return [NSString stringWithFormat:@"", self, length_]; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTPrivate.h b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTPrivate.h new file mode 100644 index 0000000..6480de8 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTPrivate.h @@ -0,0 +1,20 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + + + +#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && (!defined(__IPHONE_6_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0)) || \ + (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && (!defined(__MAC_10_8) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8)) +#define PT_DISPATCH_RETAIN_RELEASE 1 +#else +#define PT_DISPATCH_RETAIN_RELEASE 0 +#endif + +#if PT_DISPATCH_RETAIN_RELEASE +#define PT_PRECISE_LIFETIME +#define PT_PRECISE_LIFETIME_UNUSED +#else +#define PT_PRECISE_LIFETIME __attribute__((objc_precise_lifetime)) +#define PT_PRECISE_LIFETIME_UNUSED __attribute__((objc_precise_lifetime, unused)) +#endif + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTProtocol.h b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTProtocol.h new file mode 100644 index 0000000..b0207d3 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTProtocol.h @@ -0,0 +1,122 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + + + +// +// A universal frame-based communication protocol which can be used to exchange +// arbitrary structured data. +// +// In short: +// +// - Each transmission is comprised by one fixed-size frame. +// - Each frame contains a protocol version number. +// - Each frame contains an application frame type. +// - Each frame can contain an identifying tag. +// - Each frame can have application-specific data of up to UINT32_MAX size. +// - Transactions style messaging can be modeled on top using frame tags. +// - Lightweight API on top of libdispatch (aka GCD) -- close to the metal. +// +#include +#import + +// Special frame tag that signifies "no tag". Your implementation should never +// create a reply for a frame with this tag. +static const uint32_t PTFrameNoTag = 0; + +// Special frame type that signifies that the stream has ended. +static const uint32_t PTFrameTypeEndOfStream = 0; + +// NSError domain +FOUNDATION_EXPORT NSString * const Lookin_PTProtocolErrorDomain; + + +@interface Lookin_PTProtocol : NSObject + +// Queue on which to run data processing blocks. +@property dispatch_queue_t queue; + +// Get the shared protocol object for *queue* ++ (Lookin_PTProtocol*)sharedProtocolForQueue:(dispatch_queue_t)queue; + +// Initialize a new protocol object to use a specific queue. +- (id)initWithDispatchQueue:(dispatch_queue_t)queue; + +// Initialize a new protocol object to use the current calling queue. +- (id)init; + +#pragma mark Sending frames + +// Generate a new tag that is unique within this protocol object. +- (uint32_t)newTag; + +// Send a frame over *channel* with an optional payload and optional callback. +// If *callback* is not NULL, the block is invoked when either an error occured +// or when the frame (and payload, if any) has been completely sent. +- (void)sendFrameOfType:(uint32_t)frameType + tag:(uint32_t)tag + withPayload:(dispatch_data_t)payload + overChannel:(dispatch_io_t)channel + callback:(void(^)(NSError *error))callback; + +#pragma mark Receiving frames + +// Read frames over *channel* as they arrive. +// The onFrame handler is responsible for reading (or discarding) any payload +// and call *resumeReadingFrames* afterwards to resume reading frames. +// To stop reading frames, simply do not invoke *resumeReadingFrames*. +// When the stream ends, a frame of type PTFrameTypeEndOfStream is received. +- (void)readFramesOverChannel:(dispatch_io_t)channel + onFrame:(void(^)(NSError *error, + uint32_t type, + uint32_t tag, + uint32_t payloadSize, + dispatch_block_t resumeReadingFrames))onFrame; + +// Read a single frame over *channel*. A frame of type PTFrameTypeEndOfStream +// denotes the stream has ended. +- (void)readFrameOverChannel:(dispatch_io_t)channel + callback:(void(^)(NSError *error, + uint32_t frameType, + uint32_t frameTag, + uint32_t payloadSize))callback; + +#pragma mark Receiving frame payloads + +// Read a complete payload. It's the callers responsibility to make sure +// payloadSize is not too large since memory will be automatically allocated +// where only payloadSize is the limit. +// The returned dispatch_data_t object owns *buffer* and thus you need to call +// dispatch_retain on *contiguousData* if you plan to keep *buffer* around after +// returning from the callback. +- (void)readPayloadOfSize:(size_t)payloadSize + overChannel:(dispatch_io_t)channel + callback:(void(^)(NSError *error, + dispatch_data_t contiguousData, + const uint8_t *buffer, + size_t bufferSize))callback; + +// Discard data of *size* waiting on *channel*. *callback* can be NULL. +- (void)readAndDiscardDataOfSize:(size_t)size + overChannel:(dispatch_io_t)channel + callback:(void(^)(NSError *error, BOOL endOfStream))callback; + +@end + +@interface NSData (Lookin_PTProtocol) +// Creates a new dispatch_data_t object which references the receiver and uses +// the receivers bytes as its backing data. The returned dispatch_data_t object +// holds a reference to the recevier. It's the callers responsibility to call +// dispatch_release on the returned object when done. +- (dispatch_data_t)createReferencingDispatchData; ++ (NSData *)dataWithContentsOfDispatchData:(dispatch_data_t)data; +@end + +@interface NSDictionary (Lookin_PTProtocol) +// See description of -[NSData(Lookin_PTProtocol) createReferencingDispatchData] +- (dispatch_data_t)createReferencingDispatchData; + +// Decode *data* as a peroperty list-encoded dictionary. Returns nil on failure. ++ (NSDictionary*)dictionaryWithContentsOfDispatchData:(dispatch_data_t)data; +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTProtocol.m b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTProtocol.m new file mode 100644 index 0000000..72e85f8 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTProtocol.m @@ -0,0 +1,428 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +#import "Lookin_PTProtocol.h" +#import "Lookin_PTPrivate.h" +#import + +static const uint32_t PTProtocolVersion1 = 1; + +NSString * const Lookin_PTProtocolErrorDomain = @"PTProtocolError"; + +// This is what we send as the header for each frame. +typedef struct _PTFrame { + // The version of the frame and protocol. + uint32_t version; + + // Type of frame + uint32_t type; + + // Unless zero, a tag is retained in frames that are responses to previous + // frames. Applications can use this to build transactions or request-response + // logic. + uint32_t tag; + + // If payloadSize is larger than zero, *payloadSize* number of bytes are + // following, constituting application-specific data. + uint32_t payloadSize; + +} PTFrame; + + +@interface Lookin_PTProtocol () { + uint32_t nextFrameTag_; + @public + dispatch_queue_t queue_; +} +- (dispatch_data_t)createDispatchDataWithFrameOfType:(uint32_t)type frameTag:(uint32_t)frameTag payload:(dispatch_data_t)payload; +@end + + +static void _release_queue_local_protocol(void *objcobj) { + if (objcobj) { + Lookin_PTProtocol *protocol = (__bridge_transfer id)objcobj; + protocol->queue_ = NULL; + } +} + + +@interface Lookin_RQueueLocalIOFrameProtocol : Lookin_PTProtocol +@end +@implementation Lookin_RQueueLocalIOFrameProtocol +- (void)setQueue:(dispatch_queue_t)queue { +} +@end + + +@implementation Lookin_PTProtocol + + ++ (Lookin_PTProtocol*)sharedProtocolForQueue:(dispatch_queue_t)queue { + static const char currentQueueFrameProtocolKey; + //dispatch_queue_t queue = dispatch_get_current_queue(); + Lookin_PTProtocol *currentQueueFrameProtocol = (__bridge Lookin_PTProtocol*)dispatch_queue_get_specific(queue, ¤tQueueFrameProtocolKey); + if (!currentQueueFrameProtocol) { + currentQueueFrameProtocol = [[Lookin_RQueueLocalIOFrameProtocol alloc] initWithDispatchQueue:NULL]; + currentQueueFrameProtocol->queue_ = queue; // reference, no retain, since we would create cyclic references + dispatch_queue_set_specific(queue, ¤tQueueFrameProtocolKey, (__bridge_retained void*)currentQueueFrameProtocol, &_release_queue_local_protocol); + return (__bridge Lookin_PTProtocol*)dispatch_queue_get_specific(queue, ¤tQueueFrameProtocolKey); // to avoid race conds + } else { + return currentQueueFrameProtocol; + } +} + + +- (id)initWithDispatchQueue:(dispatch_queue_t)queue { + if (!(self = [super init])) return nil; + queue_ = queue; +#if PT_DISPATCH_RETAIN_RELEASE + if (queue_) dispatch_retain(queue_); +#endif + return self; +} + +- (id)init { + return [self initWithDispatchQueue:dispatch_get_main_queue()]; +} + +- (void)dealloc { + if (queue_) { +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(queue_); +#endif + } +} + +- (dispatch_queue_t)queue { + return queue_; +} + +- (void)setQueue:(dispatch_queue_t)queue { +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_queue_t prev_queue = queue_; + queue_ = queue; + if (queue_) dispatch_retain(queue_); + if (prev_queue) dispatch_release(prev_queue); +#else + queue_ = queue; +#endif +} + + +- (uint32_t)newTag { + return ++nextFrameTag_; +} + + +#pragma mark - +#pragma mark Creating frames + + +- (dispatch_data_t)createDispatchDataWithFrameOfType:(uint32_t)type frameTag:(uint32_t)frameTag payload:(dispatch_data_t)payload { + PTFrame *frame = CFAllocatorAllocate(kCFAllocatorDefault, sizeof(PTFrame), 0); + frame->version = htonl(PTProtocolVersion1); + frame->type = htonl(type); + frame->tag = htonl(frameTag); + + if (payload) { + size_t payloadSize = dispatch_data_get_size(payload); + assert(payloadSize <= UINT32_MAX); + frame->payloadSize = htonl((uint32_t)payloadSize); + } else { + frame->payloadSize = 0; + } + + dispatch_data_t frameData = dispatch_data_create((const void*)frame, sizeof(PTFrame), queue_, ^{ + CFAllocatorDeallocate(kCFAllocatorDefault, (void*)frame); + }); + + if (payload && frame->payloadSize != 0) { + // chain frame + payload + dispatch_data_t data = dispatch_data_create_concat(frameData, payload); +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(frameData); +#endif + frameData = data; + } + + return frameData; +} + + +#pragma mark - +#pragma mark Sending frames + + +- (void)sendFrameOfType:(uint32_t)frameType tag:(uint32_t)tag withPayload:(dispatch_data_t)payload overChannel:(dispatch_io_t)channel callback:(void(^)(NSError*))callback { + dispatch_data_t frame = [self createDispatchDataWithFrameOfType:frameType frameTag:tag payload:payload]; + dispatch_io_write(channel, 0, frame, queue_, ^(bool done, dispatch_data_t data, int _errno) { + if (done && callback) { + callback(_errno == 0 ? nil : [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:_errno userInfo:nil]); + } + }); +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(frame); +#endif +} + + +#pragma mark - +#pragma mark Receiving frames + + +- (void)readFrameOverChannel:(dispatch_io_t)channel callback:(void(^)(NSError *error, uint32_t frameType, uint32_t frameTag, uint32_t payloadSize))callback { + __block dispatch_data_t allData = NULL; + + dispatch_io_read(channel, 0, sizeof(PTFrame), queue_, ^(bool done, dispatch_data_t data, int error) { + //NSLog(@"dispatch_io_read: done=%d data=%p error=%d", done, data, error); + size_t dataSize = data ? dispatch_data_get_size(data) : 0; + + if (dataSize) { + if (!allData) { + allData = data; +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_retain(allData); +#endif + } else { +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_data_t allDataPrev = allData; + allData = dispatch_data_create_concat(allData, data); + dispatch_release(allDataPrev); +#else + allData = dispatch_data_create_concat(allData, data); +#endif + } + } + + if (done) { + if (error != 0) { + callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil], 0, 0, 0); + return; + } + + if (dataSize == 0) { + callback(nil, PTFrameTypeEndOfStream, 0, 0); + return; + } + + if (!allData || dispatch_data_get_size(allData) < sizeof(PTFrame)) { +#if PT_DISPATCH_RETAIN_RELEASE + if (allData) dispatch_release(allData); +#endif + callback([[NSError alloc] initWithDomain:Lookin_PTProtocolErrorDomain code:0 userInfo:nil], 0, 0, 0); + return; + } + + PTFrame *frame = NULL; + size_t size = 0; + + PT_PRECISE_LIFETIME dispatch_data_t contiguousData = dispatch_data_create_map(allData, (const void **)&frame, &size); // precise lifetime guarantees bytes in frame will stay valid till the end of scope +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(allData); +#endif + if (!contiguousData) { + callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:ENOMEM userInfo:nil], 0, 0, 0); + return; + } + + frame->version = ntohl(frame->version); + if (frame->version != PTProtocolVersion1) { + callback([[NSError alloc] initWithDomain:Lookin_PTProtocolErrorDomain code:0 userInfo:nil], 0, 0, 0); + } else { + frame->type = ntohl(frame->type); + frame->tag = ntohl(frame->tag); + frame->payloadSize = ntohl(frame->payloadSize); + callback(nil, frame->type, frame->tag, frame->payloadSize); + } + +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(contiguousData); +#endif + } + }); +} + + +- (void)readPayloadOfSize:(size_t)payloadSize overChannel:(dispatch_io_t)channel callback:(void(^)(NSError *error, dispatch_data_t contiguousData, const uint8_t *buffer, size_t bufferSize))callback { + __block dispatch_data_t allData = NULL; + dispatch_io_read(channel, 0, payloadSize, queue_, ^(bool done, dispatch_data_t data, int error) { + //NSLog(@"dispatch_io_read: done=%d data=%p error=%d", done, data, error); + size_t dataSize = dispatch_data_get_size(data); + + if (dataSize) { + if (!allData) { + allData = data; +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_retain(allData); +#endif + } else { +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_data_t allDataPrev = allData; + allData = dispatch_data_create_concat(allData, data); + dispatch_release(allDataPrev); +#else + allData = dispatch_data_create_concat(allData, data); +#endif + } + } + + if (done) { + if (error != 0) { +#if PT_DISPATCH_RETAIN_RELEASE + if (allData) dispatch_release(allData); +#endif + callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil], NULL, NULL, 0); + return; + } + + if (dataSize == 0) { +#if PT_DISPATCH_RETAIN_RELEASE + if (allData) dispatch_release(allData); +#endif + callback(nil, NULL, NULL, 0); + return; + } + + uint8_t *buffer = NULL; + size_t bufferSize = 0; + PT_PRECISE_LIFETIME dispatch_data_t contiguousData = NULL; + + if (allData) { + contiguousData = dispatch_data_create_map(allData, (const void **)&buffer, &bufferSize); +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(allData); allData = NULL; +#endif + if (!contiguousData) { + callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:ENOMEM userInfo:nil], NULL, NULL, 0); + return; + } + } + + callback(nil, contiguousData, buffer, bufferSize); +#if PT_DISPATCH_RETAIN_RELEASE + if (contiguousData) dispatch_release(contiguousData); +#endif + } + }); +} + + +- (void)readAndDiscardDataOfSize:(size_t)size overChannel:(dispatch_io_t)channel callback:(void(^)(NSError*, BOOL))callback { + dispatch_io_read(channel, 0, size, queue_, ^(bool done, dispatch_data_t data, int error) { + if (done && callback) { + size_t dataSize = data ? dispatch_data_get_size(data) : 0; + callback(error == 0 ? nil : [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil], dataSize == 0); + } + }); +} + + +- (void)readFramesOverChannel:(dispatch_io_t)channel onFrame:(void(^)(NSError*, uint32_t, uint32_t, uint32_t, dispatch_block_t))onFrame { + [self readFrameOverChannel:channel callback:^(NSError *error, uint32_t type, uint32_t tag, uint32_t payloadSize) { + onFrame(error, type, tag, payloadSize, ^{ + if (type != PTFrameTypeEndOfStream) { + [self readFramesOverChannel:channel onFrame:onFrame]; + } + }); + }]; +} + + +@end + + +@interface Lookin_PTDispatchData : NSObject { + dispatch_data_t dispatchData_; +} +@end +@implementation Lookin_PTDispatchData +- (id)initWithDispatchData:(dispatch_data_t)dispatchData { + if (!(self = [super init])) return nil; + dispatchData_ = dispatchData; +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_retain(dispatchData_); +#endif + return self; +} +- (void)dealloc { +#if PT_DISPATCH_RETAIN_RELEASE + if (dispatchData_) dispatch_release(dispatchData_); +#endif +} +@end + +@implementation NSData (Lookin_PTProtocol) + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-getter-return-value" + +- (dispatch_data_t)createReferencingDispatchData { + // Note: The queue is used to submit the destructor. Since we only perform an + // atomic release of self, it doesn't really matter which queue is used, thus + // we use the current calling queue. + return dispatch_data_create((const void*)self.bytes, self.length, dispatch_get_main_queue(), ^{ + // trick to have the block capture the data, thus retain/releasing + [self length]; + }); +} + +#pragma clang diagnostic pop + ++ (NSData *)dataWithContentsOfDispatchData:(dispatch_data_t)data { + if (!data) { + return nil; + } + uint8_t *buffer = NULL; + size_t bufferSize = 0; + PT_PRECISE_LIFETIME dispatch_data_t contiguousData = dispatch_data_create_map(data, (const void **)&buffer, &bufferSize); + if (!contiguousData) { + return nil; + } + + Lookin_PTDispatchData *dispatchDataRef = [[Lookin_PTDispatchData alloc] initWithDispatchData:contiguousData]; + NSData *newData = [NSData dataWithBytesNoCopy:(void*)buffer length:bufferSize freeWhenDone:NO]; +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(contiguousData); +#endif + static const bool kDispatchDataRefKey; + objc_setAssociatedObject(newData, (const void*)kDispatchDataRefKey, dispatchDataRef, OBJC_ASSOCIATION_RETAIN); + + return newData; +} + +@end + + +@implementation NSDictionary (Lookin_PTProtocol) + +- (dispatch_data_t)createReferencingDispatchData { + NSError *error = nil; + NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:self format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error]; + if (!plistData) { + NSLog(@"Failed to serialize property list: %@", error); + return nil; + } else { + return [plistData createReferencingDispatchData]; + } +} + +// Decode *data* as a peroperty list-encoded dictionary. Returns nil on failure. ++ (NSDictionary*)dictionaryWithContentsOfDispatchData:(dispatch_data_t)data { + if (!data) { + return nil; + } + uint8_t *buffer = NULL; + size_t bufferSize = 0; + PT_PRECISE_LIFETIME dispatch_data_t contiguousData = dispatch_data_create_map(data, (const void **)&buffer, &bufferSize); + if (!contiguousData) { + return nil; + } + NSDictionary *dict = [NSPropertyListSerialization propertyListWithData:[NSData dataWithBytesNoCopy:(void*)buffer length:bufferSize freeWhenDone:NO] options:NSPropertyListImmutable format:NULL error:nil]; +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(contiguousData); +#endif + return dict; +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTUSBHub.h b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTUSBHub.h new file mode 100644 index 0000000..30c97a7 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTUSBHub.h @@ -0,0 +1,88 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + + + +#include +#import + +// Lookin_PTUSBDeviceDidAttachNotification +// Posted when a device has been attached. Also posted for each device that is +// already attached when the Lookin_PTUSBHub starts listening. +// +// .userInfo = { +// DeviceID = 3; +// MessageType = Attached; +// Properties = { +// ConnectionSpeed = 480000000; +// ConnectionType = USB; +// DeviceID = 3; +// LocationID = 1234567890; +// ProductID = 1234; +// SerialNumber = 0123456789abcdef0123456789abcdef01234567; +// }; +// } +// +FOUNDATION_EXPORT NSString * const Lookin_PTUSBDeviceDidAttachNotification; + +// Lookin_PTUSBDeviceDidDetachNotification +// Posted when a device has been detached. +// +// .userInfo = { +// DeviceID = 3; +// MessageType = Detached; +// } +// +FOUNDATION_EXPORT NSString * const Lookin_PTUSBDeviceDidDetachNotification; + +// NSError domain +FOUNDATION_EXPORT NSString * const Lookin_PTUSBHubErrorDomain; + +// Error codes returned with NSError.code for NSError domain Lookin_PTUSBHubErrorDomain +typedef enum { + PTUSBHubErrorBadDevice = 2, + PTUSBHubErrorConnectionRefused = 3, +} PTUSBHubError; + +@interface Lookin_PTUSBHub : NSObject + +// Shared, implicitly opened hub. ++ (Lookin_PTUSBHub*)sharedHub; + +// Connect to a TCP *port* on a device, while the actual transport is over USB. +// Upon success, *error* is nil and *channel* is a duplex I/O channel. +// You can retrieve the underlying file descriptor using +// dispatch_io_get_descriptor(channel). The dispatch_io_t channel behaves just +// like any stream type dispatch_io_t, making it possible to use the same logic +// for both USB bridged connections and e.g. ethernet-based connections. +// +// *onStart* is called either when a connection failed, in which case the error +// argument is non-nil, or when the connection was successfully established (the +// error argument is nil). Must not be NULL. +// +// *onEnd* is called when a connection was open and just did close. If the error +// argument is non-nil, the channel closed because of an error. Pass NULL for no +// callback. +// +- (void)connectToDevice:(NSNumber*)deviceID + port:(int)port + onStart:(void(^)(NSError *error, dispatch_io_t channel))onStart + onEnd:(void(^)(NSError *error))onEnd; + +// Start listening for devices. You only need to invoke this method on custom +// instances to start receiving notifications. The shared instance returned from +// +sharedHub is always in listening mode. +// +// *onStart* is called either when the system failed to start listening, in +// which case the error argument is non-nil, or when the receiver is listening. +// Pass NULL for no callback. +// +// *onEnd* is called when listening stopped. If the error argument is non-nil, +// listening stopped because of an error. Pass NULL for no callback. +// +- (void)listenOnQueue:(dispatch_queue_t)queue + onStart:(void(^)(NSError*))onStart + onEnd:(void(^)(NSError*))onEnd; + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTUSBHub.m b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTUSBHub.m new file mode 100644 index 0000000..cde0dd7 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Peertalk/Lookin_PTUSBHub.m @@ -0,0 +1,674 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +#import "Lookin_PTUSBHub.h" + + + +#import "Lookin_PTPrivate.h" + +#include +#include +#include +#include +#include + +NSString * const Lookin_PTUSBHubErrorDomain = @"PTUSBHubError"; + +typedef uint32_t USBMuxPacketType; +enum { + USBMuxPacketTypeResult = 1, + USBMuxPacketTypeConnect = 2, + USBMuxPacketTypeListen = 3, + USBMuxPacketTypeDeviceAdd = 4, + USBMuxPacketTypeDeviceRemove = 5, + // ? = 6, + // ? = 7, + USBMuxPacketTypePlistPayload = 8, +}; + +typedef uint32_t USBMuxPacketProtocol; +enum { + USBMuxPacketProtocolBinary = 0, + USBMuxPacketProtocolPlist = 1, +}; + +typedef uint32_t USBMuxReplyCode; +enum { + USBMuxReplyCodeOK = 0, + USBMuxReplyCodeBadCommand = 1, + USBMuxReplyCodeBadDevice = 2, + USBMuxReplyCodeConnectionRefused = 3, + // ? = 4, + // ? = 5, + USBMuxReplyCodeBadVersion = 6, +}; + + +typedef struct usbmux_packet { + uint32_t size; + USBMuxPacketProtocol protocol; + USBMuxPacketType type; + uint32_t tag; + char data[0]; +} __attribute__((__packed__)) usbmux_packet_t; + +static const uint32_t kUsbmuxPacketMaxPayloadSize = UINT32_MAX - (uint32_t)sizeof(usbmux_packet_t); + + +static uint32_t usbmux_packet_payload_size(usbmux_packet_t *upacket) { + return upacket->size - sizeof(usbmux_packet_t); +} + + +static void *usbmux_packet_payload(usbmux_packet_t *upacket) { + return (void*)upacket->data; +} + + +static void usbmux_packet_set_payload(usbmux_packet_t *upacket, + const void *payload, + uint32_t payloadLength) +{ + memcpy(usbmux_packet_payload(upacket), payload, payloadLength); +} + + +static usbmux_packet_t *usbmux_packet_alloc(uint32_t payloadSize) { + assert(payloadSize <= kUsbmuxPacketMaxPayloadSize); + uint32_t upacketSize = sizeof(usbmux_packet_t) + payloadSize; + usbmux_packet_t *upacket = CFAllocatorAllocate(kCFAllocatorDefault, upacketSize, 0); + memset(upacket, 0, sizeof(usbmux_packet_t)); + upacket->size = upacketSize; + return upacket; +} + + +static usbmux_packet_t *usbmux_packet_create(USBMuxPacketProtocol protocol, + USBMuxPacketType type, + uint32_t tag, + const void *payload, + uint32_t payloadSize) +{ + usbmux_packet_t *upacket = usbmux_packet_alloc(payloadSize); + if (!upacket) { + return NULL; + } + + upacket->protocol = protocol; + upacket->type = type; + upacket->tag = tag; + + if (payload && payloadSize) { + usbmux_packet_set_payload(upacket, payload, (uint32_t)payloadSize); + } + + return upacket; +} + + +static void usbmux_packet_free(usbmux_packet_t *upacket) { + CFAllocatorDeallocate(kCFAllocatorDefault, upacket); +} + + +NSString * const Lookin_PTUSBDeviceDidAttachNotification = @"Lookin_PTUSBDeviceDidAttachNotification"; +NSString * const Lookin_PTUSBDeviceDidDetachNotification = @"Lookin_PTUSBDeviceDidDetachNotification"; + +static NSString *kPlistPacketTypeListen = @"Listen"; +static NSString *kPlistPacketTypeConnect = @"Connect"; + + +// Represents a channel of communication between the host process and a remote +// (device) system. In practice, a Lookin_PTUSBChannel is connected to a usbmuxd +// endpoint which is configured to either listen for device changes (the +// PTUSBHub's channel is usually configured as a device notification listener) or +// configured as a TCP bridge (e.g. channels returned from PTUSBHub's +// connectToDevice:port:callback:). You should not create channels yourself, but +// let Lookin_PTUSBHub provide you with already configured channels. +@interface Lookin_PTUSBChannel : NSObject { + dispatch_io_t channel_; + dispatch_queue_t queue_; + uint32_t nextPacketTag_; + NSMutableDictionary *responseQueue_; + BOOL autoReadPackets_; + BOOL isReadingPackets_; +} + +// The underlying dispatch I/O channel. This is handy if you want to handle your +// own I/O logic without Lookin_PTUSBChannel. Remember to dispatch_retain() the channel +// if you plan on using it as it might be released from the Lookin_PTUSBChannel at any +// point in time. +@property (readonly) dispatch_io_t dispatchChannel; + +// The underlying file descriptor. +@property (readonly) dispatch_fd_t fileDescriptor; + +// Send data +- (void)sendDispatchData:(dispatch_data_t)data callback:(void(^)(NSError*))callback; +- (void)sendData:(NSData*)data callback:(void(^)(NSError*))callback; + +// Read data +- (void)readFromOffset:(off_t)offset length:(size_t)length callback:(void(^)(NSError *error, dispatch_data_t data))callback; + +// Close the channel, preventing further reads and writes, but letting currently +// queued reads and writes finish. +- (void)cancel; + +// Close the channel, preventing further reads and writes, immediately +// terminating any ongoing reads and writes. +- (void)stop; + +@end + + +@interface Lookin_PTUSBChannel (Private) + ++ (NSDictionary*)packetDictionaryWithPacketType:(NSString*)messageType payload:(NSDictionary*)payload; +- (BOOL)openOnQueue:(dispatch_queue_t)queue error:(NSError**)error onEnd:(void(^)(NSError *error))onEnd; +- (void)listenWithBroadcastHandler:(void(^)(NSDictionary *packet))broadcastHandler callback:(void(^)(NSError*))callback; +- (BOOL)errorFromPlistResponse:(NSDictionary*)packet error:(NSError**)error; +- (uint32_t)nextPacketTag; +- (void)sendPacketOfType:(USBMuxPacketType)type overProtocol:(USBMuxPacketProtocol)protocol tag:(uint32_t)tag payload:(NSData*)payload callback:(void(^)(NSError*))callback; +- (void)sendPacket:(NSDictionary*)packet tag:(uint32_t)tag callback:(void(^)(NSError *error))callback; +- (void)sendRequest:(NSDictionary*)packet callback:(void(^)(NSError *error, NSDictionary *responsePacket))callback; +- (void)scheduleReadPacketWithCallback:(void(^)(NSError *error, NSDictionary *packet, uint32_t packetTag))callback; +- (void)scheduleReadPacketWithBroadcastHandler:(void(^)(NSDictionary *packet))broadcastHandler; +- (void)setNeedsReadingPacket; +@end + + +@interface Lookin_PTUSBHub () { + Lookin_PTUSBChannel *channel_; +} +- (void)handleBroadcastPacket:(NSDictionary*)packet; +@end + + +@implementation Lookin_PTUSBHub + + ++ (Lookin_PTUSBHub*)sharedHub { + static Lookin_PTUSBHub *gSharedHub; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + gSharedHub = [Lookin_PTUSBHub new]; + [gSharedHub listenOnQueue:dispatch_get_main_queue() onStart:^(NSError *error) { + if (error) { + NSLog(@"Lookin_PTUSBHub failed to initialize: %@", error); + } + } onEnd:nil]; + }); + return gSharedHub; +} + + +- (id)init { + if (!(self = [super init])) return nil; + + return self; +} + + +- (void)listenOnQueue:(dispatch_queue_t)queue onStart:(void(^)(NSError*))onStart onEnd:(void(^)(NSError*))onEnd { + if (channel_) { + if (onStart) onStart(nil); + return; + } + channel_ = [Lookin_PTUSBChannel new]; + NSError *error = nil; + if ([channel_ openOnQueue:queue error:&error onEnd:onEnd]) { + [channel_ listenWithBroadcastHandler:^(NSDictionary *packet) { [self handleBroadcastPacket:packet]; } callback:onStart]; + } else if (onStart) { + onStart(error); + } +} + + +- (void)connectToDevice:(NSNumber*)deviceID port:(int)port onStart:(void(^)(NSError*, dispatch_io_t))onStart onEnd:(void(^)(NSError*))onEnd { + Lookin_PTUSBChannel *channel = [Lookin_PTUSBChannel new]; + NSError *error = nil; + + if (![channel openOnQueue:dispatch_get_main_queue() error:&error onEnd:onEnd]) { + onStart(error, nil); + return; + } + + port = ((port<<8) & 0xFF00) | (port>>8); // limit + + NSDictionary *packet = [Lookin_PTUSBChannel packetDictionaryWithPacketType:kPlistPacketTypeConnect + payload:[NSDictionary dictionaryWithObjectsAndKeys: + deviceID, @"DeviceID", + [NSNumber numberWithInt:port], @"PortNumber", + nil]]; + + [channel sendRequest:packet callback:^(NSError *error_, NSDictionary *responsePacket) { + NSError *error = error_; + [channel errorFromPlistResponse:responsePacket error:&error]; + onStart(error, (error ? nil : channel.dispatchChannel) ); + }]; +} + + +- (void)handleBroadcastPacket:(NSDictionary*)packet { + NSString *messageType = [packet objectForKey:@"MessageType"]; + + if ([@"Attached" isEqualToString:messageType]) { + [[NSNotificationCenter defaultCenter] postNotificationName:Lookin_PTUSBDeviceDidAttachNotification object:self userInfo:packet]; + } else if ([@"Detached" isEqualToString:messageType]) { + [[NSNotificationCenter defaultCenter] postNotificationName:Lookin_PTUSBDeviceDidDetachNotification object:self userInfo:packet]; + } else { + NSLog(@"Warning: Unhandled broadcast message: %@", packet); + } +} + + +@end + +#pragma mark - + +@implementation Lookin_PTUSBChannel + ++ (NSDictionary*)packetDictionaryWithPacketType:(NSString*)messageType payload:(NSDictionary*)payload { + NSDictionary *packet = nil; + + static NSString *bundleName = nil; + static NSString *bundleVersion = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSDictionary *infoDict = [NSBundle mainBundle].infoDictionary; + if (infoDict) { + bundleName = [infoDict objectForKey:@"CFBundleName"]; + bundleVersion = [[infoDict objectForKey:@"CFBundleVersion"] description]; + } + }); + + if (bundleName) { + packet = [NSDictionary dictionaryWithObjectsAndKeys: + messageType, @"MessageType", + bundleName, @"ProgName", + bundleVersion, @"ClientVersionString", + nil]; + } else { + packet = [NSDictionary dictionaryWithObjectsAndKeys:messageType, @"MessageType", nil]; + } + + if (payload) { + NSMutableDictionary *mpacket = [NSMutableDictionary dictionaryWithDictionary:payload]; + [mpacket addEntriesFromDictionary:packet]; + packet = mpacket; + } + + return packet; +} + + +- (id)init { + if (!(self = [super init])) return nil; + + return self; +} + + +- (void)dealloc { + //NSLog(@"dealloc %@", self); + if (channel_) { +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(channel_); +#endif + channel_ = nil; + } +} + + +- (BOOL)valid { + return !!channel_; +} + + +- (dispatch_io_t)dispatchChannel { + return channel_; +} + + +- (dispatch_fd_t)fileDescriptor { + return dispatch_io_get_descriptor(channel_); +} + + +- (BOOL)openOnQueue:(dispatch_queue_t)queue error:(NSError**)error onEnd:(void(^)(NSError*))onEnd { + assert(queue != nil); + assert(channel_ == nil); + queue_ = queue; + + // Create socket + dispatch_fd_t fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd == -1) { + if (error) *error = [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]; + return NO; + } + + // prevent SIGPIPE + int on = 1; + setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &on, sizeof(on)); + + // Connect socket + struct sockaddr_un addr; + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, "/var/run/usbmuxd"); + socklen_t socklen = sizeof(addr); + if (connect(fd, (struct sockaddr*)&addr, socklen) == -1) { + if (error) *error = [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]; + return NO; + } + + channel_ = dispatch_io_create(DISPATCH_IO_STREAM, fd, queue_, ^(int error) { + close(fd); + if (onEnd) { + onEnd(error == 0 ? nil : [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil]); + } + }); + + return YES; +} + + +- (void)listenWithBroadcastHandler:(void(^)(NSDictionary *packet))broadcastHandler callback:(void(^)(NSError*))callback { + autoReadPackets_ = YES; + [self scheduleReadPacketWithBroadcastHandler:broadcastHandler]; + + NSDictionary *packet = [Lookin_PTUSBChannel packetDictionaryWithPacketType:kPlistPacketTypeListen payload:nil]; + + [self sendRequest:packet callback:^(NSError *error_, NSDictionary *responsePacket) { + if (!callback) + return; + + NSError *error = error_; + [self errorFromPlistResponse:responsePacket error:&error]; + + callback(error); + }]; +} + + +- (BOOL)errorFromPlistResponse:(NSDictionary*)packet error:(NSError**)error { + if (!*error) { + NSNumber *n = [packet objectForKey:@"Number"]; + + if (!n) { + *error = [NSError errorWithDomain:Lookin_PTUSBHubErrorDomain code:(n ? n.integerValue : 0) userInfo:nil]; + return NO; + } + + USBMuxReplyCode replyCode = (USBMuxReplyCode)n.integerValue; + if (replyCode != 0) { + NSString *errmessage = @"Unspecified error"; + switch (replyCode) { + case USBMuxReplyCodeBadCommand: errmessage = @"illegal command"; break; + case USBMuxReplyCodeBadDevice: errmessage = @"unknown device"; break; + case USBMuxReplyCodeConnectionRefused: errmessage = @"connection refused"; break; + case USBMuxReplyCodeBadVersion: errmessage = @"invalid version"; break; + default: break; + } + *error = [NSError errorWithDomain:Lookin_PTUSBHubErrorDomain code:replyCode userInfo:[NSDictionary dictionaryWithObject:errmessage forKey:NSLocalizedDescriptionKey]]; + return NO; + } + } + return YES; +} + + +- (uint32_t)nextPacketTag { + return ++nextPacketTag_; +} + + +- (void)sendRequest:(NSDictionary*)packet callback:(void(^)(NSError*, NSDictionary*))callback { + uint32_t tag = [self nextPacketTag]; + [self sendPacket:packet tag:tag callback:^(NSError *error) { + if (error) { + callback(error, nil); + return; + } + // TODO: timeout un-triggered callbacks in responseQueue_ + if (!self->responseQueue_) self->responseQueue_ = [NSMutableDictionary new]; + [self->responseQueue_ setObject:callback forKey:[NSNumber numberWithUnsignedInt:tag]]; + }]; + + // We are awaiting a response + [self setNeedsReadingPacket]; +} + + +- (void)setNeedsReadingPacket { + if (!isReadingPackets_) { + [self scheduleReadPacketWithBroadcastHandler:nil]; + } +} + + +- (void)scheduleReadPacketWithBroadcastHandler:(void(^)(NSDictionary *packet))broadcastHandler { + assert(isReadingPackets_ == NO); + + [self scheduleReadPacketWithCallback:^(NSError *error, NSDictionary *packet, uint32_t packetTag) { + // Interpret the package we just received + if (packetTag == 0) { + // Broadcast message + //NSLog(@"Received broadcast: %@", packet); + if (broadcastHandler) broadcastHandler(packet); + } else if (self->responseQueue_) { + // Reply + NSNumber *key = [NSNumber numberWithUnsignedInt:packetTag]; + void(^requestCallback)(NSError*,NSDictionary*) = [self->responseQueue_ objectForKey:key]; + if (requestCallback) { + [self->responseQueue_ removeObjectForKey:key]; + requestCallback(error, packet); + } else { + NSLog(@"Warning: Ignoring reply packet for which there is no registered callback. Packet => %@", packet); + } + } + + // Schedule reading another incoming package + if (self->autoReadPackets_) { + [self scheduleReadPacketWithBroadcastHandler:broadcastHandler]; + } + }]; +} + + +- (void)scheduleReadPacketWithCallback:(void(^)(NSError*, NSDictionary*, uint32_t))callback { + static usbmux_packet_t ref_upacket; + isReadingPackets_ = YES; + + // Read the first `sizeof(ref_upacket.size)` bytes off the channel_ + dispatch_io_read(channel_, 0, sizeof(ref_upacket.size), queue_, ^(bool done, dispatch_data_t data, int error) { + //NSLog(@"dispatch_io_read 0,4: done=%d data=%p error=%d", done, data, error); + + if (!done) + return; + + if (error) { + self->isReadingPackets_ = NO; + callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil], nil, 0); + return; + } + + // Read size of incoming usbmux_packet_t + uint32_t upacket_len = 0; + char *buffer = NULL; + size_t buffer_size = 0; + PT_PRECISE_LIFETIME_UNUSED dispatch_data_t map_data = dispatch_data_create_map(data, (const void **)&buffer, &buffer_size); // objc_precise_lifetime guarantees 'map_data' isn't released before memcpy has a chance to do its thing + assert(buffer_size == sizeof(ref_upacket.size)); + assert(sizeof(upacket_len) == sizeof(ref_upacket.size)); + memcpy((void *)&(upacket_len), (const void *)buffer, buffer_size); +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(map_data); +#endif + + // Allocate a new usbmux_packet_t for the expected size + uint32_t payloadLength = upacket_len - (uint32_t)sizeof(usbmux_packet_t); + usbmux_packet_t *upacket = usbmux_packet_alloc(payloadLength); + + // Read rest of the incoming usbmux_packet_t + off_t offset = sizeof(ref_upacket.size); + dispatch_io_read(self->channel_, offset, (size_t)(upacket->size - offset), self->queue_, ^(bool done, dispatch_data_t data, int error) { + //NSLog(@"dispatch_io_read X,Y: done=%d data=%p error=%d", done, data, error); + + if (!done) { + return; + } + + self->isReadingPackets_ = NO; + + if (error) { + callback([[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:error userInfo:nil], nil, 0); + usbmux_packet_free(upacket); + return; + } + + if (upacket_len > kUsbmuxPacketMaxPayloadSize) { + callback( + [[NSError alloc] initWithDomain:Lookin_PTUSBHubErrorDomain code:1 userInfo:@{ + NSLocalizedDescriptionKey:@"Received a packet that is too large"}], + nil, + 0 + ); + usbmux_packet_free(upacket); + return; + } + + // Copy read bytes onto our usbmux_packet_t + char *buffer = NULL; + size_t buffer_size = 0; + PT_PRECISE_LIFETIME_UNUSED dispatch_data_t map_data = dispatch_data_create_map(data, (const void **)&buffer, &buffer_size); + assert(buffer_size == upacket->size - offset); + memcpy(((void *)(upacket))+offset, (const void *)buffer, buffer_size); +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(map_data); +#endif + + // We only support plist protocol + if (upacket->protocol != USBMuxPacketProtocolPlist) { + callback([[NSError alloc] initWithDomain:Lookin_PTUSBHubErrorDomain code:0 userInfo:[NSDictionary dictionaryWithObject:@"Unexpected package protocol" forKey:NSLocalizedDescriptionKey]], nil, upacket->tag); + usbmux_packet_free(upacket); + return; + } + + // Only one type of packet in the plist protocol + if (upacket->type != USBMuxPacketTypePlistPayload) { + callback([[NSError alloc] initWithDomain:Lookin_PTUSBHubErrorDomain code:0 userInfo:[NSDictionary dictionaryWithObject:@"Unexpected package type" forKey:NSLocalizedDescriptionKey]], nil, upacket->tag); + usbmux_packet_free(upacket); + return; + } + + // Try to decode any payload as plist + NSError *err = nil; + NSDictionary *dict = nil; + if (usbmux_packet_payload_size(upacket)) { + dict = [NSPropertyListSerialization propertyListWithData:[NSData dataWithBytesNoCopy:usbmux_packet_payload(upacket) length:usbmux_packet_payload_size(upacket) freeWhenDone:NO] options:NSPropertyListImmutable format:NULL error:&err]; + } + + // Invoke callback + callback(err, dict, upacket->tag); + usbmux_packet_free(upacket); + }); + }); +} + + +- (void)sendPacketOfType:(USBMuxPacketType)type + overProtocol:(USBMuxPacketProtocol)protocol + tag:(uint32_t)tag + payload:(NSData*)payload + callback:(void(^)(NSError*))callback +{ + assert(payload.length <= kUsbmuxPacketMaxPayloadSize); + usbmux_packet_t *upacket = usbmux_packet_create( + protocol, + type, + tag, + payload ? payload.bytes : nil, + (uint32_t)(payload ? payload.length : 0) + ); + dispatch_data_t data = dispatch_data_create((const void*)upacket, upacket->size, queue_, ^{ + // Free packet when data is freed + usbmux_packet_free(upacket); + }); + //NSData *data1 = [NSData dataWithBytesNoCopy:(void*)upacket length:upacket->size freeWhenDone:NO]; + //[data1 writeToFile:[NSString stringWithFormat:@"/Users/rsms/c-packet-%u.data", tag] atomically:NO]; + [self sendDispatchData:data callback:callback]; +} + + +- (void)sendPacket:(NSDictionary*)packet tag:(uint32_t)tag callback:(void(^)(NSError*))callback { + NSError *error = nil; + // NSPropertyListBinaryFormat_v1_0 + NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:packet format:NSPropertyListXMLFormat_v1_0 options:0 error:&error]; + if (!plistData) { + callback(error); + } else { + [self sendPacketOfType:USBMuxPacketTypePlistPayload overProtocol:USBMuxPacketProtocolPlist tag:tag payload:plistData callback:callback]; + } +} + + +- (void)sendDispatchData:(dispatch_data_t)data callback:(void(^)(NSError*))callback { + off_t offset = 0; + dispatch_io_write(channel_, offset, data, queue_, ^(bool done, dispatch_data_t data, int _errno) { + //NSLog(@"dispatch_io_write: done=%d data=%p error=%d", done, data, error); + if (!done) + return; + if (callback) { + NSError *err = nil; + if (_errno) err = [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:_errno userInfo:nil]; + callback(err); + } + }); +#if PT_DISPATCH_RETAIN_RELEASE + dispatch_release(data); // Release our ref. A ref is still held by dispatch_io_write +#endif +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-getter-return-value" + +- (void)sendData:(NSData*)data callback:(void(^)(NSError*))callback { + dispatch_data_t ddata = dispatch_data_create((const void*)data.bytes, data.length, queue_, ^{ + // trick to have the block capture and retain the data + [data length]; + }); + [self sendDispatchData:ddata callback:callback]; +} + +#pragma clang diagnostic pop + +- (void)readFromOffset:(off_t)offset length:(size_t)length callback:(void(^)(NSError *error, dispatch_data_t data))callback { + dispatch_io_read(channel_, offset, length, queue_, ^(bool done, dispatch_data_t data, int _errno) { + if (!done) + return; + + NSError *error = nil; + if (_errno != 0) { + error = [[NSError alloc] initWithDomain:NSPOSIXErrorDomain code:_errno userInfo:nil]; + } + + callback(error, data); + }); +} + + +- (void)cancel { + if (channel_) { + dispatch_io_close(channel_, 0); + } +} + + +- (void)stop { + if (channel_) { + dispatch_io_close(channel_, DISPATCH_IO_STOP); + } +} + +@end + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/LookinServer/Src/Main/Shared/Peertalk/Peertalk.h b/Pods/LookinServer/Src/Main/Shared/Peertalk/Peertalk.h new file mode 100644 index 0000000..8249329 --- /dev/null +++ b/Pods/LookinServer/Src/Main/Shared/Peertalk/Peertalk.h @@ -0,0 +1,28 @@ +#ifdef SHOULD_COMPILE_LOOKIN_SERVER + +// +// Peertalk.h +// Peertalk +// +// Created by Marek Cirkos on 12/04/2016. +// +// + + + +#import + +//! Project version number for Peertalk. +FOUNDATION_EXPORT double PeertalkVersionNumber; + +//! Project version string for Peertalk. +FOUNDATION_EXPORT const unsigned char PeertalkVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + +#import "Lookin_PTChannel.h" +#import "Lookin_PTProtocol.h" +#import "Lookin_PTUSBHub.h" + +#endif /* SHOULD_COMPILE_LOOKIN_SERVER */ diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index ff55f71..fcf4160 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -15,6 +15,9 @@ PODS: - AFNetworking/UIKit (4.0.1): - AFNetworking/NSURLSession - Bugly (2.6.1) + - LookinServer (1.2.8): + - LookinServer/Core (= 1.2.8) + - LookinServer/Core (1.2.8) - Masonry (1.1.0) - MJExtension (3.4.2) - MJRefresh (3.7.9) @@ -25,6 +28,7 @@ PODS: DEPENDENCIES: - AFNetworking (= 4.0.1) - Bugly (= 2.6.1) + - LookinServer - Masonry (= 1.1.0) - MJExtension (= 3.4.2) - MJRefresh (= 3.7.9) @@ -34,6 +38,7 @@ SPEC REPOS: https://github.com/CocoaPods/Specs.git: - AFNetworking - Bugly + - LookinServer - Masonry - MJExtension - MJRefresh @@ -42,11 +47,12 @@ SPEC REPOS: SPEC CHECKSUMS: AFNetworking: 3bd23d814e976cd148d7d44c3ab78017b744cd58 Bugly: 217ac2ce5f0f2626d43dbaa4f70764c953a26a31 + LookinServer: 1b2b61c6402ae29fa22182d48f5cd067b4e99e80 Masonry: 678fab65091a9290e40e2832a55e7ab731aad201 MJExtension: e97d164cb411aa9795cf576093a1fa208b4a8dd8 MJRefresh: ff9e531227924c84ce459338414550a05d2aea78 SDWebImage: f29024626962457f3470184232766516dee8dfea -PODFILE CHECKSUM: b3c72fe500149c35040cdd73c1d91fe05777bc5f +PODFILE CHECKSUM: 4f2fbf9a7c2f24c74f9f26aba9933db3ee43ff84 COCOAPODS: 1.16.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 5dec3e7..e5d2dc7 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -19,372 +19,518 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 00DAE48C9A4FBCD1FCAA922CA57B45F9 /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 06B71FC03BF92D5C7E3E050752C0E06C /* SDWebImageDownloaderRequestModifier.m */; }; - 042D40751BD2F51FBE9FECD4707CBBE9 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = AC2514CF7A7B043E035CFB079E6FB5A0 /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 0453019EC6578A67B82CF569EC765546 /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = D13BE3E84BFB9462CF54B22B35F89ADC /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 05E2B7C1DB7528A0BBEA1521BE0DBAF1 /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CCE60F6B1B48663415E0A4BC9662B33 /* MASViewAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 06C4E233E7977DB81A24482E69B2D7D7 /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = 14C4334FE2177757C132CBBCD17C11B5 /* UIImage+Transform.m */; }; - 08719ABCE689ED74FE7486B1E49DAA6C /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F8526067D06A009E96461455DBA1B40 /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 089F3C4BAA46A37EC5763DD312771021 /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 13F0EE17165FE326BF8D348C181A1E71 /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 08D50C5AC969A3701B6F9137CF3A10F1 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 840FE4FBC8DFDB4B1238B06FEA5AF259 /* UIImage+ForceDecode.m */; }; + 00DAE48C9A4FBCD1FCAA922CA57B45F9 /* SDWebImageDownloaderRequestModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = CEA53A9CE48CBC1ECC0B09EA1FDE9FD6 /* SDWebImageDownloaderRequestModifier.m */; }; + 021ACCD4343D154E4782A5ECE222A8DF /* LookinIvarTrace.h in Headers */ = {isa = PBXBuildFile; fileRef = B9D8E6F60F0D21F3781FBE5E8D6A6139 /* LookinIvarTrace.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 042D40751BD2F51FBE9FECD4707CBBE9 /* SDDeviceHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B8D3ED63A0D6E1C4341827B7D01B7D8 /* SDDeviceHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 0453019EC6578A67B82CF569EC765546 /* SDFileAttributeHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AE4997796DA358B1DB8A66215370EFB /* SDFileAttributeHelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 05E2B7C1DB7528A0BBEA1521BE0DBAF1 /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C1333D32D092DD54CBE8B17F9E60A95 /* MASViewAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06C4E233E7977DB81A24482E69B2D7D7 /* UIImage+Transform.m in Sources */ = {isa = PBXBuildFile; fileRef = F26EC6DE08DD5D154B6F753072C347F9 /* UIImage+Transform.m */; }; + 0845A6CB7AE77A99CC475BD14101FE87 /* LookinAttrType.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B33E2C4415F95B948BC836B89DB55B0 /* LookinAttrType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 08719ABCE689ED74FE7486B1E49DAA6C /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = DB684D191E333C0E03104EAF677B0281 /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 089F3C4BAA46A37EC5763DD312771021 /* SDImageIOAnimatedCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 19A28292A0713CF593D9AF3DEF86D9CC /* SDImageIOAnimatedCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 08D50C5AC969A3701B6F9137CF3A10F1 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E8A92EE0A2A6F0F83B7C2C369B3FC1E /* UIImage+ForceDecode.m */; }; 08DF3A0323B44ABF3FAAE0F291F8566E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; - 09A2ACBC8CE1761652EAA20886AEFE10 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A54C7306CBDB1BC3189CCF492C92DE /* SDImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0B0E6CECDF516BC83756C1D5515A725B /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = FF49D60AE2D0E7C2857D88C5353083C3 /* SDAsyncBlockOperation.m */; }; - 0BADC710EA22BBCD76E59748C2A56ECF /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = A9F5CF889820DAD55268C3832155A2E1 /* PrivacyInfo.xcprivacy */; }; - 0EF10747EF2A02413E84BD5EF7C87A4B /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = E7D9B8C39A19DDF2CE7619D44758B033 /* MJRefreshNormalHeader.m */; }; - 0F1D0F5DCC8C94A4C684DF846D14F436 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 916FC91BADACF2A6F0FF12F1385FC1D4 /* SDWebImagePrefetcher.m */; }; - 0FF9F459ED16719292443A4C99B52B20 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8332CB32D0FA2CE8D910AA5A9BE18D8B /* SDImageCache.m */; }; - 10017B43AC38C3A89D7AC1376C6E7066 /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 80E9D6278C5650A6AD05F331651F6DEB /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 11C929E6BFB46F981685446F26DCE605 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 568638C925360332377ACFB503131A76 /* MJRefreshAutoFooter.m */; }; - 126496714AD564062A8C10787CC01B8B /* MJFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4830CF5BA96EF2AA3AC7496D62A49A0D /* MJFoundation.m */; }; - 14943D0EE97A4966510A86F5C3FC66A5 /* MJExtension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C5D0E76AC56695893DB1713CA7212B8C /* MJExtension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 14CA284AC4FF1EED75E785641EE98034 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 19E0C6994863739B688E61DCE0E025C3 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 165F1C9CBD621828C788A3018D0426C5 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C38C5957F4EAC459AB28A71622C865C /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 09A2ACBC8CE1761652EAA20886AEFE10 /* SDImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F319089CE8A771B4E00E74F5CF065DFE /* SDImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0B0E6CECDF516BC83756C1D5515A725B /* SDAsyncBlockOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = EAA447D9CA8EDFFD26730C6B416FFD84 /* SDAsyncBlockOperation.m */; }; + 0B449236AF25C6C11B0DE3D6D0E4A19B /* LookinEventHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = D4B53A1EC10D12A5BE9E935B855DB4C2 /* LookinEventHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0BE3B8DB6034364E7CF3AE9D01C7C0B4 /* CALayer+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = B81E913AAFCC8C59F40167A11BAD1D42 /* CALayer+Lookin.m */; }; + 0C79142D1349DD9A969F47A0A8AAA0CB /* Lookin_PTProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = E48D347569829823CC334B4DA45B2BC2 /* Lookin_PTProtocol.m */; }; + 0EF10747EF2A02413E84BD5EF7C87A4B /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 714B36235F9909A284858B25FE2E5788 /* MJRefreshNormalHeader.m */; }; + 0F1D0F5DCC8C94A4C684DF846D14F436 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = AE2B65C4CF7D797E1149C8944ED21A3D /* SDWebImagePrefetcher.m */; }; + 0FF9F459ED16719292443A4C99B52B20 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 50FF239901B003C3F00C684A8C24FABA /* SDImageCache.m */; }; + 10017B43AC38C3A89D7AC1376C6E7066 /* SDImageLoadersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 924E3600D7E3752D66E60C342840C98A /* SDImageLoadersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 117F4B6F653A8DA2637C5C93B4993884 /* Peertalk.h in Headers */ = {isa = PBXBuildFile; fileRef = 23E1DEFC1B8E7B2CCCE1A0B8392894AD /* Peertalk.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 11C929E6BFB46F981685446F26DCE605 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A066B727D20F282030A1ADDC6C93483 /* MJRefreshAutoFooter.m */; }; + 126496714AD564062A8C10787CC01B8B /* MJFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = F8787A312BDE6CB010E380D9C7F54B6E /* MJFoundation.m */; }; + 14943D0EE97A4966510A86F5C3FC66A5 /* MJExtension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 19B17B1E7436BD3BF7FE58E23EB65780 /* MJExtension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 14CA284AC4FF1EED75E785641EE98034 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 993FB7DD8F0F5CDE14006BCE526D824C /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 150116E888969E8304BA3E2BB6529461 /* LookinHierarchyFile.h in Headers */ = {isa = PBXBuildFile; fileRef = E25044B9D78FF27BAD6D0EE168A019F5 /* LookinHierarchyFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 165F1C9CBD621828C788A3018D0426C5 /* SDImageAPNGCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 836E51BD63F00FF107E843F3947DF237 /* SDImageAPNGCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16D7DCB7CC985C33EEC41B371C029C84 /* SDWebImage-SDWebImage in Resources */ = {isa = PBXBuildFile; fileRef = CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */; }; - 1708C1D28B421C4AD310426D1695CE77 /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = DC6CF0A46A4D9FFFBA2057678DF1978B /* SDAnimatedImage.m */; }; - 1754DD5511A7BF462B116F70B0D4006A /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 76F97ACAD92849B1F665FD0FF282B3C8 /* SDWebImageOperation.m */; }; - 1830558A4D2D63C8E76BC3136D8213F9 /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = 377FB4D51134D774594E6EAF0BB4DFAA /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 18660FA595DBE133BB784E813A7122A8 /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 20B21087EF80825B8FC789A191A95BAA /* SDImageHEICCoder.m */; }; - 186B573F1BEB8A23419A02814A7741DB /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = EAFBBF7E1270693113CDF0C1D9CBB512 /* MJRefreshFooter.m */; }; - 18AD90784D549657DF51BC8377DA3085 /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = D99D7FCB3FD62B8D8BF11087E1D6E47F /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1B6CE67196EE181E6B56788EFC7E00D3 /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B60142D76441D9D2B7BA4991E7523577 /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1BC44E2FDD197D5210A23C9CCF1A906B /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 7980625AB48FABAF33EDB825FF587011 /* SDWebImageCompat.m */; }; - 1C73BC7EEF39CC3D3A21EACAD858413D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 970B39752136D5831550118975DC4A91 /* PrivacyInfo.xcprivacy */; }; - 1C8B70C74291A3076746C3B18781568E /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DBD448EB576D346FBA1D20A1BD13F1D /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 1EA011B45EC780B434507AFB3D9647ED /* NSObject+MJCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = E200433A892F1843DD9B8C05E3C226BE /* NSObject+MJCoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1ECC5F320AEFB120081358B4FFB7442F /* NSString+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E310A44D757B0556FA6F2882D1565A8C /* NSString+MJExtension.m */; }; - 2055774CD703B52DABFB1CC588394A94 /* MJExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FB792580573132155A61C027392EF360 /* MJExtension-dummy.m */; }; - 20D618EF3EA5E3BE96DA24D36E3CA9EF /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 42134A400043398C196C2BDF73B21075 /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 22516EA77E7120000632C30BD9A03927 /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = C55407E10212267DCB2FC49D3260EF48 /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 24E8E4ED0B5D988E3346E6638619F4E4 /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B7D77CB378449CF4A7041A3EA89C102 /* SDImageFrame.m */; }; - 24E963C1D6245F98BAC8A0ACCB7DE987 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 37DCC80FE271D2095A398F8D8F22C7E7 /* NSBundle+MJRefresh.m */; }; + 1708C1D28B421C4AD310426D1695CE77 /* SDAnimatedImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 008D12F98C44419EC0A8DB3925320238 /* SDAnimatedImage.m */; }; + 1754DD5511A7BF462B116F70B0D4006A /* SDWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C007CBDC7D49DA6B1DACF451D56A546F /* SDWebImageOperation.m */; }; + 1830558A4D2D63C8E76BC3136D8213F9 /* UIImage+ExtendedCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AD66CE6D722E5E886958FE0F99A6DA6 /* UIImage+ExtendedCacheData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 18660FA595DBE133BB784E813A7122A8 /* SDImageHEICCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 02E46BBE37B9E605E49E103E7F87F695 /* SDImageHEICCoder.m */; }; + 186B573F1BEB8A23419A02814A7741DB /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 1878BDCAD754FE1097FEBCFED0BE49AD /* MJRefreshFooter.m */; }; + 18AD90784D549657DF51BC8377DA3085 /* SDWebImageDownloaderResponseModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = C9D1615D95A9058A5F66477080940E82 /* SDWebImageDownloaderResponseModifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1B52E938D7999FC0CDA2AA22674948EB /* LookinAttributesGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEBC8E89BEE2EE962363FCC92FC6E61 /* LookinAttributesGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1B6CE67196EE181E6B56788EFC7E00D3 /* SDImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = AA15DA30246619414A9C440764360D92 /* SDImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1BC44E2FDD197D5210A23C9CCF1A906B /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 1599325D7A76B2919AC08302175DCE80 /* SDWebImageCompat.m */; }; + 1C5CCB87E5B9C500F07A8244D7906295 /* LookinAppInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = C9CD5CF80DF285969292A93B2FC1C6C5 /* LookinAppInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C8B70C74291A3076746C3B18781568E /* SDImageCachesManagerOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = B284A89029CBE4B8FCF7E6D9F8A0C2B0 /* SDImageCachesManagerOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 1CA85ECC202E5CF62530BAD7C0DCDAF2 /* LookinHierarchyInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = E000A08E3EC43F17949721182B8F804C /* LookinHierarchyInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1D18A1A5D485D57192B021A8765C0AF5 /* LookinTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = BF801C9DC266DBE995123F5ED187A549 /* LookinTuple.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1EA011B45EC780B434507AFB3D9647ED /* NSObject+MJCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 1268201EC6F4BF7A1C93B850D3DB3355 /* NSObject+MJCoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1EC3AEA15AE416A53357261B37C622BD /* LKS_TraceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CCC0039C105F9489D458A6917B399A0C /* LKS_TraceManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1ECC5F320AEFB120081358B4FFB7442F /* NSString+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = BC959845321306D21F7B38574617BF5B /* NSString+MJExtension.m */; }; + 1EDC6F899051F0E858270F7556AF2F12 /* UIVisualEffectView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = F99D766826C224A2D7D6052D2D54CA36 /* UIVisualEffectView+LookinServer.m */; }; + 1EDF5F5B68D4A76CE59D5B6CC7B6C469 /* LookinAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = AAEC123AE9F853D11A1A1179B24CBACD /* LookinAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FD36A180D43C773D95D8E5BF719494C /* LookinDisplayItemDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 10C92CFDBED4322E033ABC6F5ACC96AB /* LookinDisplayItemDetail.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1FDEA3FFA45F29C1331723E9579D66A5 /* LookinAutoLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 255503B67607D6F8418BD1A29701AFE1 /* LookinAutoLayoutConstraint.m */; }; + 2055774CD703B52DABFB1CC588394A94 /* MJExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DA76D826B098D85B81C57F39270E09EC /* MJExtension-dummy.m */; }; + 20D618EF3EA5E3BE96DA24D36E3CA9EF /* SDAsyncBlockOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3AEEF11037C1BCFE69D6DA00C1F6DB71 /* SDAsyncBlockOperation.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 20E738E52B4712385489A62374C74C7F /* Lookin_PTUSBHub.m in Sources */ = {isa = PBXBuildFile; fileRef = 59556424F69D2F15031FF91203C5B1D7 /* Lookin_PTUSBHub.m */; }; + 22516EA77E7120000632C30BD9A03927 /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 82BAD1603BF8AB0697F3B9EFE8195AB2 /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 231A40F14D020AE2F61AA5C3289E6CF9 /* UITextView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 19C21A3D5DAE989B7ED66E39CDEFC148 /* UITextView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 244B4AFFAB4156D2844528160ABFC3C8 /* Pods-keyBoard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 969A9A842778EFB5D62826500DFF4E11 /* Pods-keyBoard-dummy.m */; }; + 2460C08042AF8B7D0492A062F755986E /* NSString+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = F5062DA8AEAE4430782016BEC468E129 /* NSString+Lookin.m */; }; + 24E8E4ED0B5D988E3346E6638619F4E4 /* SDImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 398FC32341E8B23F05E8B88C228D8361 /* SDImageFrame.m */; }; + 24E963C1D6245F98BAC8A0ACCB7DE987 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = D83A360037475DAD2928CFE370229369 /* NSBundle+MJRefresh.m */; }; 2567FE276DB76481DEFC7DDFE7D775CC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; - 288CD3416B265CAC1300D7938167AE66 /* MJPropertyKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 250848691A5C0FC662F372FB71E83AE5 /* MJPropertyKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 288D796F3F7B9F42690E24A3B1018B2C /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = E2EAE5E554B07101C740E6CB128A93A0 /* SDImageIOAnimatedCoder.m */; }; - 28BA9702905AA2B4C1E9E4878032D4E4 /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = BE6C3AB94897685F9464AA252C4EFB17 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 29F7F0E98FD26A96364DBACD7D5F237A /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 00031196DD7FBA552243DCF5CEB19ABD /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2DC44A09A6C9D6DC7D1BDA2DFCF99EE3 /* MJRefreshConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EFA72948DE45F4B6CAD9DA5C625D259 /* MJRefreshConfig.m */; }; - 2DDD48230ED9E8068C7E439D79B99A8E /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = A294AA5EAB4FD3CAF8C4A072117591C1 /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 2F6D9BEA582A2DBB70A6C3B2FC2DB91E /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F51691B6717B6D9E4E3FE0977CF3163 /* SDWebImageDownloaderResponseModifier.m */; }; - 3187FF0C251D1B78BE87F64F6F6E944A /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = A11030FED687E26E2A7953D880C8DDD7 /* SDWebImageTransition.m */; }; - 31DC2EC78AD1F8241AE6051EF9E73B0A /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DE36A434A8BD3593CCBD95090373332 /* SDWebImageDefine.m */; }; - 320DE42AF3CFE11FF785FEB1A7E6547B /* SDImageFramePool.m in Sources */ = {isa = PBXBuildFile; fileRef = BF3675A98BB80F2630D08AB3BE31E1B7 /* SDImageFramePool.m */; }; - 321F87DA34863DC5C977323BAEDB2B55 /* NSObject+MJCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D403D54754F62E7ECBA2668B217E5FD /* NSObject+MJCoding.m */; }; - 325CA20B9271F3E008234E1518B79061 /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AECAC2F59ABD4A78D2B73C898E485890 /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 261C31F4038EC00D5961218C97905E21 /* LookinConnectionResponseAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 75AC1BE9D1EBA73C1A7D6CBD7AFEFBB3 /* LookinConnectionResponseAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 27212D06F5EDE3BB10264D93075B2275 /* LookinDashboardBlueprint.h in Headers */ = {isa = PBXBuildFile; fileRef = 070AFBF58C2CF5274A3FAEE778C0864E /* LookinDashboardBlueprint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2759D8D4FCE58812ADECB348E369C6F0 /* LKS_MultiplatformAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AAFEE50CF56B2103D056BC42C8FC0E3 /* LKS_MultiplatformAdapter.m */; }; + 27CC45A4ABE5B40723D35310D05CD146 /* LKS_EventHandlerMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = B75044F1BA3F62B24D1F6705D2D66A02 /* LKS_EventHandlerMaker.m */; }; + 288CD3416B265CAC1300D7938167AE66 /* MJPropertyKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 6091D6A70F537A0BB9A74FFBC706B561 /* MJPropertyKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 288D796F3F7B9F42690E24A3B1018B2C /* SDImageIOAnimatedCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = A926DAC8E7777046E8188E4D987F833C /* SDImageIOAnimatedCoder.m */; }; + 28BA9702905AA2B4C1E9E4878032D4E4 /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DA74014630CFBABD2FDBEF38DF8983E /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 29F7F0E98FD26A96364DBACD7D5F237A /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 23A3D2686010C595388C060C97BDD19D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2A24F241D7D74FF6DEA953F9DD49391C /* LKS_EventHandlerMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = BD8D4C08450095A4BDCDBFA2F8DE70A7 /* LKS_EventHandlerMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2CDC7B9EAD356E35FEAF526EEA6A8E91 /* LookinWeakContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 20491D6CA1BB8F2F29EF3415E599ACEE /* LookinWeakContainer.m */; }; + 2DC44A09A6C9D6DC7D1BDA2DFCF99EE3 /* MJRefreshConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = C24220EC38C300A4231BF27AF6DFBABC /* MJRefreshConfig.m */; }; + 2DDA5F044BC698BC5D48A7CFDDBF71E3 /* LookinAttributeModification.m in Sources */ = {isa = PBXBuildFile; fileRef = 02595F4CE092E8F076796074E901A65C /* LookinAttributeModification.m */; }; + 2DDD48230ED9E8068C7E439D79B99A8E /* SDInternalMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CBC630E97E6160C1201FF36CF51A0B1 /* SDInternalMacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 2E86A7C77E43AEA4697979F1F848E68D /* LKS_RequestHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 58F260DB3140258F92F78788594C313F /* LKS_RequestHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2F6D9BEA582A2DBB70A6C3B2FC2DB91E /* SDWebImageDownloaderResponseModifier.m in Sources */ = {isa = PBXBuildFile; fileRef = BAC91C3C7012E2345CE8546D7487DA90 /* SDWebImageDownloaderResponseModifier.m */; }; + 3187FF0C251D1B78BE87F64F6F6E944A /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = EF27816E6C55CA22FA9AFA7AFC03334B /* SDWebImageTransition.m */; }; + 31DC2EC78AD1F8241AE6051EF9E73B0A /* SDWebImageDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 484B42214B225457DE36B4C078B84B99 /* SDWebImageDefine.m */; }; + 320DE42AF3CFE11FF785FEB1A7E6547B /* SDImageFramePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 3961BFF026424ABBD07A8DED78015F3B /* SDImageFramePool.m */; }; + 321F87DA34863DC5C977323BAEDB2B55 /* NSObject+MJCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FC914323BA2AE8D6B04FB881E065C93 /* NSObject+MJCoding.m */; }; + 325CA20B9271F3E008234E1518B79061 /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 840C5489E8F7E07E8F10036ACEA93B6D /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 327BA3DDA513422E632D3DA4A8FC60EC /* MJRefresh-MJRefresh.Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 7E3097CFEFDA621E9FB0E62009FF87FC /* MJRefresh-MJRefresh.Privacy */; }; - 32ACEDCEBE0507A82D6323114A1C74F1 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 23078E14E88B14332A0B4BE57A2A9488 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 32F2B91621A2F8F9AD7C8E2B224D73F6 /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C27DC7D5FFFA31A8EA1C7B95F3079E1 /* SDWebImageDownloaderDecryptor.m */; }; - 3331A013D48A5063B483A51B7E9068ED /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7506ED7F0118C1C5FE230328CCC6543E /* AFURLSessionManager.m */; }; - 33D3587AF629B2FA21554DA002D6ACB8 /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F0CEEBB5DD628DB121172299787A25A9 /* SDImageCachesManager.m */; }; - 34B28D4F0168194B6EFAC0520EB7A7F4 /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = F76369243ECD96D54BBB9C4A97EB6946 /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 36F4B09E7C71DCC5CEC6057814033C37 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A87E9EA0B6E9AB8C1E29A3AE50F278CB /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32ACEDCEBE0507A82D6323114A1C74F1 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FEDE0FBCBA817765A1C7A879A27434B /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32F2B91621A2F8F9AD7C8E2B224D73F6 /* SDWebImageDownloaderDecryptor.m in Sources */ = {isa = PBXBuildFile; fileRef = B0E3F7E6463B29A9F532594616A57A29 /* SDWebImageDownloaderDecryptor.m */; }; + 32FF240AE9443A1D2CFE27F50B55F591 /* LKS_MultiplatformAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AC69AA60F0E51E261AA9071D16524F8 /* LKS_MultiplatformAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 332F2099D726E75CEFAF1F734104A066 /* LookinWeakContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 456AC6BFC6F1376659E96E494E05B72B /* LookinWeakContainer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3331A013D48A5063B483A51B7E9068ED /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 42C02903F3EC2EF8D2384DC86D04D1AB /* AFURLSessionManager.m */; }; + 33D3587AF629B2FA21554DA002D6ACB8 /* SDImageCachesManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 083445CDF27981FED5ABFEA79E295D27 /* SDImageCachesManager.m */; }; + 34B28D4F0168194B6EFAC0520EB7A7F4 /* NSImage+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D5928FD36684070A4AF8169CF66A94A /* NSImage+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35D42759A562C482EA5DF574F75CF3B8 /* NSArray+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = A60942B17B0CA3AC711CDCE86BD9558C /* NSArray+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 36F4B09E7C71DCC5CEC6057814033C37 /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B696B0F5ED59F730D9D4DFA1F0BB7CC4 /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3777CD89D444CBBB48AE323B303F3FC7 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDAE741F085915AF2475C918F1A17466 /* ImageIO.framework */; }; - 37B890ABDC7DD441E6AA662325D412E6 /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 71C9A7FB9BC0D7C0FA902D0643B08962 /* MASConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 38938E604A7D708E6378A44063EF3512 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C6C465F665338FA163A2F6623C933047 /* UIImageView+WebCache.m */; }; - 3A1AD84C0DC3C256418CC46739024E96 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 61B4061AC178FEE58C9618133524CF08 /* SDmetamacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 3A2FCB914F6EADED828FF05F7E9132AE /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 35F55EE8682F170A101CA85DD55D1B58 /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3B8EDFF69A68ABD3735E0C6931CA5C95 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A95F96D9DAA700949C3A302C92FD9231 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3C7815EEC599DD7D42FDEF19B2FF1563 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = B9DF6B027952E0BE3781007ECC6436E7 /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3C7EAECB8C573E714C818BA04EB33773 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 897B6BFD5EA50E7440FD4FA3769B3C78 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3C8F2F868D0C361CAF43E53CDB8EB631 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A71363040CF6A8E6D918CEF79A555D5 /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3CE201A6CFF26BD49792F9A8E4C822A5 /* Pods-keyBoard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 969A9A842778EFB5D62826500DFF4E11 /* Pods-keyBoard-dummy.m */; }; - 3D0BBFEC1921CE71BC240DC18D8BE540 /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E7A746456C4F5E2C887572055F6A833 /* SDImageTransformer.m */; }; + 37B890ABDC7DD441E6AA662325D412E6 /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = A462389C4E35684C9C577F2F6309F24B /* MASConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3800EA1B83FDE869FB2E4B049F519962 /* UIViewController+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 845E78A89BC68B640BB9D4766F2B6230 /* UIViewController+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 38938E604A7D708E6378A44063EF3512 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E6D72207BDDCDC558D0C6F315A4D52A /* UIImageView+WebCache.m */; }; + 392F62298E0D8C669229E132D791BBF5 /* UIImageView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D5FD5B9915F367587FFCCA6A20E2F50 /* UIImageView+LookinServer.m */; }; + 3A1AD84C0DC3C256418CC46739024E96 /* SDmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 09E7AB4EEB7AE4F100B108AD6C5152E5 /* SDmetamacros.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 3A2FCB914F6EADED828FF05F7E9132AE /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = A10B5FDADD305EEB28DB0D0E2A5F0828 /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3B1C72DC480AB19BD55B6275750D62FE /* NSSet+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = B06D60C4A52A06B583043B5F33E9CE23 /* NSSet+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3B8EDFF69A68ABD3735E0C6931CA5C95 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 578E6DCE361C9C2FFED74421BE9E53CF /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3BB69CB142D744367868F834912993CB /* UITextField+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = AC97CF7554D8385D7E25DF2A4B218D2A /* UITextField+LookinServer.m */; }; + 3C7815EEC599DD7D42FDEF19B2FF1563 /* SDWebImageOptionsProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = 796944267FD7D8F745B0D165AD82DDC8 /* SDWebImageOptionsProcessor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C7EAECB8C573E714C818BA04EB33773 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = A72400E84012F4CE4689D3D15AD2D01E /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C8F2F868D0C361CAF43E53CDB8EB631 /* SDWebImageCacheSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = D4D4D49490338B3182E06909363E193F /* SDWebImageCacheSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D0BBFEC1921CE71BC240DC18D8BE540 /* SDImageTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = BA22E2DA45E11B0A6A18E08D78A1B477 /* SDImageTransformer.m */; }; + 3E3D09700A62280A9EB8D65B97335ED8 /* LKS_CustomDisplayItemsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = D7A7C8D2368C31D5517C69AF9C21303A /* LKS_CustomDisplayItemsMaker.m */; }; 3FE4CEC187728FF5B98CECE3D92744E7 /* Pods-CustomKeyboard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DDD0462C32F55EF5E9CB1056459809F /* Pods-CustomKeyboard-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3FF7252DD60182221BB1E5A167C41A07 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 018B520CB407C3492F13C3767C15E377 /* UIProgressView+AFNetworking.m */; }; - 416DA8B2997381F954DBA6E6A53DA4A2 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 90687AA744E720C17FD8600B60F43FF5 /* NSData+ImageContentType.m */; }; - 425C9EA28FBEB7F7FC09A3F4A88C5955 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = B509365346F676352BBC6630F5F1FADB /* SDWebImageError.m */; }; - 442F468E261A1106C291BF52BDBF9DB7 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 724FB5172055CF20AE6E6F4D007D8038 /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 44CD842019B1CEA681F820F37A30B7C4 /* SDImageFramePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 12C162655386843E5BE2582AC09CA762 /* SDImageFramePool.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 452C940762F65B125C216F73B369F583 /* MJRefreshStateTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B9AAE9B2C02781F4AC71AEDB56A439 /* MJRefreshStateTrailer.m */; }; + 3FF7252DD60182221BB1E5A167C41A07 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 1715EE59F5A92423F93FAFB62F1D7885 /* UIProgressView+AFNetworking.m */; }; + 40AD5D0AB3ABF7F3A5A4A98BC5B84419 /* LookinAttributesSection.h in Headers */ = {isa = PBXBuildFile; fileRef = 80795F8F1A43832D4B66BBD525759637 /* LookinAttributesSection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 416DA8B2997381F954DBA6E6A53DA4A2 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = FD9A0FF4BC528335E17AF558759CC155 /* NSData+ImageContentType.m */; }; + 41A4AAE7E6024E7AAB83DD22FB42D34D /* UIColor+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3888E51E50172FB2ABE3D3D0E2C528B5 /* UIColor+LookinServer.m */; }; + 425C9EA28FBEB7F7FC09A3F4A88C5955 /* SDWebImageError.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BBA0E685399A782E77B8A5A0D610E8 /* SDWebImageError.m */; }; + 442F468E261A1106C291BF52BDBF9DB7 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = C8667C11D6514FFBD572BD04F0665096 /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 447BBB1BCA8E0F2D23634888BED6DA81 /* LookinDashboardBlueprint.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EFF5F769414BBE23E36B9213F813FB6 /* LookinDashboardBlueprint.m */; }; + 44CD842019B1CEA681F820F37A30B7C4 /* SDImageFramePool.h in Headers */ = {isa = PBXBuildFile; fileRef = DD2888D9AEDDC5FB4645769FF72434AD /* SDImageFramePool.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 452C940762F65B125C216F73B369F583 /* MJRefreshStateTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = D779B4B4ABDD5B5950ED77ACB35D7071 /* MJRefreshStateTrailer.m */; }; 4571A0EA37DC84F39E3830D38A1531AB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BA0325112AB8CA7AB613D1A8ED2DB65 /* UIKit.framework */; }; - 45E1583D7EF53489B82C4CA2AD1AD0CF /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3126B87E909122AFEE37CA26F800E7D9 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4688743B7B845309486559EB7BD5D147 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B6867FF0B2276E04032D8E5C44B4EB9 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 475B4F3E71C293065AAFDB1888696CF6 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 29AFC65F883E204F73DDE040C829BC77 /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48916DE9521F627589300512ECC2D4A5 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 008AD8F77F87E2DC5C0DB4CD71AC5858 /* NSButton+WebCache.m */; }; - 4B2C2AE16AE3DDA7417AFCF7952588F1 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F7A20DE3DDDA450D1997F9A3184CD3C6 /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 4D2C79AB2D24CFEC864F08D913CE7692 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C3EC2E3BBB3895884BB4AA3B74A54476 /* SDImageCodersManager.m */; }; - 4DCA75BFE1558CE59DFC56607E49B3D2 /* MJRefreshConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = BEC2871B1357A63D88FCC0144C7847CD /* MJRefreshConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4ED05DB3E43FF6AE1FA22130B2B50F05 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = 4797723C6D7C918B816F46FCFB028F6F /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 506FC58999564A737C745F2590E9B4D5 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C60E3EC4F7CE664E3A6586ED2AC0ED5 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5111A0A0934551CD2B9DDB1A1CA79FA7 /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 9954286F43C39384A1EADABA9AAE0B0D /* SDAnimatedImageRep.m */; }; - 512B9661FC34235E0EEB3A6D3E319B88 /* MJPropertyType.m in Sources */ = {isa = PBXBuildFile; fileRef = 7842E350E0D12563DE7C0EB363356BF8 /* MJPropertyType.m */; }; - 5163FC6D715F6881B1FA1AB13DCEF870 /* UICollectionViewLayout+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 24B89B49F862DFF8218AA2D11CEDFD3E /* UICollectionViewLayout+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5174DD2019966DFDC21B8864453ED3DE /* NSObject+MJClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A50D4A4631B759E5D73FDFF78C8BF75 /* NSObject+MJClass.m */; }; - 523235228A1C021C67F2E3776A922DC5 /* MJRefreshTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = B6011963612818816E2CF40CED8B0112 /* MJRefreshTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 526485EF6D2B62B24DB59122FB94BD42 /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4090C24D16A324EB9D2A6747886BD217 /* SDDeviceHelper.m */; }; - 5308E660E723C11E7691D311FD59C459 /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = 48E4A519DF8188F67D6109DB1AF82FF9 /* SDDisplayLink.m */; }; - 53433003112C4FE271EC985803862B61 /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 9802609AB0266E444A1BD29FA119D9BC /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54E268C32915CF908E7AA776909B45EB /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BECBF70665658E16C4E9DDD74C7161A /* MJRefreshConst.m */; }; - 55F7C7F055A18044497F8C88CAE34118 /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 305FF55ADA3393924EFC2D4B6D38166D /* SDImageCachesManagerOperation.m */; }; - 561420A20DC0A84258A902E9EB69A15A /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D4327E5DC3980134C42B829E8798AA4 /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 564714D075CF51356D3D8437846AA6EB /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 74446596F2A689B17D9187482A194EEC /* AFURLRequestSerialization.m */; }; - 56D8A7EAE4D72FF6C23421CAB6F21504 /* MJPropertyType.h in Headers */ = {isa = PBXBuildFile; fileRef = 950F7A4DEA1A2D31E4A650C9526788F7 /* MJPropertyType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 56E800EB3B2BE8AE0BA45A30974D7920 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E8106411081DD6C7F5FE7804947412C /* Masonry-dummy.m */; }; - 58F7CE37BB4CB3BE806B68A502E6E1A7 /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F0E8534D3C055E4D5D27EBF7422DA74 /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 596180E0EC9F46D12BA840DC4AA62659 /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = EA1E48B813787CAC28E89E7F260BFCD4 /* UIImage+MemoryCacheCost.m */; }; - 597E390C0BBB75B8045B651C487C2034 /* SDImageAWebPCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = DFD5A14F9DC74814903A901B625C5A94 /* SDImageAWebPCoder.m */; }; - 5A6D3BE92C77ED70C397567996DFAEB9 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C0AB8960CBA6D24923E096B9378691C /* AFHTTPSessionManager.m */; }; - 5AF22814CD055B553AD9D78BE54B94E1 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE5F401F42AA242D6CAE9E463DE5CD4 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5B08596E856E4CC2F34A8A2372F9F764 /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = F934ACD20FEDAB980427B3D001DF8312 /* NSArray+MASAdditions.m */; }; - 5BB6B99986FD7111B3AEBE931C7F507B /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3526591F674CF19FB39EF872089A7F49 /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5BD5D9B8F61C124A62C75D9AC36A07BD /* MJRefreshTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = B1CE88DD0007C23B107D2BD3A6AB545B /* MJRefreshTrailer.m */; }; - 5C8279C226EB028B044C5A0F4AC5A91A /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 34E2AA501576A0C5221012B9066EC56A /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 5DCBA14510E091D6A1CE499B08B794B5 /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 03DE7669ACCB33ED7598791177D4881A /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5DFCBADAC7D0FAC82C84A6C8E7BF1DA6 /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = A20073D67775A184A6AEF2667BC7628C /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5E10328A83E05D0015D7459FAAEF121D /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FD6594A1D1613C90FF5EF2CBD5CE123 /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5F45735DF355530CC955066D3C007E19 /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 266F6A7CA0ABF9B26D746459A14BAEBA /* MASViewConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5FDC4239F7B651092BF582D0F460BAD4 /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 06B650CAE141ABD90E360415151BC9B9 /* UIView+MJExtension.m */; }; - 61461B0D9D7B81C3F8D24066D9A19DCE /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E10DADB58D42AEAD6CD268CEB583E8 /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61507E402F1F7C58BF119995A0479A22 /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DA8FCC29DBFD3824ADEAD9F14A76E86 /* NSArray+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 616A8338C42FB01748DF1BDDA944858D /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D3CFDF279C9B9946089A89EFB72A50D /* UIView+WebCache.m */; }; - 61857C821395B868C65A8FFE4DA1B4E3 /* MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 569FA95248CF0B824C3928196386FFC2 /* MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 62FE895DF9D65A2955A275D909ECBE18 /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = F0C38163E5AA6D4BEAA1C7E79C82A930 /* SDAnimatedImageView.m */; }; - 67178A8153B1A2F1D0D544B8093E23C5 /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C6DD7AD3672258C4407B4269B490F27 /* SDAnimatedImageView+WebCache.m */; }; - 676775CB29378BB6CA3CA5992E9C6A99 /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CB3E312C9D65596A37072C76944B850 /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 69345CBCB31076EBF8A2C5885AF973AB /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = E553AE6B35449F8CB4BAA4FFE1DCAFAC /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 694B8697854A776E32032999B2EF1FEA /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 46F91B0801CEBD1D73003708566CC913 /* UIImage+Metadata.m */; }; - 69A06A02F52EB26259FAD1DF6B121BE1 /* SDCallbackQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = AF26D1DF8BE4D63027161EEBE6FDE7AE /* SDCallbackQueue.m */; }; - 69AB6A513D5F36D7360FEF4FDA1D60D0 /* UIView+WebCacheState.h in Headers */ = {isa = PBXBuildFile; fileRef = DC6DB03243923516662807D789FF26B1 /* UIView+WebCacheState.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 69E353C99C6EEA3C93CCF2E526460B9D /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C64CBB1952BF537420E489E4AF7DED5 /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6A19379E3B0370EDA447743C9B1A1379 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 982D370CD4E116E0C1917E832541C530 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6B0978C9398336656EE309E62060AEAB /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 19F5C3BFE7C9E2977EB241266B257ABE /* SDImageAssetManager.m */; }; - 6B5C3592B5E911E833D067D0BC785B1A /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = AB8EC26A51378B3F4C5559E371607480 /* SDImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6C85CA8D99E50C137D056B6057DAC58A /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = B070DCCCA22D6ECC24DC0BD5CCEF5372 /* UIRefreshControl+AFNetworking.m */; }; - 6CA0B4A9E7B2957063163BC673F355CD /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FBCEF9827DD721BAF021C98F7311D30 /* AFAutoPurgingImageCache.m */; }; - 6DE6C7F0FA965828E4FCE687BF75FBBE /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E6DD5C54D7EC67B674C64E88446BAA7 /* MJRefreshAutoNormalFooter.m */; }; - 6E66305665DBCFBCF5B2480BF705D500 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 575E3DAA2F5DDC8FBD895B8BEA5FB8C6 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6EFEEE3AE22E97DCEC4F5A3B88F56FC7 /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7869EB02C0774141B550180F17DBF9F0 /* SDImageLoader.m */; }; - 6F3637EE643EABB1DE9212EA68649A64 /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 10E420AEEA134E4CDDBAA68DEA103561 /* UIColor+SDHexString.m */; }; - 7074EA7FCC90B4967A437F5C43496828 /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 078FC3682AC6F2B8020DD6D0F6A1A818 /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 711D32EF4A9901567A488291603BF906 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 67DDCFED9CF39A1F995D9E7B12E35A7E /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 71538A1D21015F459964BA625D5EE90A /* NSObject+MJClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 25ABF76DAF311B44A4F41DD3F9F04644 /* NSObject+MJClass.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 717F76926C7BCB5B10C3037AD9239084 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 21EE020A32A9ADF76D7C1AF1A9B28D63 /* SDImageIOCoder.m */; }; - 71BEB1D9532900291A5A24B1C038516F /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = 851329DB564FCDDAD9A52952F487E28D /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 71F2B8CBB99087F348C472230200586F /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = 661BCD3C752D21E81C83DA14D3C4502A /* SDGraphicsImageRenderer.m */; }; - 724991CA89C46BAFBC08264D94D86484 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DD19473CA2658646B964B6124A31FB9 /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 74C474676C69A80BEC29B0F55FDF4D19 /* UIView+WebCacheState.m in Sources */ = {isa = PBXBuildFile; fileRef = 197BBC12418F4C1E7719181019D1E9EA /* UIView+WebCacheState.m */; }; - 74E069F8C9E22C0E37F261A5AB03A613 /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E8EE46DFF5945CB5FDB220509F5E1A0 /* SDWebImageDownloaderConfig.m */; }; - 752822FE3F5092322D18FEC4533B79A9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = F104350C0F7D19687DAC6BD75101DA7F /* SDWebImageDownloader.m */; }; - 75771A97B77FA30A0175A81B480F80EF /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = EA46C1DE7820870BF842553EA6A951F9 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 772CF8E9CD02ECA4275B6173E2110E80 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E5886305209187E582C024335BD55AE9 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 45E1583D7EF53489B82C4CA2AD1AD0CF /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = A5C4B6887A00D265269C2F6E18435AC5 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 464A0100327C8531D86BDC31737CCF75 /* LookinAppInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = FD4903250ADF971C256406813D8C1DEE /* LookinAppInfo.m */; }; + 4688743B7B845309486559EB7BD5D147 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 851E334AEAE8F7D2EAD4FEADAA487505 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 475B4F3E71C293065AAFDB1888696CF6 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CAC61D29948B64BA8051D1562B8B48A /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 48916DE9521F627589300512ECC2D4A5 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 427721CF1489C69E69EFD257F673200D /* NSButton+WebCache.m */; }; + 4A15ABB502D625EBE3E63100664AB822 /* LookinCodingValueType.h in Headers */ = {isa = PBXBuildFile; fileRef = D9091431CFC5C0A100D291AF8A2D2B93 /* LookinCodingValueType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4B2C2AE16AE3DDA7417AFCF7952588F1 /* SDImageAssetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DDC5CE94B3CD031DD7B5BC418DDC09E /* SDImageAssetManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 4D2C79AB2D24CFEC864F08D913CE7692 /* SDImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = ADC57D4AABE4C703C7538D36FA9C800F /* SDImageCodersManager.m */; }; + 4DA2C6099343CD55160ECB3EBDDFE1DF /* NSObject+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = FCD45CDBD694FE635EED9B11544EE273 /* NSObject+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DCA75BFE1558CE59DFC56607E49B3D2 /* MJRefreshConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = A21778AE89CE9CD4592BABF959AFE823 /* MJRefreshConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E964FFE29CFF8613C0029C913F39A05 /* LKS_InbuiltAttrModificationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F2BE6DE434172227ECC11F2576619D /* LKS_InbuiltAttrModificationHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4EC8DBADA7BB954276351A639EB4398D /* UIBlurEffect+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 07D77214AE62D3768C2BB6BDB50720B4 /* UIBlurEffect+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4ED05DB3E43FF6AE1FA22130B2B50F05 /* UIImage+MemoryCacheCost.h in Headers */ = {isa = PBXBuildFile; fileRef = 044192A93545487A7E0420B603C4285C /* UIImage+MemoryCacheCost.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 50096BAC0F3270FB111E76D32714E579 /* Image+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CC1CB26EBFBA958C44A45620E65D37E /* Image+Lookin.m */; }; + 506FC58999564A737C745F2590E9B4D5 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = BEDB25750BAB3DB385C44969E31A51CA /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5111A0A0934551CD2B9DDB1A1CA79FA7 /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 71D84BFF9C97CD6ED2FAC67678A93852 /* SDAnimatedImageRep.m */; }; + 512B9661FC34235E0EEB3A6D3E319B88 /* MJPropertyType.m in Sources */ = {isa = PBXBuildFile; fileRef = F9B942D015FE250DD2C12BC56E9FE0C1 /* MJPropertyType.m */; }; + 5163FC6D715F6881B1FA1AB13DCEF870 /* UICollectionViewLayout+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 89AD017EC26DF7AC4F66DFDB5DA0BD55 /* UICollectionViewLayout+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5174DD2019966DFDC21B8864453ED3DE /* NSObject+MJClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BA822CC1E8CF917E43841631FD377CF /* NSObject+MJClass.m */; }; + 523235228A1C021C67F2E3776A922DC5 /* MJRefreshTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 33572E44B9E84887832C0BA36262B529 /* MJRefreshTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 526485EF6D2B62B24DB59122FB94BD42 /* SDDeviceHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 5083F1C9E5A258671D4A20ADDB000283 /* SDDeviceHelper.m */; }; + 5308E660E723C11E7691D311FD59C459 /* SDDisplayLink.m in Sources */ = {isa = PBXBuildFile; fileRef = DB279A22CABD71AAB410E88396A3C6E7 /* SDDisplayLink.m */; }; + 53433003112C4FE271EC985803862B61 /* SDWebImageCacheKeyFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = DED6B1DE51BD4E52B477D7C548CF782C /* SDWebImageCacheKeyFilter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53C1722650FCAB2637867D0DC31FC3CB /* Lookin_PTUSBHub.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CDE75D520BF5D9777D6ACD7798BC004 /* Lookin_PTUSBHub.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5490C03887ACF6C4EAC25ADFBB509CE5 /* NSSet+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 96032E81848B76DBF42F21BD90E472F4 /* NSSet+Lookin.m */; }; + 54E268C32915CF908E7AA776909B45EB /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 24A712595C444E0BA97B44FF4CDCE313 /* MJRefreshConst.m */; }; + 55F7C7F055A18044497F8C88CAE34118 /* SDImageCachesManagerOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 562970F3419C1EB0AEBC96577B7475A7 /* SDImageCachesManagerOperation.m */; }; + 561420A20DC0A84258A902E9EB69A15A /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 37909A5A250D08DEFD5B5DE8C09C37F6 /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 564714D075CF51356D3D8437846AA6EB /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 748A0893B4653646B0A27B7E0AC19FC8 /* AFURLRequestSerialization.m */; }; + 56D8A7EAE4D72FF6C23421CAB6F21504 /* MJPropertyType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D9B7125C481E0586F9468DEBF3E76F8 /* MJPropertyType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 56E800EB3B2BE8AE0BA45A30974D7920 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B3441C26C7AC549C4262F6A34D5D0C0 /* Masonry-dummy.m */; }; + 56F1B543BC54204336CB5E50B60F719F /* Color+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = BB2E3314150F2C8286028156B0A762DE /* Color+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5735091665AC18FAD028EB68786A85AE /* LKS_CustomAttrGroupsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = C64862E863ABC63C9C69F9D569759376 /* LKS_CustomAttrGroupsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58F7CE37BB4CB3BE806B68A502E6E1A7 /* SDWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DD0D105F9EEE0B4DAA94E912B8074BA /* SDWeakProxy.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 596180E0EC9F46D12BA840DC4AA62659 /* UIImage+MemoryCacheCost.m in Sources */ = {isa = PBXBuildFile; fileRef = F7A19A83DA09753B0E4583C8A57EF97C /* UIImage+MemoryCacheCost.m */; }; + 597E390C0BBB75B8045B651C487C2034 /* SDImageAWebPCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 00078AED6DDB9E77E4B7A11743D4B41D /* SDImageAWebPCoder.m */; }; + 5A6D3BE92C77ED70C397567996DFAEB9 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A0832105E3ABE8B885DD8711CB1DC9A /* AFHTTPSessionManager.m */; }; + 5A8BC91257FF6B36237BF09A7A6EADF6 /* LookinObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 93962A02113E51F674015AF1031E28E2 /* LookinObject.m */; }; + 5AF22814CD055B553AD9D78BE54B94E1 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 6708CFA86C80E1A6A83E259D47D3EAFC /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5B08596E856E4CC2F34A8A2372F9F764 /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 95A5615E32E88EE69FF2F104721935DD /* NSArray+MASAdditions.m */; }; + 5BB6B99986FD7111B3AEBE931C7F507B /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A9F390A64D12DF562DD8E40B2B719DA /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5BD5D9B8F61C124A62C75D9AC36A07BD /* MJRefreshTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2F253C004203C5AD94BC922622BC6C7 /* MJRefreshTrailer.m */; }; + 5C8279C226EB028B044C5A0F4AC5A91A /* SDAssociatedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E18CAF822E13B69105C0F262E830328C /* SDAssociatedObject.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 5D0DEC179A7B4143769C663082E2662A /* LKS_ExportManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CBEBBEC52C8B93FDED0B8E1E9DA1939 /* LKS_ExportManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5DCBA14510E091D6A1CE499B08B794B5 /* UIImage+Metadata.h in Headers */ = {isa = PBXBuildFile; fileRef = FDBEDF55963ED3DA043AEFB43D26551B /* UIImage+Metadata.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5DFCBADAC7D0FAC82C84A6C8E7BF1DA6 /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 6126457E7DC341A20EBE987BF5EFBC07 /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5E10328A83E05D0015D7459FAAEF121D /* SDGraphicsImageRenderer.h in Headers */ = {isa = PBXBuildFile; fileRef = 952BB65CA9AECB7DA59B00E72F6C9A3C /* SDGraphicsImageRenderer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F45735DF355530CC955066D3C007E19 /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 2260B16F1B02693319478DB4F54316E1 /* MASViewConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5FDC4239F7B651092BF582D0F460BAD4 /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = BE7D34E50E1D6D499D49FA99FCBA5B5A /* UIView+MJExtension.m */; }; + 6002CB94684D7C786700D2A294146AEC /* Color+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EFE803ED03E92B2B8EC05A0FC2130D3 /* Color+Lookin.m */; }; + 61461B0D9D7B81C3F8D24066D9A19DCE /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 794BDDB4DB750BE5FDB105674F99DBB6 /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61507E402F1F7C58BF119995A0479A22 /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = A96A8C288374B9AD37BBC7970C13C5E0 /* NSArray+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 616A8338C42FB01748DF1BDDA944858D /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 08B62FFF2C8CEBFA37C7AE6B1C443DF6 /* UIView+WebCache.m */; }; + 61857C821395B868C65A8FFE4DA1B4E3 /* MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 31473DD60D4305B7DA741C55F921ED28 /* MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61EAFBCDC83B2C603918B3C9D9A73A18 /* LookinConnectionAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C12A568F50663B0354C6A5190E85487 /* LookinConnectionAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 62FE895DF9D65A2955A275D909ECBE18 /* SDAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B9AE4382704B83CA411FAF665D77860 /* SDAnimatedImageView.m */; }; + 6525ECE1CAFC1259F9E6E5FDDE6CF218 /* UIVisualEffectView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0D003C4EDBE2F44CAFEC12C0CAF067 /* UIVisualEffectView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66B3C7D4B7582B30E58C5BC74A711BB8 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 391A041C36FE7567BD540C5CE3F4E52A /* PrivacyInfo.xcprivacy */; }; + 67178A8153B1A2F1D0D544B8093E23C5 /* SDAnimatedImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 914A62A570950E4D83A4EBE0062E5DB2 /* SDAnimatedImageView+WebCache.m */; }; + 676775CB29378BB6CA3CA5992E9C6A99 /* SDImageIOAnimatedCoderInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 8733305AC203407D393753CB75CDD02B /* SDImageIOAnimatedCoderInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 67FCC0F9B42B1C20A66E99A3D56BED18 /* LookinStaticAsyncUpdateTask.h in Headers */ = {isa = PBXBuildFile; fileRef = BAA8A1296FBF9048287BEE21F3B30624 /* LookinStaticAsyncUpdateTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 683D708C157C95ADB467BDD2230BD4E3 /* UITextField+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = EAB417A8F0BC17E30CAD95F001475DB1 /* UITextField+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 68C3E98F8B9D6035962F29AE025DA891 /* UIImage+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 36FE5D23FB2EF9BEB81A161D40B10342 /* UIImage+LookinServer.m */; }; + 69345CBCB31076EBF8A2C5885AF973AB /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = F8490E54D9DFBBD8DD3E31CF3784E7C5 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 694B8697854A776E32032999B2EF1FEA /* UIImage+Metadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BBC54810CE213EDD92DD4CE11A399A8 /* UIImage+Metadata.m */; }; + 6960FF2C4D61A09722930B33B1C7135D /* LKS_ObjectRegistry.m in Sources */ = {isa = PBXBuildFile; fileRef = 8678FFD5CB056455C0EB7778B170EAF6 /* LKS_ObjectRegistry.m */; }; + 69A06A02F52EB26259FAD1DF6B121BE1 /* SDCallbackQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 1AFF8D521A2F59A97942CA676EC5CD83 /* SDCallbackQueue.m */; }; + 69AB6A513D5F36D7360FEF4FDA1D60D0 /* UIView+WebCacheState.h in Headers */ = {isa = PBXBuildFile; fileRef = 7685E42E1081B69DDDDAF3A75A5FF5FB /* UIView+WebCacheState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69E353C99C6EEA3C93CCF2E526460B9D /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = BAE0475A033CEA3DA4EC7F34C84FAD33 /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 69F6E66A089C40FB1063DE15499BCFDE /* LKS_Helper.m in Sources */ = {isa = PBXBuildFile; fileRef = 16F8B2064DB9779ECB8F1B480CA181C3 /* LKS_Helper.m */; }; + 6A19379E3B0370EDA447743C9B1A1379 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 1929DED59BFBA00FD324FE4259681F17 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6B0978C9398336656EE309E62060AEAB /* SDImageAssetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F5CDEC5FA7978C383600FA2E6E0D6D6 /* SDImageAssetManager.m */; }; + 6B5C3592B5E911E833D067D0BC785B1A /* SDImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 81C1E48136A225905A857057912E10B9 /* SDImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6BC2A615678C8BAE9F34ABA68BFDEF78 /* LKS_AttrModificationPatchHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = B31031880490EAB03C52D376E4CAE128 /* LKS_AttrModificationPatchHandler.m */; }; + 6C57809DCEA4B6C0CA79918A69FD75DE /* LKS_ConnectionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F0B73A4BF6A04609C98D914ED5F371E /* LKS_ConnectionManager.m */; }; + 6C85CA8D99E50C137D056B6057DAC58A /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 224720D17C83C285A57A14AE3249983B /* UIRefreshControl+AFNetworking.m */; }; + 6CA0B4A9E7B2957063163BC673F355CD /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B32DD5288813818219EDE22D3B5F6ABF /* AFAutoPurgingImageCache.m */; }; + 6CE8701D161A4BC0860FAF3951762A34 /* LookinHierarchyFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F5560257C3ABE19E3CE945E12F1679A /* LookinHierarchyFile.m */; }; + 6DE6C7F0FA965828E4FCE687BF75FBBE /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4100F303D221E90FB5552B8BADAD3D1B /* MJRefreshAutoNormalFooter.m */; }; + 6E66305665DBCFBCF5B2480BF705D500 /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C6CCE875C9DB21D337D98676A6F0AF1 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6EFC0630CB2761A2B1FC47176CCD62D1 /* LookinCustomDisplayItemInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 385C18376D7D7314789C812587A3B1A6 /* LookinCustomDisplayItemInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6EFEEE3AE22E97DCEC4F5A3B88F56FC7 /* SDImageLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DA067C7872BCFB73BBE4FB45B149A91 /* SDImageLoader.m */; }; + 6F3637EE643EABB1DE9212EA68649A64 /* UIColor+SDHexString.m in Sources */ = {isa = PBXBuildFile; fileRef = 894200AB37ADDCF2E91E64941663B9CD /* UIColor+SDHexString.m */; }; + 7074EA7FCC90B4967A437F5C43496828 /* SDDisplayLink.h in Headers */ = {isa = PBXBuildFile; fileRef = DAEE6FA193471A73D57A74AA1324F822 /* SDDisplayLink.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 711D32EF4A9901567A488291603BF906 /* SDWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 59D4DABB171BC7F7B030B3ABE69E9840 /* SDWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 71538A1D21015F459964BA625D5EE90A /* NSObject+MJClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 40046208DED5819A627DD0A5AEAB8EB7 /* NSObject+MJClass.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 717F76926C7BCB5B10C3037AD9239084 /* SDImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E02261623C97F02C5D19CEDE7158EFF /* SDImageIOCoder.m */; }; + 71BEB1D9532900291A5A24B1C038516F /* UIColor+SDHexString.h in Headers */ = {isa = PBXBuildFile; fileRef = BD0670FBA78AEDAE39DCB4F35BE07F7F /* UIColor+SDHexString.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 71F2B8CBB99087F348C472230200586F /* SDGraphicsImageRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = C18D52D869C984C4D4DC6F98B352D5BF /* SDGraphicsImageRenderer.m */; }; + 724991CA89C46BAFBC08264D94D86484 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 08C30132ED5FABAEDF867C9B2581BAD8 /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 74ABF19BACB99F862DB62AA14508AFA0 /* LookinAttributesGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = 67D77E75D0263CDFA569481CA359AE73 /* LookinAttributesGroup.m */; }; + 74C474676C69A80BEC29B0F55FDF4D19 /* UIView+WebCacheState.m in Sources */ = {isa = PBXBuildFile; fileRef = E196407B2ACD1C9DA4C63CD0E4549377 /* UIView+WebCacheState.m */; }; + 74E069F8C9E22C0E37F261A5AB03A613 /* SDWebImageDownloaderConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C1934434C5B978B6111F3274360F19E /* SDWebImageDownloaderConfig.m */; }; + 752822FE3F5092322D18FEC4533B79A9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = DEC169158FF1164E7540D2EE5DE5BDF4 /* SDWebImageDownloader.m */; }; + 75771A97B77FA30A0175A81B480F80EF /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 55DC88EAB1707FF0C1E1A085175B04B7 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 772CF8E9CD02ECA4275B6173E2110E80 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = CA13C2A1D589388CC04DB0DE31AFECAE /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7873F2F89CD0A435FAB776BC27BFB56A /* MJExtension-MJExtension in Resources */ = {isa = PBXBuildFile; fileRef = 43EAAD2AB7E6B407E80E95F643F93D22 /* MJExtension-MJExtension */; }; - 7902D28FC9EF5AFEB452F508C7F266B1 /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0073EB182F9CC003B9721B132AC0082F /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7989A6E79BFA78440C39F568D972305C /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D2A2C7E78B1029B85E812A9CC5D4F58 /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7A4EB9ED5D4E03170FFE61FCB299687B /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = B20A669086F5506692603D3336437ABD /* SDAnimatedImagePlayer.m */; }; - 7C45DBA62EE045C4922404182F6393B8 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = 646B483EDAD1F8B7F96981EB5E185F2E /* SDWebImageError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C5505A2D3F2A697A5F324787061F4B7 /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AC074355067D4E88EB993DD28E44948 /* MASConstraint+Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7F10C0D094C74F2FA4CD38C7FD77B0A8 /* WKWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 71A4B6E144674403F50435C67561B1BB /* WKWebView+AFNetworking.m */; }; - 7F886FC2763F0BF1625A24EE4F94C04D /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 0044E51493E8CC5F8C46E1EC18F97722 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7FA8C78DB021A7731D30D80C102DE042 /* NSObject+MJKeyValue.m in Sources */ = {isa = PBXBuildFile; fileRef = C23DF793769699E27A02E0B30615EF6F /* NSObject+MJKeyValue.m */; }; - 7FF8A56511E71D6FEC966BF9FEE135B5 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D875CFB5AA1591E80BD3A95A94255894 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 813BE4C96A6D39C13EC50C6CD164F0AF /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = F9CEF650A6E8658ECF7704A7EE2E7452 /* MASConstraintMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 81A5635CEA2AD9623E30CAE9AFC3BF65 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E459098B6FF83AA9172F97696B64090 /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 83530BF68848CD2C4A79A1FD69B304A5 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 42FE2C6A18379D9944FBBA606FB88133 /* SDImageGIFCoder.m */; }; + 78A3C3994AFFC6A2D4970AEB6D797CE5 /* LKS_HierarchyDetailsHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = A746694BCB1409FC0B6514429221C198 /* LKS_HierarchyDetailsHandler.m */; }; + 7902D28FC9EF5AFEB452F508C7F266B1 /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 448429D0C0BEB975134960D1DC282A12 /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7989A6E79BFA78440C39F568D972305C /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 48F7FA6256DAD683842D571B6AF77F51 /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7A4EB9ED5D4E03170FFE61FCB299687B /* SDAnimatedImagePlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 20ABB6114972E81639D089CAB0FCFD92 /* SDAnimatedImagePlayer.m */; }; + 7C45DBA62EE045C4922404182F6393B8 /* SDWebImageError.h in Headers */ = {isa = PBXBuildFile; fileRef = 355BA71055E49EFFC9C986A110289CEC /* SDWebImageError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C53FB6BBB0CBAA879F1603B0FEDB80B /* LookinAttributesSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 42516AE5009205BBCFD63441B614A7E7 /* LookinAttributesSection.m */; }; + 7C5505A2D3F2A697A5F324787061F4B7 /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C37FCE816213CE06FD25D1DD57DD164 /* MASConstraint+Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C8782A3078662BC2EF639A9608A2C82 /* LKS_InbuiltAttrModificationHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 354321D8D4D2663CC74E3C8C7010C963 /* LKS_InbuiltAttrModificationHandler.m */; }; + 7D736CE5AD0A987D2A7D2FD72E31BF41 /* CALayer+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = DF90BC0D1488FDD0AE7DD2D9DBE61B6A /* CALayer+LookinServer.m */; }; + 7E4F0978B25350B2B28678A0BE7B3785 /* LKS_HierarchyDisplayItemsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 70BBFC2B49529B31B7D32BD0FAB0EADF /* LKS_HierarchyDisplayItemsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E8A564A958AF81E5F63F34B8E550E58 /* LookinAttributeModification.h in Headers */ = {isa = PBXBuildFile; fileRef = 30738EF48289437474189DD2B1C18680 /* LookinAttributeModification.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7F10C0D094C74F2FA4CD38C7FD77B0A8 /* WKWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 63FEF4A55AABED2088DA6B42E280D2B7 /* WKWebView+AFNetworking.m */; }; + 7F886FC2763F0BF1625A24EE4F94C04D /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = CFC090EF901F43F9185E78D093B9E0F2 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7FA8C78DB021A7731D30D80C102DE042 /* NSObject+MJKeyValue.m in Sources */ = {isa = PBXBuildFile; fileRef = CD45FF183BCDF552AE5AAE1E6DCEF8B4 /* NSObject+MJKeyValue.m */; }; + 7FF8A56511E71D6FEC966BF9FEE135B5 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AEC89E1DB573A8895DAE690A3E4E531 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 810C8D7902163BBA0185A4A112B2DFD6 /* LKS_TraceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F10AD41ECBDA2E31F4D0354293FF10D /* LKS_TraceManager.m */; }; + 813BE4C96A6D39C13EC50C6CD164F0AF /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 129F6A10DC8AFBD284583E4CF5ED5793 /* MASConstraintMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 81A5635CEA2AD9623E30CAE9AFC3BF65 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 84A09578F37B017034C6F7BCB8F8E853 /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 821FF6B43F7ADAB6B60459D2966B33CB /* CALayer+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = F29A616129C4E4311BF6B3256DB728C2 /* CALayer+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83530BF68848CD2C4A79A1FD69B304A5 /* SDImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 46ABF3C07C780ABA5090E971A8BA3659 /* SDImageGIFCoder.m */; }; 83A4F2816C1B3F072E1A26A34C3BC4AC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; 8414CFEEB64ACA817EB88D2FEADDA3B3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; - 854807558DCB972EDDFC1D00032BA6E4 /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 8A926EA8E3863425810DDC585C464587 /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 85AB23275E9D19394969235E5DC2300E /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = F74EE2D92793519D84E4B72CD6AB0C63 /* MJRefreshHeader.m */; }; - 85C0B4EE334B9972299E62DE61A4BB56 /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A1ECACF57484B51D17735566ED038104 /* SDImageLoadersManager.m */; }; - 860CB3A5D2E13B946CD2EFB7F749C4CF /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 29DD9709CE876731037B630B8F1370DA /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 864972FB0DF4B464B1B505AA5F788E91 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = 06A2AED69705719F9BEBAEDC9D1D18C6 /* SDInternalMacros.m */; }; - 88473AE7C22F952DACB39FA0758D1624 /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E97276CEE18BF4611E1C1D42736F6EAB /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8872BEB0954C0254A792469F4DBC9891 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = CCDB436E5F20F839485E728CEF386187 /* MJRefreshAutoStateFooter.m */; }; - 88A23DF6F5638AC66C28C4102824E8B5 /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C040DD9465E298ACD105143A3265009 /* NSImage+Compatibility.m */; }; - 8AF38EDB1E9BF0D334AEB23C488870B8 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = DDC08D9E69C76309DA07F96C62824633 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8C6C7E25C5A24C936F81823978190E96 /* ViewController+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EB624EDC7B2F6F92D5F6AEF8AAA4356 /* ViewController+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8D8AD606ECD8E1F247965CD43956D412 /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6FBF6EC0693B752A91650764E380C8 /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8FF7B6477BFA6E6ABA168E1417291D5F /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F7E589343BFFDCABC0FCDF6E321CDA2 /* MASCompositeConstraint.m */; }; - 906DCE66CD5BD236081D468616199BB7 /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = ADF1D8C19CC2D66E65B4B1746316FFC5 /* SDWebImageOptionsProcessor.m */; }; - 91AAF555B286FBF53E4F98D092B406BD /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 755B7205B482C6B79DEAE02978E7FD20 /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 91E8B94F8E02ABF5197DF5AE7D0B3934 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = 29834704EC1453F0ACBDF5CAA435E7B0 /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 928371B066E1211CE87089668D5BCB4C /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DFD30C63C15966EA8BF3CAD55EB97F8 /* SDDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9345137ED10358B60E37D05FB6165759 /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = DBFD2ECA52ECDAAA78246FE8B02312A9 /* SDFileAttributeHelper.m */; }; - 9358FC6C6DA728AEE250D8E7DD236946 /* MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D8FF130378AA0390E3754AB93673319 /* MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 955B87902E039163281C4F47C95DB851 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 14C952AD321D89B78D085CA0FBC817D9 /* MJRefreshBackNormalFooter.m */; }; - 96E97174F4614FFA0649085022CB4AFE /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F1A2FD98EEB8019052FBD5528585C9 /* SDWebImage-dummy.m */; }; - 97235408E59E16C18B6BDA1D29E1CB26 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 09C03827CE30DECF1B8884688B6651D8 /* SDWebImageManager.m */; }; - 97385A64CA020489951EF769392C6DCF /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D5935FEEF657D48BF93BE04A41CF816 /* UIView+WebCacheOperation.m */; }; - 9A7FB1E975A5955C896E6B195C521804 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 087882A7DEA5E7EECA5B73EB89E95C00 /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9B3420DEB8A0CCB9E1241A669AEFCA8E /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CCDC185ACCEFD6ACB87234F081FC1A1 /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9B9343E8599EE5196BA75E842DCB48B7 /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A46DCA8F7BDEE6453116CAF6CBBAC40 /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 9CE425B89294BE2C13E70A86E75B15CF /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = A113F5BE027C0A2BC1CC3F420069F969 /* SDDiskCache.m */; }; - 9D422527A25BAE6A207DEFE11958ABBC /* AFCompatibilityMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B8247E0ADA45F5408F3DE8313900894 /* AFCompatibilityMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9DF446F8CA5BC4D4098766EC9063012C /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 33152C1C1E9FE19D1E9C8D8BF0C963DA /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A078A275FFFA48D620074790DA3CA6CE /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = D513B9FE4981B810C5EBD34AAD6D0CD7 /* MJRefreshStateHeader.m */; }; - A0E0DC76F51300E7EB1EBA5492DE854D /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = AF94F3E24B633799AB0B2B75B193A4F3 /* UIImageView+AFNetworking.m */; }; - A1560247914C760D9EE5F7A2392CC06C /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 429C09B93893D24656048D336CE95D59 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A1DC9EFDF50DF0EAF24D9D7C219AD2C1 /* NSObject+MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C8185E7D34531047F63FFFBB2C6C9D3 /* NSObject+MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A1E44277704AD68E867FD7C955A6632D /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 32EACA7B3E95EF3C511EEAED34B5C23A /* MJRefreshBackGifFooter.m */; }; + 854807558DCB972EDDFC1D00032BA6E4 /* SDWebImageDownloaderConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CD67E822AFAF2390FFDE37D7406AF22 /* SDWebImageDownloaderConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85AB23275E9D19394969235E5DC2300E /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE1FEDC0E884357F32741CD751E4851 /* MJRefreshHeader.m */; }; + 85BB8B4B5C29C5EEC52282F33A4CAF23 /* LookinCustomAttrModification.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E29830F3F03359FA3D6E5051EA37BE8 /* LookinCustomAttrModification.m */; }; + 85C0B4EE334B9972299E62DE61A4BB56 /* SDImageLoadersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9232737E755EBDB7E66DB0029B1DF11C /* SDImageLoadersManager.m */; }; + 860CB3A5D2E13B946CD2EFB7F749C4CF /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FB34E0E78E7FB13DDF20F067BE65187 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 864972FB0DF4B464B1B505AA5F788E91 /* SDInternalMacros.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D85FFA2C73630F2AF77342E129DC16E /* SDInternalMacros.m */; }; + 88473AE7C22F952DACB39FA0758D1624 /* SDMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F796365C18A92736860BB37F7E034373 /* SDMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8872BEB0954C0254A792469F4DBC9891 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0628FA5908F18B74E57C187734650C8B /* MJRefreshAutoStateFooter.m */; }; + 88A23DF6F5638AC66C28C4102824E8B5 /* NSImage+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D13E946B329A0E46666436B3BF35A5B /* NSImage+Compatibility.m */; }; + 89B88FAD396608AAA9F935E471BB3CB9 /* LKS_HierarchyDetailsHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 278B371619258173DE9D9B0FFA6BA140 /* LKS_HierarchyDetailsHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 89EAB8D0452D0E2114ED971B10D98CC3 /* LKS_HierarchyDisplayItemsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D2CD83C67F05747C39D88CED9A5DDBC /* LKS_HierarchyDisplayItemsMaker.m */; }; + 8A256CA266FB314BBD4DB2287DAEF247 /* LookinAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = D59346EAB789EE81F0825892B87F78E7 /* LookinAttribute.m */; }; + 8AF38EDB1E9BF0D334AEB23C488870B8 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = A091B8685CFF858DF1478D74A0602F32 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8C6C7E25C5A24C936F81823978190E96 /* ViewController+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 998EEC31A73E8747C2ACCB121631445C /* ViewController+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8D8AD606ECD8E1F247965CD43956D412 /* UIImage+Transform.h in Headers */ = {isa = PBXBuildFile; fileRef = DB71828FA23A5A6DCB9C54657F7D6D99 /* UIImage+Transform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8FF7B6477BFA6E6ABA168E1417291D5F /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = C46B37904E13A5F8183B10AAE427B26E /* MASCompositeConstraint.m */; }; + 906DCE66CD5BD236081D468616199BB7 /* SDWebImageOptionsProcessor.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EA9A6385695AF05307948AD57B725B2 /* SDWebImageOptionsProcessor.m */; }; + 91AAF555B286FBF53E4F98D092B406BD /* SDWebImageTransitionInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = AB64BF3D27891743565124E885679AE0 /* SDWebImageTransitionInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 91E8B94F8E02ABF5197DF5AE7D0B3934 /* SDWebImageDownloaderDecryptor.h in Headers */ = {isa = PBXBuildFile; fileRef = C41A5AC3D89258F73DB096AF44609EDD /* SDWebImageDownloaderDecryptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 928371B066E1211CE87089668D5BCB4C /* SDDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 83114C8E20B9B217E7EA43F9F77CC974 /* SDDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 928A1ED0692DF0229F66A87135F93F2A /* LKS_CustomAttrModificationHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = DF4971334F726E1A57CC0CC51C6DC727 /* LKS_CustomAttrModificationHandler.m */; }; + 9345137ED10358B60E37D05FB6165759 /* SDFileAttributeHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DF2ECF78EA0E6413FB6512AE11F68B1 /* SDFileAttributeHelper.m */; }; + 9358FC6C6DA728AEE250D8E7DD236946 /* MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 350E7CC7CBBC3075A763B5DD04615877 /* MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 93E8C78EAE0B7613201813966B8E04E2 /* Image+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = B459A7146BCDCE5DF7BCC9B1C7AF4030 /* Image+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 955B87902E039163281C4F47C95DB851 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F6F82FEF48E6F695530EC6293A66090 /* MJRefreshBackNormalFooter.m */; }; + 96E97174F4614FFA0649085022CB4AFE /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C18F32B7C3DBF2A6BE1D3D59B7EA3A68 /* SDWebImage-dummy.m */; }; + 97235408E59E16C18B6BDA1D29E1CB26 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 41DA7358EB7CB91409C1C9F11F5C3EBA /* SDWebImageManager.m */; }; + 97385A64CA020489951EF769392C6DCF /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = EEE70C2EB2F346F05C3482825CA278CA /* UIView+WebCacheOperation.m */; }; + 9887678D7D6BC165694560D92AF2C31A /* LookinConnectionResponseAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = E2F4A91F369E1A8FB89246BE23537163 /* LookinConnectionResponseAttachment.m */; }; + 98AB6B8EB7FF096BCE87488C5AB3DF1C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; + 9A7FB1E975A5955C896E6B195C521804 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = B9BCB94F8C306615CCBE9A09967DBEE0 /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9A89C16038149623A1DF06D47E7F953A /* LookinStaticAsyncUpdateTask.m in Sources */ = {isa = PBXBuildFile; fileRef = D0A854986C4B29F4B4CD59A9183BF626 /* LookinStaticAsyncUpdateTask.m */; }; + 9B06400877E40C173F5A1C9761F288CB /* UITextView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F3E14867B8E7450AEDEDA2617BA5FB2 /* UITextView+LookinServer.m */; }; + 9B1EF09A8A473D92C1258B00791BF5F0 /* UIView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BD084A818C3461AD1629F9205885E5E /* UIView+LookinServer.m */; }; + 9B3420DEB8A0CCB9E1241A669AEFCA8E /* SDAnimatedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BAA877091312263E9AF72D142E48EB04 /* SDAnimatedImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9B9343E8599EE5196BA75E842DCB48B7 /* NSBezierPath+SDRoundedCorners.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D2FE77EBB4DA88368FEE0FB24854873 /* NSBezierPath+SDRoundedCorners.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 9CE425B89294BE2C13E70A86E75B15CF /* SDDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 7811748FB18DB56B40AF1874A5426811 /* SDDiskCache.m */; }; + 9D422527A25BAE6A207DEFE11958ABBC /* AFCompatibilityMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = A4866C2E69C224CD146F1EEB9F3528FD /* AFCompatibilityMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DDDCFC08B54A61C519DA78F94464E6B /* LookinHierarchyInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B52C45975B621E9B4889D036BAA8D0F /* LookinHierarchyInfo.m */; }; + 9DF446F8CA5BC4D4098766EC9063012C /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E632E9EC94233CBF7A6E9F6C8A0F560 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9DFFD4780CA32B8E53D9F4FBC8B3F5AC /* LookinAttrIdentifiers.h in Headers */ = {isa = PBXBuildFile; fileRef = E5BA3AFAF372382F326FE19156B50F24 /* LookinAttrIdentifiers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9E3C5CB1C97B2ED16218956999BFF7AC /* LookinTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 14E874114A831512644E2A5EB09CD1A2 /* LookinTuple.m */; }; + 9E6B00AF2ECE462D4D3C42AFC02F2AD7 /* LookinEventHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 920C3A261F36A2C648F90937F7072D84 /* LookinEventHandler.m */; }; + 9EBA682DA814406E9E5EF300587AF341 /* LookinAutoLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = AD02773A95705584AC13BC9360993045 /* LookinAutoLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9F89DCAA4092F3897E43E89842069A26 /* LKS_AttrModificationPatchHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 521CE5DFBD4FA9519A07333FD40087EE /* LKS_AttrModificationPatchHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9FB234EB4D8B5BCC699DB491E204594F /* LKS_GestureTargetActionsSearcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 26F0B678A641C41764C7544218AD9F83 /* LKS_GestureTargetActionsSearcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A078A275FFFA48D620074790DA3CA6CE /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = FA6D90B9C25635B7DCB5D4E969BAB85B /* MJRefreshStateHeader.m */; }; + A0E0DC76F51300E7EB1EBA5492DE854D /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EFA5E35451613555520D318C62A6A0D /* UIImageView+AFNetworking.m */; }; + A1560247914C760D9EE5F7A2392CC06C /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 36D5DF0AB990D1F11E146EA73B6AFFD5 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1ACD509069144C27542774A41FE0243 /* UITableView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CA47DE0773F00D68874CB81729C4ED5 /* UITableView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1DC9EFDF50DF0EAF24D9D7C219AD2C1 /* NSObject+MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D1AE46DAE9B08CD36A2DEBEF9E850F /* NSObject+MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1E44277704AD68E867FD7C955A6632D /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = D93569B386C3B62D7671951E2F3E8129 /* MJRefreshBackGifFooter.m */; }; + A2E11C19FD9FEDCF6384715C1F12D4C0 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8F79F17D5D8DC4891FB5EBCEF14AED90 /* PrivacyInfo.xcprivacy */; }; A3148D9EB39C7BFAF4F85E3378F3EF80 /* Pods-CustomKeyboard-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CB13D51E717D347023EEB57263E3072 /* Pods-CustomKeyboard-dummy.m */; }; - A3EA39A13714B3103B82F4066A642F53 /* MJExtensionConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D68500D4C2F7DB8B114E62F888BDD85 /* MJExtensionConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A839428F403C52D8AA3466B65E20C27A /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 11F1BA773620708277D240BE4CD304E4 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A86CC1AFDFDD692DC4EE66F57C0F39E6 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AF059A8B1C2B3EE76BCDE329D0C926E /* UIScrollView+MJRefresh.m */; }; - A92AB5E65CA85947368E46E6627F1BFB /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 4638EBD469283AF4DC5CBD3CE927D254 /* UIButton+WebCache.m */; }; - A9A49E4A3BE8882F60DF32BAF39DE191 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 02379CD5F0D938EE2DBABC8871CB17E5 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AA1EA8F0F0470F1596B1FFA58ABF3375 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 825CA08D9974B4E876CAFA68A0F53F93 /* SDWebImageDownloaderOperation.m */; }; - ABCB80C4813C849FC93D57676820C907 /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 97F65BC08A412ED6706647722A834532 /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC14E56ECA7A4980A8E1CA68E800B12C /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DC8E0CC70A7B84D1A1E1FAAF5AF5A4D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC710813CB6A1DAEEE45914402F864D2 /* MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 87A1195922F05E5D23FF9A3C4509A854 /* MJProperty.m */; }; - AE7B02645B8F769CA5F215EE8F7CC5B0 /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 88799C33D6D0AAE2D395A1496F3A9E5D /* View+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AF1A6353DEDBE196A10C8897F94DDA8E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 94F556719E0728E491D5BDF953E9A668 /* PrivacyInfo.xcprivacy */; }; - B030B558BE97E0225652EFB8C8FA431F /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 246841FAF82F0BA847818A9594B81CCB /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B09F08548ACA8379445F6525011EE219 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B30FE27ADA94703A3F06804277A5C0 /* MJRefreshBackStateFooter.m */; }; - B2704AFFC5CC053154839DB44924D255 /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = F62E78180455B791A034CFBD4F4CE6A3 /* SDImageCoderHelper.m */; }; - B331CE2D3DEB461E738B886086A365F9 /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = 34CEE2DA708B82493E132F274E2E9493 /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B48A975992E58328254C494F133DE467 /* NSObject+MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AFCF05D160C4A925AEC624ED1CD826F /* NSObject+MJProperty.m */; }; - B4F231C5CBAB3D4A184699D0066E0E83 /* SDImageAWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7315702A1F332F57A8765F720EE5B18F /* SDImageAWebPCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B59E60FBC9665FC1061B88B8E6FD9FAF /* Masonry-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 92D14A3D3FA826806436A8CFCBD915DA /* Masonry-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B5AF87C11A465F666473F6191D173905 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AED6E178EFE04C18394DE24CF7E24E01 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B66356D4E7E43B3D15324569AA7EBB05 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = A1D6DA8B66269F171ED8918C664075F4 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B680C2604BD8BC9644AE7C67BC46B9BB /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 52AD4C798F619843C6425BB666EE43A0 /* MASLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B741DBE2A466E6211F879EF997D9322D /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DBEED872AB83B013F34A14A1823F4820 /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B95C63A039D9D08896421291DEBD3AEB /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = F7E0DB23007E49794165F74548446C13 /* SDWebImageCacheKeyFilter.m */; }; - BA904ABA8ED36CC4E5EB2B2004CA1F18 /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 104166B53DA0CBE95AF12518EB609B7A /* MASCompositeConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BACAA91A92F35CD7E7795232A83F21D1 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 859BA7601F83844D2D2ABC395E386663 /* AFNetworkActivityIndicatorManager.m */; }; - BADA31750A2136D073EDA4461DBE1EEA /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E2F76F628A20AA296860E039C6A51DE /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BC2F9B1D6986FEB23B4FB1288B512538 /* MJRefreshNormalTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 73D1ED74B2085AA85B8213943DE4AD83 /* MJRefreshNormalTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BC5458210A973BC7A29D1F45D458A14B /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 14D8DE9600B7E469FA4A83E84C149E08 /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCDC1E1D46DD124B5726A064D2EE66A3 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = F68941BD4F4913D60B00D4A8F049112A /* UIImage+MultiFormat.m */; }; - BCEFDE57BB0E0B36731C8D39FFA1BE2C /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 969BDA148FEBCD19E1B7701E7F70E539 /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCFA1CA56CA625A754714006E0032750 /* Pods-keyBoard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D8E1EB42D41EA6B94901E5B68C9011 /* Pods-keyBoard-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BD30193C1E3D7B1F17B1B1F3F08BE655 /* UICollectionViewLayout+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC0677B77FA6DFFDE007551F1660B1E /* UICollectionViewLayout+MJRefresh.m */; }; - BDBE494BAC544843982C3CA96A6C41DD /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 81D5F6E26D64BB94294CEC208FAEEBE2 /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF0C3D2782FE1425C2F1F8827132A94B /* MJFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AFFFE7105483F8A94BFD883AD56221D /* MJFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF22D137EF6324675FA50080C5D93C00 /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 93EB15003C1E2452E5C21AD7FF38A39D /* NSArray+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C0D7926E41A294ACA98D7B033B283919 /* WKWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E3334C24AC0A37A21A6D9B9ECA94AB2 /* WKWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C1DD8C6A64F948E4C53560C76B995DA4 /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AACAEAAD31005B66599055215ADA658 /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C2068AEACC2D9C7F1FFE41AA25B12A68 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F58F61640AAFD16139A83CC4EA55B1D /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C2840BF1950FF7EE2DCD6D55F768A49C /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 24F6DCD61BBDE3823CE167416B3799D1 /* UIImage+GIF.m */; }; - C2FE60A10C792613E45031AE6E851ECB /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = D28BB6B7AF2BC47AA045CB28AE578B56 /* MASViewConstraint.m */; }; - C60DB44F719853DE3B7157960DAF9270 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = FB988F307C9B24539A026F84144A0402 /* MJRefreshComponent.m */; }; - C6A100159974349FEAAC99B82BE0F872 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 50DC89AF710F42BFF3D4C048EFAC8BB7 /* SDImageLoader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C857B8D2D0BAA5A8A764F9E1C4B85807 /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 33EBB93597383ED9EEA18C0A9BCE3B84 /* ViewController+MASAdditions.m */; }; - C8EC35DFB0945DBE2F2FF9ECFE6D9711 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = DE966A3AAABAC126A570DC36F74E07AE /* NSLayoutConstraint+MASDebugAdditions.m */; }; - C93E972E75F84674690300123984EC43 /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C838D64A8654D1DDA15A6DDC98360A9 /* SDAssociatedObject.m */; }; - C9E19D164C26414115CC969ED9A303C1 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 047628989EB45DFAC6DD4B6DDC61C1D7 /* MASLayoutConstraint.m */; }; - CA1E0DCDF679EA2DE2ED0915426E1D04 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 93A3B9C517383784D38DA222632F5FFB /* SDWeakProxy.m */; }; - CFF8D1A5E4C2097EF05E1021FE112886 /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FC44A2AEE9BAA02332A14994FF0E2E0 /* SDWebImageIndicator.m */; }; - D06BB547D59D183FD1DDD84DEBAC9EE8 /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C4CAA32BF7068345545D717BAAF7069 /* SDWebImageCacheSerializer.m */; }; - D2AF9A7FD73B95960FDA4FD06C4BED08 /* NSObject+MJKeyValue.h in Headers */ = {isa = PBXBuildFile; fileRef = D915858ABB2794C80C0D2328483F75C4 /* NSObject+MJKeyValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D2CD8848F856EC9942A76610AAE66F0A /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FF09658FCA5560C3552AF5B4B7E7C6ED /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D5C046C46961BE465293625D6B870620 /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CC69297E62F679246B8FE5B49D774CF4 /* AFNetworking-dummy.m */; }; - D62A672EEB252581BD972DDA862BE1DD /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 70330531B46EEB4398625F2AFC6683E5 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D662C83ECE8BEDA5FFB52F3575CA3E1A /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D1581B25C7E0154AE410EBB56CE516 /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A324722BA42F21E98F158EA6C133D715 /* LookinServerDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 720CFE8548CD7904294866C990785774 /* LookinServerDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A3EA39A13714B3103B82F4066A642F53 /* MJExtensionConst.h in Headers */ = {isa = PBXBuildFile; fileRef = F57983A047506181C8E67291514049B6 /* MJExtensionConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6728DA26A7C457B78A7A3CCFA9D9A10 /* UILabel+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = F6A0C7E14AE1D6B963FB5E50B04CC71C /* UILabel+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6B2B022993BBC55550CFBB0A0C78209 /* LookinConnectionAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 756C6AB59627E794C95106401B7E91D7 /* LookinConnectionAttachment.m */; }; + A839428F403C52D8AA3466B65E20C27A /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B91F70B44F5438EBAEF2ED0F5B181C54 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A86CC1AFDFDD692DC4EE66F57C0F39E6 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 3757A445F05F370F80774CD721B3AFF1 /* UIScrollView+MJRefresh.m */; }; + A8AD2AE9695630E93DE504211EBAFBF1 /* LKS_CustomDisplayItemsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AE4DE6EA99247529F51CDC210E1B91A /* LKS_CustomDisplayItemsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A92AB5E65CA85947368E46E6627F1BFB /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 851E0EFD5B18B0AC4C806169B724026F /* UIButton+WebCache.m */; }; + A93BA1C5A4FFEF3ACF371690485A2703 /* NSObject+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = B06A69DA2C8CDCF6F06CD519FC21C514 /* NSObject+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A9609EEBDD5FD40292925E80ED84D5DF /* LookinServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5630EC1015102C0EF4C6B8B7664C338C /* LookinServer-dummy.m */; }; + A9A49E4A3BE8882F60DF32BAF39DE191 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 64CC1902F2F86AF9B5F4F7FBCDA7C2AE /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A9BEDE2ADF9D1E0D0D1A241806A1A486 /* LKSConfigManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EF4826C096FF849D4E369D7C176C05C8 /* LKSConfigManager.m */; }; + AA1EA8F0F0470F1596B1FFA58ABF3375 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 181E31AA047EF4D7C7D768D6E0745646 /* SDWebImageDownloaderOperation.m */; }; + ABCB80C4813C849FC93D57676820C907 /* SDImageCacheDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = CCDF9A8326ECA9F0B261F893178A7421 /* SDImageCacheDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AC14E56ECA7A4980A8E1CA68E800B12C /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = E416FB13B20E56ABB8795CB5D98D23FE /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AC710813CB6A1DAEEE45914402F864D2 /* MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = AAACEE0E3B6D6F380E6DC6F387DAC504 /* MJProperty.m */; }; + AE69A3B75BEEB9E2C54168BF0C502BC6 /* LKS_RequestHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DDE49FB8DD3D0926CB71DCCB48897F7 /* LKS_RequestHandler.m */; }; + AE7B02645B8F769CA5F215EE8F7CC5B0 /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 013ECA5DD2CB8359B649081FDA62389D /* View+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AF185CDCA462AD6450543676951C82F9 /* LKS_ObjectRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 14FD02BD7DB8AC12A9596FD7D10BA589 /* LKS_ObjectRegistry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AFDC0B8255B2F3CED8E609F8A3BD1CDB /* LKS_AttrGroupsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFFAF1ADD68F376CCB4269DAA28E457 /* LKS_AttrGroupsMaker.m */; }; + B030B558BE97E0225652EFB8C8FA431F /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 081967E91FB2135CDDE098522CC1F303 /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B09F08548ACA8379445F6525011EE219 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = C87B486F0C017D80D893AB2194260F03 /* MJRefreshBackStateFooter.m */; }; + B2704AFFC5CC053154839DB44924D255 /* SDImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DC988FE587011D33A8D968D09574375 /* SDImageCoderHelper.m */; }; + B2B5444DFE63D2835A7561C1D64C9344 /* LKS_CustomAttrModificationHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AE82ACD8457FC1F884B6922FEF63CB6 /* LKS_CustomAttrModificationHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B2BC43DEC8DE2B9234693FE3782AB76C /* LKSConfigManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 97A941D106C85302397B5B03771DB340 /* LKSConfigManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B2C76331039F670E41588BB3D1F50E14 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; + B331CE2D3DEB461E738B886086A365F9 /* SDImageGraphics.h in Headers */ = {isa = PBXBuildFile; fileRef = 668C50C1ADE5AD0F61431E1CC0366B5C /* SDImageGraphics.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B48A975992E58328254C494F133DE467 /* NSObject+MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 227C689732CBCD5ED2D9E1142E9BA6B7 /* NSObject+MJProperty.m */; }; + B4F231C5CBAB3D4A184699D0066E0E83 /* SDImageAWebPCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 452A668763CDF94BDE8E00DEBEA3CBFD /* SDImageAWebPCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B565C08CE947CF591B1D3582272D5E1D /* LKS_CustomAttrSetterManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 804BF40AEA86A02553D19951CB451042 /* LKS_CustomAttrSetterManager.m */; }; + B59E60FBC9665FC1061B88B8E6FD9FAF /* Masonry-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A1675DE403D3695A8253D64170EAD85A /* Masonry-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B5AF87C11A465F666473F6191D173905 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 8624FE76D62EAB39E53F7E4261584FC5 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B5C521FFB8E09DFE348238E21556842F /* UILabel+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = E2EB5B7DFED85087E5CCAA7F25F7F6DD /* UILabel+LookinServer.m */; }; + B66356D4E7E43B3D15324569AA7EBB05 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = F8A18ADE74F68133570FA542FF4A303C /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B680C2604BD8BC9644AE7C67BC46B9BB /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = B583F247128E47740F940599B8E5B36A /* MASLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B741DBE2A466E6211F879EF997D9322D /* SDImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D06BA623349F0685BBCB4816BDDA9DEF /* SDImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B79864F972C51037B350802D8CD48024 /* LKS_GestureTargetActionsSearcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 45E4723FBE71FF9ADE4AB2F76D2DA14F /* LKS_GestureTargetActionsSearcher.m */; }; + B81566F19789EBD9BE2714E2A6059D36 /* LookinDisplayItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 70DF286705B2D1D7B78C7AA955BA2606 /* LookinDisplayItem.m */; }; + B95C63A039D9D08896421291DEBD3AEB /* SDWebImageCacheKeyFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C09DB4E8BAF5800F087352EF2C4F48 /* SDWebImageCacheKeyFilter.m */; }; + BA904ABA8ED36CC4E5EB2B2004CA1F18 /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = D713378F0FFD12D4CD2ACE135B2C8D35 /* MASCompositeConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BACAA91A92F35CD7E7795232A83F21D1 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F82FBA430AAB56CCE50AA74B7449A4 /* AFNetworkActivityIndicatorManager.m */; }; + BADA31750A2136D073EDA4461DBE1EEA /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3914EA51A6CABD3AB197013F9FA20C33 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BBA61EF31BFDFA6FCA34DC4EBE6E1D9A /* NSString+Lookin.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FDFFDC449C8F153A09137D6EAAD4CC /* NSString+Lookin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BBF5FDA7D647517E2F904FE8E5596D96 /* LKS_AttrGroupsMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = F9400AD97C7D390C0022619C51584770 /* LKS_AttrGroupsMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC2F9B1D6986FEB23B4FB1288B512538 /* MJRefreshNormalTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FF6894CC33A836717208C1596FFDF36 /* MJRefreshNormalTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC5458210A973BC7A29D1F45D458A14B /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EA0D7B3EBDB71C539711D5E96D0216FA /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BC7A1933CCF40C3C5E2E4A70AD2D0657 /* LookinDisplayItemDetail.m in Sources */ = {isa = PBXBuildFile; fileRef = 424E1CD2A8804E0A1724D8EADA301314 /* LookinDisplayItemDetail.m */; }; + BCDC1E1D46DD124B5726A064D2EE66A3 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A46011226423766627FE02357AA5C78 /* UIImage+MultiFormat.m */; }; + BCEFDE57BB0E0B36731C8D39FFA1BE2C /* SDWebImageDownloaderRequestModifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 44A4252246EC49F62F0C25505E934B16 /* SDWebImageDownloaderRequestModifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD30193C1E3D7B1F17B1B1F3F08BE655 /* UICollectionViewLayout+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 51A28B0F46A9250A309DFBCF68529D46 /* UICollectionViewLayout+MJRefresh.m */; }; + BDBE494BAC544843982C3CA96A6C41DD /* SDAnimatedImagePlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = D8940A99ECE28941C56D9A97864AE4E0 /* SDAnimatedImagePlayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF0C3D2782FE1425C2F1F8827132A94B /* MJFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A632FE340768C393869A04A3FA157E8 /* MJFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF22D137EF6324675FA50080C5D93C00 /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D1B209E057B32F0F386DB8EED983370 /* NSArray+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BFAC671767912906E90060B0F4BED5FB /* LookinCustomAttrModification.h in Headers */ = {isa = PBXBuildFile; fileRef = 564C2CDD0AE1B9DE54315A467EA6BBB5 /* LookinCustomAttrModification.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0D7926E41A294ACA98D7B033B283919 /* WKWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = C4B5B9DB7663D1E0C914308BB2C0686C /* WKWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1D9802BE2A6410FFDFB1650FB9BA317 /* LookinDisplayItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 16AD6D30F07932689DDECD4AC477E876 /* LookinDisplayItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1DD8C6A64F948E4C53560C76B995DA4 /* SDAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 38C5D9064023A870F25FD047E1B0F535 /* SDAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C2033A68F13923BF9B3EE19F39FC1411 /* UIColor+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = BDF9EAF852B79ED40C1097348925D782 /* UIColor+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C2068AEACC2D9C7F1FFE41AA25B12A68 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AF531BDD77E2C93F3A9EB19FC90C677 /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C2840BF1950FF7EE2DCD6D55F768A49C /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = FDAB549AD6E4F2874D1E546728D0C1EE /* UIImage+GIF.m */; }; + C2FE60A10C792613E45031AE6E851ECB /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = B9029F64CB1CB96A634BFF0BEE465441 /* MASViewConstraint.m */; }; + C4CC01ED368863C6E3220988FBC6CEFB /* LKS_CustomAttrSetterManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FA4B9B10356D7846EAC732784AE4B60 /* LKS_CustomAttrSetterManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C60DB44F719853DE3B7157960DAF9270 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = A17B9A736952191C771B8268A863C154 /* MJRefreshComponent.m */; }; + C6A100159974349FEAAC99B82BE0F872 /* SDImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = B9037AC04176BA7B3FD6E0891AEFA0F3 /* SDImageLoader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C6FEC1088121FEA7DDC3384B7ECF3B44 /* LKS_Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F586E3EC54302A6896FBF08F870CAD9 /* LKS_Helper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C71935C30C1AEDF32B96670BD8FA64CE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5BA0325112AB8CA7AB613D1A8ED2DB65 /* UIKit.framework */; }; + C857B8D2D0BAA5A8A764F9E1C4B85807 /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 627BA8BB2ACD90F8F5EE6A82DB3C8A30 /* ViewController+MASAdditions.m */; }; + C8771885BEA9EA0BD2E2C474587325E2 /* LKS_ExportManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E1FCAE90D248FD5EB1718F110A71F968 /* LKS_ExportManager.m */; }; + C8EC35DFB0945DBE2F2FF9ECFE6D9711 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = AAF17CFAE9B41A80886D7AE13FD1E50F /* NSLayoutConstraint+MASDebugAdditions.m */; }; + C93E972E75F84674690300123984EC43 /* SDAssociatedObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 06E5F468BEEB51DB8A7E77C947B30422 /* SDAssociatedObject.m */; }; + C992A335399F942237E754EE65C40CA5 /* LookinObject.h in Headers */ = {isa = PBXBuildFile; fileRef = B3FA407D1022AF2CB763141971FC4EB0 /* LookinObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9B63C6ED2ED691EA83D3EE65939444B /* Lookin_PTProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = EAAAA4757F7C32D06EFABC2E3F5A7E92 /* Lookin_PTProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9E19D164C26414115CC969ED9A303C1 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 80CD54C66B12297780AB38A67326A123 /* MASLayoutConstraint.m */; }; + C9E8C9372C2DA29D302B058BE3AE9877 /* CALayer+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = AA2B2D56E95C386717A6F0CD8A922C40 /* CALayer+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CA1E0DCDF679EA2DE2ED0915426E1D04 /* SDWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A635255686FD2FCD8C5CAC9FEE2DF53 /* SDWeakProxy.m */; }; + CA56274BE7CBB3E759E0364785DF9799 /* Lookin_PTChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = AE49DBFD7747CCA7312F5223902CD0BE /* Lookin_PTChannel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE86196C00DC1D658B6CB7D47A0233AA /* LKS_ConnectionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4DD4CF37CC301AC7FE2A7E1D6E25262A /* LKS_ConnectionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CFF8D1A5E4C2097EF05E1021FE112886 /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = CA019314A251BB497B3E819CDC26387C /* SDWebImageIndicator.m */; }; + D06BB547D59D183FD1DDD84DEBAC9EE8 /* SDWebImageCacheSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = C5F26A40551254037D690232E0E3515F /* SDWebImageCacheSerializer.m */; }; + D091F05269EE0566B665B00C7D912F8E /* Lookin_PTChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = 276C305CE849709E6E95E8B8BCACFFBB /* Lookin_PTChannel.m */; }; + D1230E19DD1507E6370B80DF6653AC2A /* NSArray+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = 97A61C6C7AE704F2C4E7790EA2165AA8 /* NSArray+Lookin.m */; }; + D2AF9A7FD73B95960FDA4FD06C4BED08 /* NSObject+MJKeyValue.h in Headers */ = {isa = PBXBuildFile; fileRef = BCC3DB7CA8C7545180CB5DE948BC48CD /* NSObject+MJKeyValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D2CD8848F856EC9942A76610AAE66F0A /* SDImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 27F231C28D0C004102CE0F6380753C42 /* SDImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D559CC4D0695CEE05F3B4C1C06475044 /* UIImageView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BAD1F27E9FC617CBBAB146C0BA99F46 /* UIImageView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D5C046C46961BE465293625D6B870620 /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 249F9D6284D7E5FA7E6B1698622C3922 /* AFNetworking-dummy.m */; }; + D62A672EEB252581BD972DDA862BE1DD /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C422377EFC85D76220E07203EE6D3BC6 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D662C83ECE8BEDA5FFB52F3575CA3E1A /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F4964A87C231B4E7FCB7761033A3CE7 /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; D663837F4347AF58660EE6F7FD426ECE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; - D788BA4B9E8186271BA75CA52B30502C /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E135DFBB6A830F84DCF4A1D31534EE65 /* View+MASAdditions.m */; }; - D7B3E8948DB04BD8FB6748419DA03EA9 /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 371EEAE238A16CCB71633D3E6EF40F2B /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D90607B4E56247B19B14462E487BA86E /* MJRefreshNormalTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E7292A83C005323B245A7EF2737878F /* MJRefreshNormalTrailer.m */; }; - D90DED0F5638B1C44F4B6C62D600D240 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 53392BC7B7115E12AC2077F4447BF455 /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D90DF1376DF5E2EA644313BCD2E03058 /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 5FDFD2C717749B65FE64DACB99DF72A3 /* MJRefresh.bundle */; }; - DBA9500CBBA5FF6FCBBA115AE4D12152 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5679D7FEFDE3E519C17C0EAAA7867122 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DBD9152526A180771BF7D7CD209B957E /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 85AD1C60C75A73E360E4320DD271A77D /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC87E6C5364DC59641BC8A0676B5EA55 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; - DDA16FB9C21AD941442357DAE6939530 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 2008561C63F2B5CE8C1C38CF97F13753 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DE5A78F116018E2AC54714238276574D /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C41FE7B076060F0600FEC9D5AFF762A /* UIActivityIndicatorView+AFNetworking.m */; }; - DE98ECCCA7106A4EA575EF34830D41FF /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C71B36DE1531E30C6C8E2592C55C0ED5 /* MJRefresh-dummy.m */; }; - DEA09692CF813A23899CD4949A9B6801 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = FB47049112F4F8EEA8F6068CB0393B3F /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DED9ADFC8CC65243FC54E008A853742C /* MJPropertyKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 12CCB648397BE0600012171A844509DE /* MJPropertyKey.m */; }; - DF2B15402CE105F5A8CE48BBDCFFD5DD /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C1791A7C256B13C227BF8DAE4C2EFE9 /* MASConstraint.m */; }; - E0BCF21E9FA59F638C13ECCECC4D9690 /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = A6CCAA7B0AD1373217438DACF7AB456C /* SDMemoryCache.m */; }; - E1BF615DD0422B06C97542F03C879D41 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = BE440D8DEC29075E20FE83DB3AB2620D /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E1DE69F6BB6235A6EDB6C99A184BEDB4 /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B4BB6924504E595528A838685E1B608 /* UIScrollView+MJExtension.m */; }; - E3FC6BEE41652C0500F57E0CB83B347F /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AE552655E7E703CCEDD4BE44EFA5662 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E4F1B478580D6D7328BC29607BDE46F6 /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FC489301C2534B7DD53B90720E80BF3 /* UIImage+ExtendedCacheData.m */; }; - E50613C67DD02AF6EA825DA0B31EFFAD /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = 830D06A83C1E8E77E539514107F83812 /* SDImageGraphics.m */; }; - E55B3151D86660E28CEABC3CDE6B1508 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = F0300A3A30BF1560E306C61ACCE11C1A /* UIButton+AFNetworking.m */; }; - E5B057BC87284367918B2DB9CA084B4E /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2514349975FAC97A668A1C6665BD754F /* MJRefreshAutoGifFooter.m */; }; - E76969F9B01139118427505B18F9CD21 /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8430A616C01FADC1B0DB9E5D08A03C35 /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E8AB529B9E0B4C23921344F6C4ABFEA4 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 01F1EC51FF11D8BE91D0807E9CB714CC /* SDImageCoder.m */; }; - E930A5612DC6D120BE040AD17C6D1BCD /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = E5AEFA07EBF944C0387D10A7BD7BC85F /* MASViewAttribute.m */; }; - EA82B6D97C9C5D0558047AF552D63203 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 19C379703ED728112C6AD8D69CB97193 /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D788BA4B9E8186271BA75CA52B30502C /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = E6D970EF4215F715F0CFE07FA609D904 /* View+MASAdditions.m */; }; + D7B3E8948DB04BD8FB6748419DA03EA9 /* SDAnimatedImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 391472186DEB6AD02CB97FE31E7786DD /* SDAnimatedImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D89C7D5455E3E8E2D7EC6B880253BD9B /* LookinIvarTrace.m in Sources */ = {isa = PBXBuildFile; fileRef = 908B6B0806B4B9F61D9989FC02488A48 /* LookinIvarTrace.m */; }; + D90607B4E56247B19B14462E487BA86E /* MJRefreshNormalTrailer.m in Sources */ = {isa = PBXBuildFile; fileRef = 463E1287B5A31340EBA5533E07F066C4 /* MJRefreshNormalTrailer.m */; }; + D90DED0F5638B1C44F4B6C62D600D240 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = ADA92BE9CEF7C7CB2A8B83926C9086BE /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D90DF1376DF5E2EA644313BCD2E03058 /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A09952981795D69640C1B042E3305F33 /* MJRefresh.bundle */; }; + DBA9500CBBA5FF6FCBBA115AE4D12152 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 25B9C7CDB8FB7628FD1DBD1506DB6FE3 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DBD9152526A180771BF7D7CD209B957E /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 0300D33CB343F4D8FBD5BC95AD45F71A /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DD7F63D4E4640C7386877BB787740272 /* LookinServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E26FE8A705408387562DCE99FF815021 /* LookinServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DDA16FB9C21AD941442357DAE6939530 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 254A2506DA8D281B3021ACECC4F127B7 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DE5A78F116018E2AC54714238276574D /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 27DBD37CA00D46F9E675FBD0A123CF21 /* UIActivityIndicatorView+AFNetworking.m */; }; + DE98ECCCA7106A4EA575EF34830D41FF /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 45A31347DD6C3F7EE0F37263613AAE10 /* MJRefresh-dummy.m */; }; + DEA09692CF813A23899CD4949A9B6801 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = D7CE187EC41E8BF909ED0FE617B5CADB /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DED9ADFC8CC65243FC54E008A853742C /* MJPropertyKey.m in Sources */ = {isa = PBXBuildFile; fileRef = CDAAED17E57698D9774A146AD8F38314 /* MJPropertyKey.m */; }; + DF2B15402CE105F5A8CE48BBDCFFD5DD /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = B4AF9FCBF93D2985C74467EEE4144F2B /* MASConstraint.m */; }; + DF525E5405FAD3B98B0C2D966EB2DD95 /* UIViewController+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = CDEDB19624E3C9E8C5154DDA825FFABC /* UIViewController+LookinServer.m */; }; + E0B48B9D5D45AF3500FC718459D66E6C /* LookinDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F541D4B8A3B7E063BB4AE488C9443D0 /* LookinDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E0BCF21E9FA59F638C13ECCECC4D9690 /* SDMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DF165DDC3515F177F129981AF41F322 /* SDMemoryCache.m */; }; + E1BF615DD0422B06C97542F03C879D41 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = E56FEF1A9FC3188CBA7C605E21D82A0A /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E1DE69F6BB6235A6EDB6C99A184BEDB4 /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 44D55FDE34D60D0A3766885FFAA60ACC /* UIScrollView+MJExtension.m */; }; + E3FC6BEE41652C0500F57E0CB83B347F /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 4971D64582BFFE7AABA697FE6171D9AC /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4F1B478580D6D7328BC29607BDE46F6 /* UIImage+ExtendedCacheData.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EC0BD7D613E101DC1F6A91D23A66983 /* UIImage+ExtendedCacheData.m */; }; + E50613C67DD02AF6EA825DA0B31EFFAD /* SDImageGraphics.m in Sources */ = {isa = PBXBuildFile; fileRef = E87409A6C236FBEB17F5FADFE67805F1 /* SDImageGraphics.m */; }; + E55B3151D86660E28CEABC3CDE6B1508 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 5056018B2BE1CBBCA76F0A1E0653D4D3 /* UIButton+AFNetworking.m */; }; + E5B057BC87284367918B2DB9CA084B4E /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 144DA4097EB311278BCC70CB7964B972 /* MJRefreshAutoGifFooter.m */; }; + E753BC1F919608729F3E4963D61D4F78 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 28044484DF43321746ED7EE2E8CE92EC /* PrivacyInfo.xcprivacy */; }; + E76969F9B01139118427505B18F9CD21 /* SDImageHEICCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FBDE8546A774C7DD1D740B8B3DBBB41E /* SDImageHEICCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7FEAB9F421F7EBAF021F792D8E9C4D6 /* LookinCustomDisplayItemInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 984CA174C8D3E831F87D9D84DD88440D /* LookinCustomDisplayItemInfo.m */; }; + E82964ED7092CDCDAD08BC596A57B43A /* UIImage+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A9B1B38878AB3338A36D3D2DD4CBA99 /* UIImage+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E8AB529B9E0B4C23921344F6C4ABFEA4 /* SDImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 065292DC9A45144FF2D837AE8CD65F8A /* SDImageCoder.m */; }; + E930A5612DC6D120BE040AD17C6D1BCD /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 436D2261BEEF1C4B3FB973E64413A09F /* MASViewAttribute.m */; }; + EA82B6D97C9C5D0558047AF552D63203 /* SDWebImageDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 83CAB8352CBFBF9CE8EB6054C33B535E /* SDWebImageDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; EABCB60A26B06BF576E50BBD2F89A385 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */; }; - EB3DF628891F7D6AB114718AF760CB2A /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = AB321552F4E1B0F80966FCA9AF11848F /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EC8E84A8FFADDCA562A8608D141D9027 /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D9CC7A1A5CD78BA5BDFC0C1D94B2D4D /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EC9B34262AED632D7EFB49804337648E /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = 23D13EEFDD6A912D7922FE8AE4E23D60 /* Masonry.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ECE64B732F9FA7C402DDEEC58DCB9D98 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = BF154B0F2EB8913A8674795FD63311D2 /* SDImageAPNGCoder.m */; }; - ED8991A8AE7C04362C2BED3875DC1656 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = CEC061A3621F113DA97A66F89E6A844B /* AFURLResponseSerialization.m */; }; - ED8F64FF98CFAE0B12CF60A1B0E6BAF8 /* SDCallbackQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 678A010D7D73785C1E08D97B5F67AAAA /* SDCallbackQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE6E8FE636D2C02E3D2FC1E8555B4612 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 5713367A1E361064DE338AB389631FF5 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EED016DE8173CD38CC01D88CD2628984 /* NSString+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A6C15EE27B77ABD56B0A0807D581260 /* NSString+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EF6A6C725598F572A70C5FCEE328C184 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C0A8B13D619D89C3E57F4B83ACBF157 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F1D845E22D5B8FC6AFC3C2E41DA1B6DF /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 523BDC065F0AF63F170A84FAF905FD26 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F2AD91050B1FE3C8BC78567F1FDE3ED5 /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 517973DC2D89829B73698FF20240431A /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3263D294D688533EB974E37C61F1E24 /* MJExtensionConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 31F5F018A672BC56D29258EEBC019C32 /* MJExtensionConst.m */; }; - F3AECEF6D3BB919B3E7392942E1BC58B /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 19839A21E0B314D9E8C99EBD5D071916 /* MJRefreshBackFooter.m */; }; - F49CB22863CCFEC7817D259F27F91C57 /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = D0B1FCAC31B9EF58F1FD85B83EA55B1C /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F53BE4449AE5896F76325E4DCB6D0B13 /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 0ACA8E457A64FBC07F850B4E390020D4 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F60F90EAF35CFF40DF1C33557965787D /* MJRefreshStateTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = 036A5C31DE156FE1001CC60EF1E3E122 /* MJRefreshStateTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F68889CD481716EE5D6B75EBD8FD53A6 /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 176CBDEEAB52421C3AA5CB3917B54885 /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F6D1C960368EB1E067ABD0BFF707FC56 /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 8ABF0BFFB097FE97D207EBE5498289D3 /* MASConstraintMaker.m */; }; - F7623E7C314AA5010D8D0BD6ED4AAAD4 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D0A0EB33F4B0A380D6DE9E8E5D56D7 /* AFImageDownloader.m */; }; - F9789D86D3279D71B398B550F27C3EFF /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 52AA08F30FFF4D9FF32F48E3AC195A6A /* AFSecurityPolicy.m */; }; - FA3021DED76B9B182CC9195A60EB1209 /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = B147B49E855B11A35493E26865607BDF /* NSBezierPath+SDRoundedCorners.m */; }; - FCDEC6A53CF5517E1AF5B331FD65F6D9 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = C5D645FDA53D7713D436C992B2BC3E96 /* SDImageCacheConfig.m */; }; - FCEE5BD645E95FF55468C4AB6D17CFDA /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 56347C360CEDAA8246A01A213DEBBF8B /* UIImageView+HighlightedWebCache.m */; }; - FDACBA49610EA6F39CABB7FE44B137D1 /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = E8780E8A7822982224C2ACEBBC3B52B8 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FE07C069C2E3543002CEB5D751ABA9AC /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B7BBB3446628A3BC637B9F57A5C49901 /* AFNetworkReachabilityManager.m */; }; - FEA8BA4F82CCBD1D28DCC7EF39FB4096 /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AF4B903EB65570DDDE8731659809CA1 /* SDImageCacheDefine.m */; }; - FEE883575278D5BE8F185437AB5DB3BB /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 275A2D66E7913A4B508816E187F4D3C3 /* MJRefreshGifHeader.m */; }; + EB3DF628891F7D6AB114718AF760CB2A /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 79089E0A7C9885BD8A68564AED25725D /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EB646114ABEA7A4D6C2A724404778670 /* LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = F655B5C3F030F1435ED5BD0A0E68050A /* LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC8E84A8FFADDCA562A8608D141D9027 /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1741F6722966FBFEF352A4C6C4B790CB /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC9B34262AED632D7EFB49804337648E /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = 6804931A02925CC75742598277F91E7D /* Masonry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ECE64B732F9FA7C402DDEEC58DCB9D98 /* SDImageAPNGCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F6FB5B25BAE1ACEDCF42E5C0A4C81EE /* SDImageAPNGCoder.m */; }; + ED8991A8AE7C04362C2BED3875DC1656 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A4A68949C49C722CDE476E9A7AA168 /* AFURLResponseSerialization.m */; }; + ED8F64FF98CFAE0B12CF60A1B0E6BAF8 /* SDCallbackQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AC4657B3FE19E5DAB493D06AC070AA5 /* SDCallbackQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE6E8FE636D2C02E3D2FC1E8555B4612 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = D52F763F898CF198A32C6E14F5139155 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EED016DE8173CD38CC01D88CD2628984 /* NSString+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 33AB41E897E484FEC64F2BEBBA7AA40C /* NSString+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF6A6C725598F572A70C5FCEE328C184 /* SDImageTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 03EE952C3A1BEC939C8DE9E8AEE99680 /* SDImageTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F1D845E22D5B8FC6AFC3C2E41DA1B6DF /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 64E7ACD01BBC889248107EDDA2D34EC5 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F2AD91050B1FE3C8BC78567F1FDE3ED5 /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = F278184E8A4E3E7A2260C7FF4E482DE6 /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3263D294D688533EB974E37C61F1E24 /* MJExtensionConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 8375CF9CD2710851F31670C5AEC1681F /* MJExtensionConst.m */; }; + F3AECEF6D3BB919B3E7392942E1BC58B /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 052D1452680A5875F5F4556B2C3EBF0A /* MJRefreshBackFooter.m */; }; + F3F4A6309BD95DFAA4DCC60A4E07C515 /* UITableView+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = D738094D77852E91C1FB0B900841B0DC /* UITableView+LookinServer.m */; }; + F49CB22863CCFEC7817D259F27F91C57 /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = D0D4FAEBC816AD65D32AA5F30C61F379 /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F53BE4449AE5896F76325E4DCB6D0B13 /* SDImageCachesManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 196FCA4B75B6A5EBA44015FE58014E80 /* SDImageCachesManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F60F90EAF35CFF40DF1C33557965787D /* MJRefreshStateTrailer.h in Headers */ = {isa = PBXBuildFile; fileRef = CC23CC0879B489B9B23435E228693BF3 /* MJRefreshStateTrailer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F62B0711DA506CCB3DF79F65134566C7 /* Lookin_PTPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 94A0A26ED8D77A34A56CFCB4F479BBA1 /* Lookin_PTPrivate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F68889CD481716EE5D6B75EBD8FD53A6 /* SDImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = E5DB708E9320895D02EB843DDAF4E47E /* SDImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F6A0D6EA1B5DC3FE04DC4A1B0A914121 /* UIView+LookinServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 283AB44ABB83D8E9379522F7DA0C9F41 /* UIView+LookinServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F6A2DEEA8E8B92D365AFDDBD5E8C1218 /* NSObject+Lookin.m in Sources */ = {isa = PBXBuildFile; fileRef = D0757789009DAF5FE17451C8742CC19F /* NSObject+Lookin.m */; }; + F6D1C960368EB1E067ABD0BFF707FC56 /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 11B0E0F71F410E0ECDFF69F70055F7B7 /* MASConstraintMaker.m */; }; + F7623E7C314AA5010D8D0BD6ED4AAAD4 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 715B54C7081C9B50766843BEF2736EA5 /* AFImageDownloader.m */; }; + F8616FAFEE1124368CB96473CE20CDB4 /* LookinAttrIdentifiers.m in Sources */ = {isa = PBXBuildFile; fileRef = 3040952A3BB90E1A48E70463CF6AC78E /* LookinAttrIdentifiers.m */; }; + F8F1B1196CAA5114BA9A95AA7E6D6AEB /* UIBlurEffect+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 99A76FE381DE593E9457E666DD4A9799 /* UIBlurEffect+LookinServer.m */; }; + F9789D86D3279D71B398B550F27C3EFF /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 11370C376BB4F56A26E5030C3491EA42 /* AFSecurityPolicy.m */; }; + FA3021DED76B9B182CC9195A60EB1209 /* NSBezierPath+SDRoundedCorners.m in Sources */ = {isa = PBXBuildFile; fileRef = 2412E2A59A075C38936A2610D1ABC897 /* NSBezierPath+SDRoundedCorners.m */; }; + FA6DA93357E2E9E9AADDFB3E39DEB6C2 /* NSObject+LookinServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2716B52AE20CE03F3CE527E710496F24 /* NSObject+LookinServer.m */; }; + FC59A881F35E517FA69EB6E0D66612CB /* Pods-keyBoard-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A2D8E1EB42D41EA6B94901E5B68C9011 /* Pods-keyBoard-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FCDEC6A53CF5517E1AF5B331FD65F6D9 /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = A5F9CD3FA8354DAD169C496B884A0ADC /* SDImageCacheConfig.m */; }; + FCEE5BD645E95FF55468C4AB6D17CFDA /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BD2B0FEC06B60E4A994758E4B4E6A26 /* UIImageView+HighlightedWebCache.m */; }; + FDACBA49610EA6F39CABB7FE44B137D1 /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB5199AA36CBEDB4430823E47805048 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FE07C069C2E3543002CEB5D751ABA9AC /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D1332008BE919DA536E622206A6116BF /* AFNetworkReachabilityManager.m */; }; + FEA8BA4F82CCBD1D28DCC7EF39FB4096 /* SDImageCacheDefine.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EBB3C244FB3EC69D90D12B011B7D4F /* SDImageCacheDefine.m */; }; + FEE883575278D5BE8F185437AB5DB3BB /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 803500457FA774DB0534BE80EADC55D2 /* MJRefreshGifHeader.m */; }; + FFC6D50089FA32FD7AAF25747E56EA60 /* LKS_CustomAttrGroupsMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BD1A357400FFDAACAA0A9EF93FCBE15 /* LKS_CustomAttrGroupsMaker.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 23C4ACB33CF11EF7F294BFEFDFEE525F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B32AF3F43989CBA171BB1FB3957A4509; - remoteInfo = "MJExtension-MJExtension"; - }; - 74C35E0C9F3979D774EBA89927D5F9BE /* PBXContainerItemProxy */ = { + 12BD60C24C01B20FDE8828B052220831 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = B26054DF1DEA11585A231AF6D1D80D5E; remoteInfo = "MJRefresh-MJRefresh.Privacy"; }; - 7F4A11CEA9C42F01CCC8FD8CF31E0D31 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 55AF53E6C77A10ED4985E04D74A8878E; - remoteInfo = Masonry; - }; - 8C46BC742135C578AA462516574ECF6A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 94CFBA7D633ECA58DF85C327B035E6A3; - remoteInfo = "SDWebImage-SDWebImage"; - }; - D00922B5D33413CCF1E3D4753D9B5522 /* PBXContainerItemProxy */ = { + 170C9F8A38F4CF079D27AF1BCAF893F2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 6868056D761E163D10FDAF8CF1C4D9B8; remoteInfo = MJRefresh; }; - D31947E4B8C395A2964CC7C4CA10B4B3 /* PBXContainerItemProxy */ = { + 21CBD700B5A79737B887480BE0697AF5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 4D3BA58D0583DF37575CACAB3DDADC85; remoteInfo = MJExtension; }; - ED8283C03EBD084126ED5759CD5B7EF5 /* PBXContainerItemProxy */ = { + 21E2F063DEDE55524CCC96983E4DCA4C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 4A68CFD979D413A619DF631BB121D98F; remoteInfo = Bugly; }; - F236FEF1E37470AFA015925961D566A3 /* PBXContainerItemProxy */ = { + 22D1506217D99FEDABDB9AAFE5D2E547 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B32AF3F43989CBA171BB1FB3957A4509; + remoteInfo = "MJExtension-MJExtension"; + }; + 38401E33DF4010EFB3C691A96858743F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; remoteInfo = SDWebImage; }; - F4298358FEAF506C773B2D34F3DF6B12 /* PBXContainerItemProxy */ = { + 3F8A35535F395BE84B4A539F6E9DBF34 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 55AF53E6C77A10ED4985E04D74A8878E; + remoteInfo = Masonry; + }; + 9E527C7BC36E9521D6CCC7505783F2CB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 94CFBA7D633ECA58DF85C327B035E6A3; + remoteInfo = "SDWebImage-SDWebImage"; + }; + A39AC9607F9509F9905E56AC9B6CC731 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 638FEAAFC575BB76BC6AC055CDDA3506; + remoteInfo = LookinServer; + }; + F1AA0CF10713431E8883F507BBC693FA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; @@ -394,358 +540,501 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 00031196DD7FBA552243DCF5CEB19ABD /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/Core/SDWebImageDownloader.h; sourceTree = ""; }; - 0044E51493E8CC5F8C46E1EC18F97722 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; - 0073EB182F9CC003B9721B132AC0082F /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = ""; }; - 008AD8F77F87E2DC5C0DB4CD71AC5858 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/Core/NSButton+WebCache.m"; sourceTree = ""; }; - 018B520CB407C3492F13C3767C15E377 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; - 01F1EC51FF11D8BE91D0807E9CB714CC /* SDImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoder.m; path = SDWebImage/Core/SDImageCoder.m; sourceTree = ""; }; - 02379CD5F0D938EE2DBABC8871CB17E5 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/Core/SDWebImageManager.h; sourceTree = ""; }; - 036A5C31DE156FE1001CC60EF1E3E122 /* MJRefreshStateTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateTrailer.h; path = MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h; sourceTree = ""; }; - 03DE7669ACCB33ED7598791177D4881A /* UIImage+Metadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Metadata.h"; path = "SDWebImage/Core/UIImage+Metadata.h"; sourceTree = ""; }; - 047628989EB45DFAC6DD4B6DDC61C1D7 /* MASLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLayoutConstraint.m; path = Masonry/MASLayoutConstraint.m; sourceTree = ""; }; - 06A2AED69705719F9BEBAEDC9D1D18C6 /* SDInternalMacros.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDInternalMacros.m; path = SDWebImage/Private/SDInternalMacros.m; sourceTree = ""; }; - 06B650CAE141ABD90E360415151BC9B9 /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MJExtension.m"; path = "MJRefresh/UIView+MJExtension.m"; sourceTree = ""; }; - 06B71FC03BF92D5C7E3E050752C0E06C /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = ""; }; - 078FC3682AC6F2B8020DD6D0F6A1A818 /* SDDisplayLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDisplayLink.h; path = SDWebImage/Private/SDDisplayLink.h; sourceTree = ""; }; - 087882A7DEA5E7EECA5B73EB89E95C00 /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = ""; }; - 09C03827CE30DECF1B8884688B6651D8 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/Core/SDWebImageManager.m; sourceTree = ""; }; - 0A6C15EE27B77ABD56B0A0807D581260 /* NSString+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+MJExtension.h"; path = "MJExtension/NSString+MJExtension.h"; sourceTree = ""; }; - 0ACA8E457A64FBC07F850B4E390020D4 /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = ""; }; - 0AFFFE7105483F8A94BFD883AD56221D /* MJFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJFoundation.h; path = MJExtension/MJFoundation.h; sourceTree = ""; }; + 00078AED6DDB9E77E4B7A11743D4B41D /* SDImageAWebPCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAWebPCoder.m; path = SDWebImage/Core/SDImageAWebPCoder.m; sourceTree = ""; }; + 008D12F98C44419EC0A8DB3925320238 /* SDAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImage.m; path = SDWebImage/Core/SDAnimatedImage.m; sourceTree = ""; }; + 013ECA5DD2CB8359B649081FDA62389D /* View+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASAdditions.h"; path = "Masonry/View+MASAdditions.h"; sourceTree = ""; }; + 02595F4CE092E8F076796074E901A65C /* LookinAttributeModification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAttributeModification.m; path = Src/Main/Shared/LookinAttributeModification.m; sourceTree = ""; }; + 02E46BBE37B9E605E49E103E7F87F695 /* SDImageHEICCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageHEICCoder.m; path = SDWebImage/Core/SDImageHEICCoder.m; sourceTree = ""; }; + 0300D33CB343F4D8FBD5BC95AD45F71A /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; + 03EE952C3A1BEC939C8DE9E8AEE99680 /* SDImageTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageTransformer.h; path = SDWebImage/Core/SDImageTransformer.h; sourceTree = ""; }; + 044192A93545487A7E0420B603C4285C /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; + 052D1452680A5875F5F4556B2C3EBF0A /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = ""; }; + 0628FA5908F18B74E57C187734650C8B /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = ""; }; + 065292DC9A45144FF2D837AE8CD65F8A /* SDImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoder.m; path = SDWebImage/Core/SDImageCoder.m; sourceTree = ""; }; + 06E5F468BEEB51DB8A7E77C947B30422 /* SDAssociatedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAssociatedObject.m; path = SDWebImage/Private/SDAssociatedObject.m; sourceTree = ""; }; + 070AFBF58C2CF5274A3FAEE778C0864E /* LookinDashboardBlueprint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinDashboardBlueprint.h; path = Src/Main/Shared/LookinDashboardBlueprint.h; sourceTree = ""; }; + 07D77214AE62D3768C2BB6BDB50720B4 /* UIBlurEffect+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBlurEffect+LookinServer.h"; path = "Src/Main/Server/Category/UIBlurEffect+LookinServer.h"; sourceTree = ""; }; + 081967E91FB2135CDDE098522CC1F303 /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = ""; }; + 083445CDF27981FED5ABFEA79E295D27 /* SDImageCachesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManager.m; path = SDWebImage/Core/SDImageCachesManager.m; sourceTree = ""; }; + 08B62FFF2C8CEBFA37C7AE6B1C443DF6 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = ""; }; + 08C30132ED5FABAEDF867C9B2581BAD8 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; + 09E7AB4EEB7AE4F100B108AD6C5152E5 /* SDmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDmetamacros.h; path = SDWebImage/Private/SDmetamacros.h; sourceTree = ""; }; + 0AC4657B3FE19E5DAB493D06AC070AA5 /* SDCallbackQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDCallbackQueue.h; path = SDWebImage/Core/SDCallbackQueue.h; sourceTree = ""; }; + 0AEC89E1DB573A8895DAE690A3E4E531 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; 0B4AAC15A428CDC2A62AF9CC27BEA609 /* Pods-CustomKeyboard */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-CustomKeyboard"; path = Pods_CustomKeyboard.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0B8D3ED63A0D6E1C4341827B7D01B7D8 /* SDDeviceHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDeviceHelper.h; path = SDWebImage/Private/SDDeviceHelper.h; sourceTree = ""; }; + 0BD1A357400FFDAACAA0A9EF93FCBE15 /* LKS_CustomAttrGroupsMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_CustomAttrGroupsMaker.m; path = Src/Main/Server/Others/LKS_CustomAttrGroupsMaker.m; sourceTree = ""; }; + 0C1333D32D092DD54CBE8B17F9E60A95 /* MASViewAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewAttribute.h; path = Masonry/MASViewAttribute.h; sourceTree = ""; }; 0C4AE62ED97252893F28F670D61AFB24 /* Pods-keyBoard-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-keyBoard-Info.plist"; sourceTree = ""; }; - 0C6DD7AD3672258C4407B4269B490F27 /* SDAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SDAnimatedImageView+WebCache.m"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.m"; sourceTree = ""; }; - 0C8185E7D34531047F63FFFBB2C6C9D3 /* NSObject+MJProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJProperty.h"; path = "MJExtension/NSObject+MJProperty.h"; sourceTree = ""; }; - 0C838D64A8654D1DDA15A6DDC98360A9 /* SDAssociatedObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAssociatedObject.m; path = SDWebImage/Private/SDAssociatedObject.m; sourceTree = ""; }; - 0CB3E312C9D65596A37072C76944B850 /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = ""; }; + 0CC9C159DF574F5F481FDD547E219367 /* AFNetworking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.release.xcconfig; sourceTree = ""; }; 0D6215D1BCCE125B8DF73E38013CBBDC /* Pods-CustomKeyboard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-CustomKeyboard.debug.xcconfig"; sourceTree = ""; }; - 0DC8E0CC70A7B84D1A1E1FAAF5AF5A4D /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/Core/SDWebImagePrefetcher.h; sourceTree = ""; }; 0E732C0D026ACBC7DBD039DC3BDC2BCE /* Pods-keyBoard.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-keyBoard.modulemap"; sourceTree = ""; }; - 0F7E589343BFFDCABC0FCDF6E321CDA2 /* MASCompositeConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASCompositeConstraint.m; path = Masonry/MASCompositeConstraint.m; sourceTree = ""; }; - 0FC44A2AEE9BAA02332A14994FF0E2E0 /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = ""; }; - 104166B53DA0CBE95AF12518EB609B7A /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; - 10E420AEEA134E4CDDBAA68DEA103561 /* UIColor+SDHexString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SDHexString.m"; path = "SDWebImage/Private/UIColor+SDHexString.m"; sourceTree = ""; }; - 1170792DCF45BF664C43019D3E77D80F /* Masonry.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Masonry.modulemap; sourceTree = ""; }; - 11F1BA773620708277D240BE4CD304E4 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = ""; }; - 12C162655386843E5BE2582AC09CA762 /* SDImageFramePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFramePool.h; path = SDWebImage/Private/SDImageFramePool.h; sourceTree = ""; }; - 12CCB648397BE0600012171A844509DE /* MJPropertyKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyKey.m; path = MJExtension/MJPropertyKey.m; sourceTree = ""; }; - 13F0EE17165FE326BF8D348C181A1E71 /* SDImageIOAnimatedCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoder.h; path = SDWebImage/Core/SDImageIOAnimatedCoder.h; sourceTree = ""; }; - 14C4334FE2177757C132CBBCD17C11B5 /* UIImage+Transform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Transform.m"; path = "SDWebImage/Core/UIImage+Transform.m"; sourceTree = ""; }; - 14C952AD321D89B78D085CA0FBC817D9 /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = ""; }; - 14D8DE9600B7E469FA4A83E84C149E08 /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = ""; }; - 176CBDEEAB52421C3AA5CB3917B54885 /* SDImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoderHelper.h; path = SDWebImage/Core/SDImageCoderHelper.h; sourceTree = ""; }; + 0EC0BD7D613E101DC1F6A91D23A66983 /* UIImage+ExtendedCacheData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ExtendedCacheData.m"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.m"; sourceTree = ""; }; + 0F541D4B8A3B7E063BB4AE488C9443D0 /* LookinDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinDefines.h; path = Src/Main/Shared/LookinDefines.h; sourceTree = ""; }; + 0F5CDEC5FA7978C383600FA2E6E0D6D6 /* SDImageAssetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAssetManager.m; path = SDWebImage/Private/SDImageAssetManager.m; sourceTree = ""; }; + 0F6F82FEF48E6F695530EC6293A66090 /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = ""; }; + 0F824B39219E9142F3A7CD9862002C60 /* Bugly.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bugly.release.xcconfig; sourceTree = ""; }; + 0FC914323BA2AE8D6B04FB881E065C93 /* NSObject+MJCoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJCoding.m"; path = "MJExtension/NSObject+MJCoding.m"; sourceTree = ""; }; + 10C92CFDBED4322E033ABC6F5ACC96AB /* LookinDisplayItemDetail.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinDisplayItemDetail.h; path = Src/Main/Shared/LookinDisplayItemDetail.h; sourceTree = ""; }; + 11370C376BB4F56A26E5030C3491EA42 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; + 11B0E0F71F410E0ECDFF69F70055F7B7 /* MASConstraintMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraintMaker.m; path = Masonry/MASConstraintMaker.m; sourceTree = ""; }; + 1268201EC6F4BF7A1C93B850D3DB3355 /* NSObject+MJCoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJCoding.h"; path = "MJExtension/NSObject+MJCoding.h"; sourceTree = ""; }; + 129F6A10DC8AFBD284583E4CF5ED5793 /* MASConstraintMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraintMaker.h; path = Masonry/MASConstraintMaker.h; sourceTree = ""; }; + 131CFAAD6F5934ECDF337EF98A4C2530 /* Masonry.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Masonry.modulemap; sourceTree = ""; }; + 144DA4097EB311278BCC70CB7964B972 /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = ""; }; + 14E874114A831512644E2A5EB09CD1A2 /* LookinTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinTuple.m; path = Src/Main/Shared/LookinTuple.m; sourceTree = ""; }; + 14FD02BD7DB8AC12A9596FD7D10BA589 /* LKS_ObjectRegistry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_ObjectRegistry.h; path = Src/Main/Server/Others/LKS_ObjectRegistry.h; sourceTree = ""; }; + 1599325D7A76B2919AC08302175DCE80 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/Core/SDWebImageCompat.m; sourceTree = ""; }; + 16AD6D30F07932689DDECD4AC477E876 /* LookinDisplayItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinDisplayItem.h; path = Src/Main/Shared/LookinDisplayItem.h; sourceTree = ""; }; + 16F8B2064DB9779ECB8F1B480CA181C3 /* LKS_Helper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_Helper.m; path = Src/Main/Server/Others/LKS_Helper.m; sourceTree = ""; }; + 1715EE59F5A92423F93FAFB62F1D7885 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; + 1741F6722966FBFEF352A4C6C4B790CB /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = ""; }; + 181E31AA047EF4D7C7D768D6E0745646 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/Core/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + 1878BDCAD754FE1097FEBCFED0BE49AD /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = ""; }; 18BF12DFF6188AFC43E6F26853B048F9 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 197BBC12418F4C1E7719181019D1E9EA /* UIView+WebCacheState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheState.m"; path = "SDWebImage/Core/UIView+WebCacheState.m"; sourceTree = ""; }; - 19839A21E0B314D9E8C99EBD5D071916 /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = ""; }; - 19C379703ED728112C6AD8D69CB97193 /* SDWebImageDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDefine.h; path = SDWebImage/Core/SDWebImageDefine.h; sourceTree = ""; }; - 19E0C6994863739B688E61DCE0E025C3 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/Core/SDImageCacheConfig.h; sourceTree = ""; }; - 19F5C3BFE7C9E2977EB241266B257ABE /* SDImageAssetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAssetManager.m; path = SDWebImage/Private/SDImageAssetManager.m; sourceTree = ""; }; - 1AFEE2DD6CE0A6302F3235AF172A2B77 /* ResourceBundle-MJExtension-MJExtension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MJExtension-MJExtension-Info.plist"; sourceTree = ""; }; - 1C27DC7D5FFFA31A8EA1C7B95F3079E1 /* SDWebImageDownloaderDecryptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderDecryptor.m; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.m; sourceTree = ""; }; - 1C3E83B47A120437F73D41A878F182D1 /* Masonry-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-prefix.pch"; sourceTree = ""; }; - 1C60E3EC4F7CE664E3A6586ED2AC0ED5 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; + 1929DED59BFBA00FD324FE4259681F17 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 1940502A2847EE5C9620326DBE54B6DE /* AFNetworking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.debug.xcconfig; sourceTree = ""; }; + 196FCA4B75B6A5EBA44015FE58014E80 /* SDImageCachesManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManager.h; path = SDWebImage/Core/SDImageCachesManager.h; sourceTree = ""; }; + 19A28292A0713CF593D9AF3DEF86D9CC /* SDImageIOAnimatedCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoder.h; path = SDWebImage/Core/SDImageIOAnimatedCoder.h; sourceTree = ""; }; + 19B17B1E7436BD3BF7FE58E23EB65780 /* MJExtension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJExtension-umbrella.h"; sourceTree = ""; }; + 19C21A3D5DAE989B7ED66E39CDEFC148 /* UITextView+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextView+LookinServer.h"; path = "Src/Main/Server/Category/UITextView+LookinServer.h"; sourceTree = ""; }; + 1AFF8D521A2F59A97942CA676EC5CD83 /* SDCallbackQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDCallbackQueue.m; path = SDWebImage/Core/SDCallbackQueue.m; sourceTree = ""; }; + 1C1934434C5B978B6111F3274360F19E /* SDWebImageDownloaderConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderConfig.m; path = SDWebImage/Core/SDWebImageDownloaderConfig.m; sourceTree = ""; }; + 1C3B2D3E031B611BB16FA578099AB2D9 /* MJExtension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MJExtension-Info.plist"; sourceTree = ""; }; + 1CA47DE0773F00D68874CB81729C4ED5 /* UITableView+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+LookinServer.h"; path = "Src/Main/Server/Category/UITableView+LookinServer.h"; sourceTree = ""; }; + 1CBC630E97E6160C1201FF36CF51A0B1 /* SDInternalMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDInternalMacros.h; path = SDWebImage/Private/SDInternalMacros.h; sourceTree = ""; }; + 1CD67E822AFAF2390FFDE37D7406AF22 /* SDWebImageDownloaderConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderConfig.h; path = SDWebImage/Core/SDWebImageDownloaderConfig.h; sourceTree = ""; }; 1D774D8146EBC82B4A77204A273761B8 /* Pods-CustomKeyboard.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-CustomKeyboard.release.xcconfig"; sourceTree = ""; }; - 1D9CC7A1A5CD78BA5BDFC0C1D94B2D4D /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = ""; }; - 1DA8FCC29DBFD3824ADEAD9F14A76E86 /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASShorthandAdditions.h"; path = "Masonry/NSArray+MASShorthandAdditions.h"; sourceTree = ""; }; - 1E8EE46DFF5945CB5FDB220509F5E1A0 /* SDWebImageDownloaderConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderConfig.m; path = SDWebImage/Core/SDWebImageDownloaderConfig.m; sourceTree = ""; }; - 1F0E8534D3C055E4D5D27EBF7422DA74 /* SDWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWeakProxy.h; path = SDWebImage/Private/SDWeakProxy.h; sourceTree = ""; }; - 1F8526067D06A009E96461455DBA1B40 /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = ""; }; + 1DA74014630CFBABD2FDBEF38DF8983E /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = ""; }; + 1DF2ECF78EA0E6413FB6512AE11F68B1 /* SDFileAttributeHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDFileAttributeHelper.m; path = SDWebImage/Private/SDFileAttributeHelper.m; sourceTree = ""; }; + 1E9EFA7F9114207CB40E1613946BD4C5 /* ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; sourceTree = ""; }; + 1EC7EF6A5825A2D3F22E4BC14CD91F18 /* LookinServer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LookinServer.release.xcconfig; sourceTree = ""; }; + 1F5560257C3ABE19E3CE945E12F1679A /* LookinHierarchyFile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinHierarchyFile.m; path = Src/Main/Shared/LookinHierarchyFile.m; sourceTree = ""; }; 1FFED36A657123030ABB700256D73F15 /* Masonry */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Masonry; path = Masonry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 2008561C63F2B5CE8C1C38CF97F13753 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; - 20B1DAD84F32D1AF296F0D63C5DEE9AB /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = ""; }; - 20B21087EF80825B8FC789A191A95BAA /* SDImageHEICCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageHEICCoder.m; path = SDWebImage/Core/SDImageHEICCoder.m; sourceTree = ""; }; - 21EE020A32A9ADF76D7C1AF1A9B28D63 /* SDImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOCoder.m; path = SDWebImage/Core/SDImageIOCoder.m; sourceTree = ""; }; - 23078E14E88B14332A0B4BE57A2A9488 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/Core/UIImageView+WebCache.h"; sourceTree = ""; }; - 2356B7A3F963324EEBA83CB0C527CC22 /* ResourceBundle-SDWebImage-SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SDWebImage-SDWebImage-Info.plist"; sourceTree = ""; }; - 23D13EEFDD6A912D7922FE8AE4E23D60 /* Masonry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Masonry.h; path = Masonry/Masonry.h; sourceTree = ""; }; - 23D6F4D8D5B6512D7A50FF1054426C09 /* AFNetworking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.release.xcconfig; sourceTree = ""; }; - 246841FAF82F0BA847818A9594B81CCB /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = ""; }; - 24B89B49F862DFF8218AA2D11CEDFD3E /* UICollectionViewLayout+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewLayout+MJRefresh.h"; path = "MJRefresh/UICollectionViewLayout+MJRefresh.h"; sourceTree = ""; }; - 24F6DCD61BBDE3823CE167416B3799D1 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/Core/UIImage+GIF.m"; sourceTree = ""; }; - 250848691A5C0FC662F372FB71E83AE5 /* MJPropertyKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJPropertyKey.h; path = MJExtension/MJPropertyKey.h; sourceTree = ""; }; - 25119C155F0BB240A5DDFB8155627C04 /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = ""; }; - 2514349975FAC97A668A1C6665BD754F /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = ""; }; - 25ABF76DAF311B44A4F41DD3F9F04644 /* NSObject+MJClass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJClass.h"; path = "MJExtension/NSObject+MJClass.h"; sourceTree = ""; }; - 266F6A7CA0ABF9B26D746459A14BAEBA /* MASViewConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewConstraint.h; path = Masonry/MASViewConstraint.h; sourceTree = ""; }; - 275A2D66E7913A4B508816E187F4D3C3 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = ""; }; + 20491D6CA1BB8F2F29EF3415E599ACEE /* LookinWeakContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinWeakContainer.m; path = Src/Main/Shared/LookinWeakContainer.m; sourceTree = ""; }; + 20ABB6114972E81639D089CAB0FCFD92 /* SDAnimatedImagePlayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImagePlayer.m; path = SDWebImage/Core/SDAnimatedImagePlayer.m; sourceTree = ""; }; + 224720D17C83C285A57A14AE3249983B /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; + 2260B16F1B02693319478DB4F54316E1 /* MASViewConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewConstraint.h; path = Masonry/MASViewConstraint.h; sourceTree = ""; }; + 227C689732CBCD5ED2D9E1142E9BA6B7 /* NSObject+MJProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJProperty.m"; path = "MJExtension/NSObject+MJProperty.m"; sourceTree = ""; }; + 23A3D2686010C595388C060C97BDD19D /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/Core/SDWebImageDownloader.h; sourceTree = ""; }; + 23E1DEFC1B8E7B2CCCE1A0B8392894AD /* Peertalk.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Peertalk.h; path = Src/Main/Shared/Peertalk/Peertalk.h; sourceTree = ""; }; + 2412E2A59A075C38936A2610D1ABC897 /* NSBezierPath+SDRoundedCorners.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBezierPath+SDRoundedCorners.m"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.m"; sourceTree = ""; }; + 249F9D6284D7E5FA7E6B1698622C3922 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; + 24A712595C444E0BA97B44FF4CDCE313 /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = ""; }; + 254A2506DA8D281B3021ACECC4F127B7 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; + 255503B67607D6F8418BD1A29701AFE1 /* LookinAutoLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAutoLayoutConstraint.m; path = Src/Main/Shared/LookinAutoLayoutConstraint.m; sourceTree = ""; }; + 25664483ABF4DC8EC03E7472AA04333B /* LookinServer */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = LookinServer; path = LookinServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 25B9C7CDB8FB7628FD1DBD1506DB6FE3 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+MASDebugAdditions.h"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; }; + 26F0B678A641C41764C7544218AD9F83 /* LKS_GestureTargetActionsSearcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_GestureTargetActionsSearcher.h; path = Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.h; sourceTree = ""; }; + 2716B52AE20CE03F3CE527E710496F24 /* NSObject+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+LookinServer.m"; path = "Src/Main/Server/Category/NSObject+LookinServer.m"; sourceTree = ""; }; + 276C305CE849709E6E95E8B8BCACFFBB /* Lookin_PTChannel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Lookin_PTChannel.m; path = Src/Main/Shared/Peertalk/Lookin_PTChannel.m; sourceTree = ""; }; + 278B371619258173DE9D9B0FFA6BA140 /* LKS_HierarchyDetailsHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_HierarchyDetailsHandler.h; path = Src/Main/Server/Connection/RequestHandler/LKS_HierarchyDetailsHandler.h; sourceTree = ""; }; + 27BBD1EF2FA93D420264224AAFDB346F /* Masonry.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.debug.xcconfig; sourceTree = ""; }; + 27DBD37CA00D46F9E675FBD0A123CF21 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; + 27F231C28D0C004102CE0F6380753C42 /* SDImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOCoder.h; path = SDWebImage/Core/SDImageIOCoder.h; sourceTree = ""; }; + 28044484DF43321746ED7EE2E8CE92EC /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = MJExtension/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 28162E57FEF7AEFCBD1DF2DA5265929F /* Bugly.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Bugly.framework; sourceTree = ""; }; 281686F4C9CC2C718B45E1DEB7E63948 /* Pods-CustomKeyboard-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-CustomKeyboard-acknowledgements.markdown"; sourceTree = ""; }; - 29834704EC1453F0ACBDF5CAA435E7B0 /* SDWebImageDownloaderDecryptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderDecryptor.h; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.h; sourceTree = ""; }; - 29AFC65F883E204F73DDE040C829BC77 /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = ""; }; - 29DD9709CE876731037B630B8F1370DA /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; + 283AB44ABB83D8E9379522F7DA0C9F41 /* UIView+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+LookinServer.h"; path = "Src/Main/Server/Category/UIView+LookinServer.h"; sourceTree = ""; }; + 284474120A851CCF4B959DA801DFA788 /* ResourceBundle-SDWebImage-SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SDWebImage-SDWebImage-Info.plist"; sourceTree = ""; }; + 28BBA0E685399A782E77B8A5A0D610E8 /* SDWebImageError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageError.m; path = SDWebImage/Core/SDWebImageError.m; sourceTree = ""; }; + 2A9F390A64D12DF562DD8E40B2B719DA /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = ""; }; 2B276B0A79173A1D6E83C9B4FB9A4A57 /* MJExtension */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MJExtension; path = MJExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 2B8247E0ADA45F5408F3DE8313900894 /* AFCompatibilityMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFCompatibilityMacros.h; path = AFNetworking/AFCompatibilityMacros.h; sourceTree = ""; }; - 2C0A8B13D619D89C3E57F4B83ACBF157 /* SDImageTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageTransformer.h; path = SDWebImage/Core/SDImageTransformer.h; sourceTree = ""; }; - 2CCDC185ACCEFD6ACB87234F081FC1A1 /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = ""; }; - 2CCE60F6B1B48663415E0A4BC9662B33 /* MASViewAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewAttribute.h; path = Masonry/MASViewAttribute.h; sourceTree = ""; }; - 2D2A2C7E78B1029B85E812A9CC5D4F58 /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = ""; }; - 2D68500D4C2F7DB8B114E62F888BDD85 /* MJExtensionConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtensionConst.h; path = MJExtension/MJExtensionConst.h; sourceTree = ""; }; - 2E459098B6FF83AA9172F97696B64090 /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+MJRefresh.h"; path = "MJRefresh/NSBundle+MJRefresh.h"; sourceTree = ""; }; - 2EFA72948DE45F4B6CAD9DA5C625D259 /* MJRefreshConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConfig.m; path = MJRefresh/MJRefreshConfig.m; sourceTree = ""; }; - 305FF55ADA3393924EFC2D4B6D38166D /* SDImageCachesManagerOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManagerOperation.m; path = SDWebImage/Private/SDImageCachesManagerOperation.m; sourceTree = ""; }; - 3126B87E909122AFEE37CA26F800E7D9 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = ""; }; - 31F5F018A672BC56D29258EEBC019C32 /* MJExtensionConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJExtensionConst.m; path = MJExtension/MJExtensionConst.m; sourceTree = ""; }; - 32EACA7B3E95EF3C511EEAED34B5C23A /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = ""; }; - 33152C1C1E9FE19D1E9C8D8BF0C963DA /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/Core/SDWebImageOperation.h; sourceTree = ""; }; - 3316E3BF456739AB7A0F0FD1920F5F6B /* MJExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.debug.xcconfig; sourceTree = ""; }; - 33EBB93597383ED9EEA18C0A9BCE3B84 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "ViewController+MASAdditions.m"; path = "Masonry/ViewController+MASAdditions.m"; sourceTree = ""; }; - 34B9AAE9B2C02781F4AC71AEDB56A439 /* MJRefreshStateTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateTrailer.m; path = MJRefresh/Custom/Trailer/MJRefreshStateTrailer.m; sourceTree = ""; }; - 34CEE2DA708B82493E132F274E2E9493 /* SDImageGraphics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGraphics.h; path = SDWebImage/Core/SDImageGraphics.h; sourceTree = ""; }; - 34E2AA501576A0C5221012B9066EC56A /* SDAssociatedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAssociatedObject.h; path = SDWebImage/Private/SDAssociatedObject.h; sourceTree = ""; }; - 34F1A2FD98EEB8019052FBD5528585C9 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; - 3526591F674CF19FB39EF872089A7F49 /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = ""; }; + 2BAD1F27E9FC617CBBAB146C0BA99F46 /* UIImageView+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+LookinServer.h"; path = "Src/Main/Server/Category/UIImageView+LookinServer.h"; sourceTree = ""; }; + 2D2CD83C67F05747C39D88CED9A5DDBC /* LKS_HierarchyDisplayItemsMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_HierarchyDisplayItemsMaker.m; path = Src/Main/Server/Others/LKS_HierarchyDisplayItemsMaker.m; sourceTree = ""; }; + 2DDC5CE94B3CD031DD7B5BC418DDC09E /* SDImageAssetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAssetManager.h; path = SDWebImage/Private/SDImageAssetManager.h; sourceTree = ""; }; + 2E29830F3F03359FA3D6E5051EA37BE8 /* LookinCustomAttrModification.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinCustomAttrModification.m; path = Src/Main/Shared/LookinCustomAttrModification.m; sourceTree = ""; }; + 2EA9A6385695AF05307948AD57B725B2 /* SDWebImageOptionsProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOptionsProcessor.m; path = SDWebImage/Core/SDWebImageOptionsProcessor.m; sourceTree = ""; }; + 2FA4B9B10356D7846EAC732784AE4B60 /* LKS_CustomAttrSetterManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_CustomAttrSetterManager.h; path = Src/Main/Server/Others/LKS_CustomAttrSetterManager.h; sourceTree = ""; }; + 2FF6894CC33A836717208C1596FFDF36 /* MJRefreshNormalTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalTrailer.h; path = MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h; sourceTree = ""; }; + 3040952A3BB90E1A48E70463CF6AC78E /* LookinAttrIdentifiers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAttrIdentifiers.m; path = Src/Main/Shared/LookinAttrIdentifiers.m; sourceTree = ""; }; + 30738EF48289437474189DD2B1C18680 /* LookinAttributeModification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAttributeModification.h; path = Src/Main/Shared/LookinAttributeModification.h; sourceTree = ""; }; + 31473DD60D4305B7DA741C55F921ED28 /* MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtension.h; path = MJExtension/MJExtension.h; sourceTree = ""; }; + 33572E44B9E84887832C0BA36262B529 /* MJRefreshTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshTrailer.h; path = MJRefresh/Base/MJRefreshTrailer.h; sourceTree = ""; }; + 335C85A867FBD4B2CEEC783F95659782 /* MJRefresh.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.debug.xcconfig; sourceTree = ""; }; + 33AB41E897E484FEC64F2BEBBA7AA40C /* NSString+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+MJExtension.h"; path = "MJExtension/NSString+MJExtension.h"; sourceTree = ""; }; + 350E7CC7CBBC3075A763B5DD04615877 /* MJProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJProperty.h; path = MJExtension/MJProperty.h; sourceTree = ""; }; + 354321D8D4D2663CC74E3C8C7010C963 /* LKS_InbuiltAttrModificationHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_InbuiltAttrModificationHandler.m; path = Src/Main/Server/Connection/RequestHandler/LKS_InbuiltAttrModificationHandler.m; sourceTree = ""; }; + 355BA71055E49EFFC9C986A110289CEC /* SDWebImageError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageError.h; path = SDWebImage/Core/SDWebImageError.h; sourceTree = ""; }; 35BFA337F4E1FDE67C773A82CCDFD6DA /* Pods-keyBoard.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-keyBoard.debug.xcconfig"; sourceTree = ""; }; - 35F55EE8682F170A101CA85DD55D1B58 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = ""; }; - 371EEAE238A16CCB71633D3E6EF40F2B /* SDAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SDAnimatedImageView+WebCache.h"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.h"; sourceTree = ""; }; - 377FB4D51134D774594E6EAF0BB4DFAA /* UIImage+ExtendedCacheData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ExtendedCacheData.h"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.h"; sourceTree = ""; }; - 37DCC80FE271D2095A398F8D8F22C7E7 /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+MJRefresh.m"; path = "MJRefresh/NSBundle+MJRefresh.m"; sourceTree = ""; }; - 38A043FDCD06C3C9914C9A22FB6B1D28 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; - 396F4E7921EA26CDE8AAEADDD8CFBB49 /* Masonry.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.release.xcconfig; sourceTree = ""; }; - 3B4BB6924504E595528A838685E1B608 /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJExtension.m"; path = "MJRefresh/UIScrollView+MJExtension.m"; sourceTree = ""; }; + 36D5DF0AB990D1F11E146EA73B6AFFD5 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/Core/UIImage+GIF.h"; sourceTree = ""; }; + 36FE5D23FB2EF9BEB81A161D40B10342 /* UIImage+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+LookinServer.m"; path = "Src/Main/Server/Category/UIImage+LookinServer.m"; sourceTree = ""; }; + 3757A445F05F370F80774CD721B3AFF1 /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJRefresh.m"; path = "MJRefresh/UIScrollView+MJRefresh.m"; sourceTree = ""; }; + 37909A5A250D08DEFD5B5DE8C09C37F6 /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = ""; }; + 385C18376D7D7314789C812587A3B1A6 /* LookinCustomDisplayItemInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinCustomDisplayItemInfo.h; path = Src/Main/Shared/LookinCustomDisplayItemInfo.h; sourceTree = ""; }; + 3888E51E50172FB2ABE3D3D0E2C528B5 /* UIColor+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+LookinServer.m"; path = "Src/Main/Server/Category/UIColor+LookinServer.m"; sourceTree = ""; }; + 38C5D9064023A870F25FD047E1B0F535 /* SDAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageView.h; path = SDWebImage/Core/SDAnimatedImageView.h; sourceTree = ""; }; + 391472186DEB6AD02CB97FE31E7786DD /* SDAnimatedImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SDAnimatedImageView+WebCache.h"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.h"; sourceTree = ""; }; + 3914EA51A6CABD3AB197013F9FA20C33 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/Core/UIButton+WebCache.h"; sourceTree = ""; }; + 391A041C36FE7567BD540C5CE3F4E52A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = MJRefresh/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 3961BFF026424ABBD07A8DED78015F3B /* SDImageFramePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFramePool.m; path = SDWebImage/Private/SDImageFramePool.m; sourceTree = ""; }; + 398FC32341E8B23F05E8B88C228D8361 /* SDImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFrame.m; path = SDWebImage/Core/SDImageFrame.m; sourceTree = ""; }; + 3A066B727D20F282030A1ADDC6C93483 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = ""; }; + 3AE4997796DA358B1DB8A66215370EFB /* SDFileAttributeHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDFileAttributeHelper.h; path = SDWebImage/Private/SDFileAttributeHelper.h; sourceTree = ""; }; + 3AEEF11037C1BCFE69D6DA00C1F6DB71 /* SDAsyncBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAsyncBlockOperation.h; path = SDWebImage/Private/SDAsyncBlockOperation.h; sourceTree = ""; }; + 3BA822CC1E8CF917E43841631FD377CF /* NSObject+MJClass.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJClass.m"; path = "MJExtension/NSObject+MJClass.m"; sourceTree = ""; }; + 3BBC54810CE213EDD92DD4CE11A399A8 /* UIImage+Metadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Metadata.m"; path = "SDWebImage/Core/UIImage+Metadata.m"; sourceTree = ""; }; + 3BD084A818C3461AD1629F9205885E5E /* UIView+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+LookinServer.m"; path = "Src/Main/Server/Category/UIView+LookinServer.m"; sourceTree = ""; }; + 3CAC61D29948B64BA8051D1562B8B48A /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = ""; }; 3CB13D51E717D347023EEB57263E3072 /* Pods-CustomKeyboard-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-CustomKeyboard-dummy.m"; sourceTree = ""; }; - 3D5935FEEF657D48BF93BE04A41CF816 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = ""; }; - 3F58F61640AAFD16139A83CC4EA55B1D /* MASUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASUtilities.h; path = Masonry/MASUtilities.h; sourceTree = ""; }; - 3FBCEF9827DD721BAF021C98F7311D30 /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = ""; }; - 4090C24D16A324EB9D2A6747886BD217 /* SDDeviceHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDeviceHelper.m; path = SDWebImage/Private/SDDeviceHelper.m; sourceTree = ""; }; - 42134A400043398C196C2BDF73B21075 /* SDAsyncBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAsyncBlockOperation.h; path = SDWebImage/Private/SDAsyncBlockOperation.h; sourceTree = ""; }; - 429C09B93893D24656048D336CE95D59 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/Core/UIImage+GIF.h"; sourceTree = ""; }; - 42FE2C6A18379D9944FBBA606FB88133 /* SDImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGIFCoder.m; path = SDWebImage/Core/SDImageGIFCoder.m; sourceTree = ""; }; + 3EFE803ED03E92B2B8EC05A0FC2130D3 /* Color+Lookin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "Color+Lookin.m"; path = "Src/Main/Shared/Category/Color+Lookin.m"; sourceTree = ""; }; + 3F4964A87C231B4E7FCB7761033A3CE7 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/Core/SDImageCache.h; sourceTree = ""; }; + 3FEDE0FBCBA817765A1C7A879A27434B /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/Core/UIImageView+WebCache.h"; sourceTree = ""; }; + 40046208DED5819A627DD0A5AEAB8EB7 /* NSObject+MJClass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJClass.h"; path = "MJExtension/NSObject+MJClass.h"; sourceTree = ""; }; + 4100F303D221E90FB5552B8BADAD3D1B /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = ""; }; + 41DA7358EB7CB91409C1C9F11F5C3EBA /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/Core/SDWebImageManager.m; sourceTree = ""; }; + 41DAF3643DD99F049E89894109A00BDD /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = ""; }; + 424E1CD2A8804E0A1724D8EADA301314 /* LookinDisplayItemDetail.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinDisplayItemDetail.m; path = Src/Main/Shared/LookinDisplayItemDetail.m; sourceTree = ""; }; + 42516AE5009205BBCFD63441B614A7E7 /* LookinAttributesSection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAttributesSection.m; path = Src/Main/Shared/LookinAttributesSection.m; sourceTree = ""; }; + 427721CF1489C69E69EFD257F673200D /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/Core/NSButton+WebCache.m"; sourceTree = ""; }; + 42C02903F3EC2EF8D2384DC86D04D1AB /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; + 436D2261BEEF1C4B3FB973E64413A09F /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; }; 43EAAD2AB7E6B407E80E95F643F93D22 /* MJExtension-MJExtension */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "MJExtension-MJExtension"; path = MJExtension.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 4638EBD469283AF4DC5CBD3CE927D254 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/Core/UIButton+WebCache.m"; sourceTree = ""; }; - 46F91B0801CEBD1D73003708566CC913 /* UIImage+Metadata.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Metadata.m"; path = "SDWebImage/Core/UIImage+Metadata.m"; sourceTree = ""; }; - 4797723C6D7C918B816F46FCFB028F6F /* UIImage+MemoryCacheCost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MemoryCacheCost.h"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.h"; sourceTree = ""; }; - 4830CF5BA96EF2AA3AC7496D62A49A0D /* MJFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJFoundation.m; path = MJExtension/MJFoundation.m; sourceTree = ""; }; - 48E4A519DF8188F67D6109DB1AF82FF9 /* SDDisplayLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDisplayLink.m; path = SDWebImage/Private/SDDisplayLink.m; sourceTree = ""; }; - 4A71363040CF6A8E6D918CEF79A555D5 /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = SDWebImage/Core/SDWebImageCacheSerializer.h; sourceTree = ""; }; - 4AFCF05D160C4A925AEC624ED1CD826F /* NSObject+MJProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJProperty.m"; path = "MJExtension/NSObject+MJProperty.m"; sourceTree = ""; }; - 4B22EE0B7D2C1D1066750C4AB84FDA27 /* MJExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.release.xcconfig; sourceTree = ""; }; - 4C41FE7B076060F0600FEC9D5AFF762A /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; - 4C64CBB1952BF537420E489E4AF7DED5 /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJRefresh.h"; path = "MJRefresh/UIScrollView+MJRefresh.h"; sourceTree = ""; }; - 4CD2E3B8C4EBAB8CE1F46D4D7B1B5CAA /* Bugly.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bugly.debug.xcconfig; sourceTree = ""; }; - 4EF47C40D45E06BA89946B4C9F04A546 /* Masonry.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.debug.xcconfig; sourceTree = ""; }; - 4F51691B6717B6D9E4E3FE0977CF3163 /* SDWebImageDownloaderResponseModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderResponseModifier.m; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.m; sourceTree = ""; }; - 50DC89AF710F42BFF3D4C048EFAC8BB7 /* SDImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoader.h; path = SDWebImage/Core/SDImageLoader.h; sourceTree = ""; }; - 517973DC2D89829B73698FF20240431A /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; - 523BDC065F0AF63F170A84FAF905FD26 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; - 52AA08F30FFF4D9FF32F48E3AC195A6A /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; - 52AD4C798F619843C6425BB666EE43A0 /* MASLayoutConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLayoutConstraint.h; path = Masonry/MASLayoutConstraint.h; sourceTree = ""; }; + 43EBB3C244FB3EC69D90D12B011B7D4F /* SDImageCacheDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheDefine.m; path = SDWebImage/Core/SDImageCacheDefine.m; sourceTree = ""; }; + 441C15832925B6A3561346ADCC0F3591 /* LookinServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = LookinServer.modulemap; sourceTree = ""; }; + 448429D0C0BEB975134960D1DC282A12 /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = ""; }; + 44A4252246EC49F62F0C25505E934B16 /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = ""; }; + 44D55FDE34D60D0A3766885FFAA60ACC /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJExtension.m"; path = "MJRefresh/UIScrollView+MJExtension.m"; sourceTree = ""; }; + 452A668763CDF94BDE8E00DEBEA3CBFD /* SDImageAWebPCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAWebPCoder.h; path = SDWebImage/Core/SDImageAWebPCoder.h; sourceTree = ""; }; + 456AC6BFC6F1376659E96E494E05B72B /* LookinWeakContainer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinWeakContainer.h; path = Src/Main/Shared/LookinWeakContainer.h; sourceTree = ""; }; + 45A31347DD6C3F7EE0F37263613AAE10 /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJRefresh-dummy.m"; sourceTree = ""; }; + 45E4723FBE71FF9ADE4AB2F76D2DA14F /* LKS_GestureTargetActionsSearcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_GestureTargetActionsSearcher.m; path = Src/Main/Server/Others/LKS_GestureTargetActionsSearcher.m; sourceTree = ""; }; + 463E1287B5A31340EBA5533E07F066C4 /* MJRefreshNormalTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalTrailer.m; path = MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.m; sourceTree = ""; }; + 46ABF3C07C780ABA5090E971A8BA3659 /* SDImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGIFCoder.m; path = SDWebImage/Core/SDImageGIFCoder.m; sourceTree = ""; }; + 484B42214B225457DE36B4C078B84B99 /* SDWebImageDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDefine.m; path = SDWebImage/Core/SDWebImageDefine.m; sourceTree = ""; }; + 48F7FA6256DAD683842D571B6AF77F51 /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = ""; }; + 491BA663479FAFE4EBCADBC2B81F42CD /* Masonry-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-prefix.pch"; sourceTree = ""; }; + 4971D64582BFFE7AABA697FE6171D9AC /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; + 4A635255686FD2FCD8C5CAC9FEE2DF53 /* SDWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWeakProxy.m; path = SDWebImage/Private/SDWeakProxy.m; sourceTree = ""; }; + 4AC69AA60F0E51E261AA9071D16524F8 /* LKS_MultiplatformAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_MultiplatformAdapter.h; path = Src/Main/Server/Others/LKS_MultiplatformAdapter.h; sourceTree = ""; }; + 4AD66CE6D722E5E886958FE0F99A6DA6 /* UIImage+ExtendedCacheData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ExtendedCacheData.h"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.h"; sourceTree = ""; }; + 4C5D8C455EC9ADE90A57284C2BEAF681 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + 4DD4CF37CC301AC7FE2A7E1D6E25262A /* LKS_ConnectionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_ConnectionManager.h; path = Src/Main/Server/Connection/LKS_ConnectionManager.h; sourceTree = ""; }; + 4E632E9EC94233CBF7A6E9F6C8A0F560 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/Core/SDWebImageOperation.h; sourceTree = ""; }; + 4E6D72207BDDCDC558D0C6F315A4D52A /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/Core/UIImageView+WebCache.m"; sourceTree = ""; }; + 4FB34E0E78E7FB13DDF20F067BE65187 /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; + 5056018B2BE1CBBCA76F0A1E0653D4D3 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; + 5083F1C9E5A258671D4A20ADDB000283 /* SDDeviceHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDeviceHelper.m; path = SDWebImage/Private/SDDeviceHelper.m; sourceTree = ""; }; + 50FF239901B003C3F00C684A8C24FABA /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/Core/SDImageCache.m; sourceTree = ""; }; + 51A28B0F46A9250A309DFBCF68529D46 /* UICollectionViewLayout+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewLayout+MJRefresh.m"; path = "MJRefresh/UICollectionViewLayout+MJRefresh.m"; sourceTree = ""; }; + 521CE5DFBD4FA9519A07333FD40087EE /* LKS_AttrModificationPatchHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_AttrModificationPatchHandler.h; path = Src/Main/Server/Connection/RequestHandler/LKS_AttrModificationPatchHandler.h; sourceTree = ""; }; 5327DD01C6533D102D66E1636B3827F3 /* Pods-keyBoard-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-keyBoard-acknowledgements.plist"; sourceTree = ""; }; - 53392BC7B7115E12AC2077F4447BF455 /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = ""; }; - 56347C360CEDAA8246A01A213DEBBF8B /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - 5679D7FEFDE3E519C17C0EAAA7867122 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+MASDebugAdditions.h"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; }; - 568638C925360332377ACFB503131A76 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = ""; }; - 569FA95248CF0B824C3928196386FFC2 /* MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtension.h; path = MJExtension/MJExtension.h; sourceTree = ""; }; - 5713367A1E361064DE338AB389631FF5 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = ""; }; - 575E3DAA2F5DDC8FBD895B8BEA5FB8C6 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = ""; }; - 5A50D4A4631B759E5D73FDFF78C8BF75 /* NSObject+MJClass.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJClass.m"; path = "MJExtension/NSObject+MJClass.m"; sourceTree = ""; }; - 5AC074355067D4E88EB993DD28E44948 /* MASConstraint+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASConstraint+Private.h"; path = "Masonry/MASConstraint+Private.h"; sourceTree = ""; }; + 55DC88EAB1707FF0C1E1A085175B04B7 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/Core/UIImage+ForceDecode.h"; sourceTree = ""; }; + 562970F3419C1EB0AEBC96577B7475A7 /* SDImageCachesManagerOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManagerOperation.m; path = SDWebImage/Private/SDImageCachesManagerOperation.m; sourceTree = ""; }; + 5630EC1015102C0EF4C6B8B7664C338C /* LookinServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LookinServer-dummy.m"; sourceTree = ""; }; + 564C2CDD0AE1B9DE54315A467EA6BBB5 /* LookinCustomAttrModification.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinCustomAttrModification.h; path = Src/Main/Shared/LookinCustomAttrModification.h; sourceTree = ""; }; + 578E6DCE361C9C2FFED74421BE9E53CF /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; + 58F260DB3140258F92F78788594C313F /* LKS_RequestHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_RequestHandler.h; path = Src/Main/Server/Connection/LKS_RequestHandler.h; sourceTree = ""; }; + 59556424F69D2F15031FF91203C5B1D7 /* Lookin_PTUSBHub.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Lookin_PTUSBHub.m; path = Src/Main/Shared/Peertalk/Lookin_PTUSBHub.m; sourceTree = ""; }; + 59D4DABB171BC7F7B030B3ABE69E9840 /* SDWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImage.h; path = WebImage/SDWebImage.h; sourceTree = ""; }; + 5A001068B47EC5E23C991C85B5D1DC80 /* Masonry.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.release.xcconfig; sourceTree = ""; }; + 5A9B1B38878AB3338A36D3D2DD4CBA99 /* UIImage+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+LookinServer.h"; path = "Src/Main/Server/Category/UIImage+LookinServer.h"; sourceTree = ""; }; + 5AE82ACD8457FC1F884B6922FEF63CB6 /* LKS_CustomAttrModificationHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_CustomAttrModificationHandler.h; path = Src/Main/Server/Connection/RequestHandler/LKS_CustomAttrModificationHandler.h; sourceTree = ""; }; 5BA0325112AB8CA7AB613D1A8ED2DB65 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 5DD19473CA2658646B964B6124A31FB9 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; - 5E8106411081DD6C7F5FE7804947412C /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = ""; }; - 5FD6594A1D1613C90FF5EF2CBD5CE123 /* SDGraphicsImageRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDGraphicsImageRenderer.h; path = SDWebImage/Core/SDGraphicsImageRenderer.h; sourceTree = ""; }; - 5FDFD2C717749B65FE64DACB99DF72A3 /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = ""; }; - 6134DA50CBB0F618C7502B9B4E23963F /* Bugly.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bugly.release.xcconfig; sourceTree = ""; }; - 61B4061AC178FEE58C9618133524CF08 /* SDmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDmetamacros.h; path = SDWebImage/Private/SDmetamacros.h; sourceTree = ""; }; - 61D0A0EB33F4B0A380D6DE9E8E5D56D7 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = ""; }; + 5CC1CB26EBFBA958C44A45620E65D37E /* Image+Lookin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "Image+Lookin.m"; path = "Src/Main/Shared/Category/Image+Lookin.m"; sourceTree = ""; }; + 5CDE75D520BF5D9777D6ACD7798BC004 /* Lookin_PTUSBHub.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Lookin_PTUSBHub.h; path = Src/Main/Shared/Peertalk/Lookin_PTUSBHub.h; sourceTree = ""; }; + 5D2FE77EBB4DA88368FEE0FB24854873 /* NSBezierPath+SDRoundedCorners.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBezierPath+SDRoundedCorners.h"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.h"; sourceTree = ""; }; + 5D9B7125C481E0586F9468DEBF3E76F8 /* MJPropertyType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJPropertyType.h; path = MJExtension/MJPropertyType.h; sourceTree = ""; }; + 5E02261623C97F02C5D19CEDE7158EFF /* SDImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOCoder.m; path = SDWebImage/Core/SDImageIOCoder.m; sourceTree = ""; }; + 5E63090732AA98A187ADDAF8E4372AFA /* MJRefresh.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MJRefresh.modulemap; sourceTree = ""; }; + 5EFF5F769414BBE23E36B9213F813FB6 /* LookinDashboardBlueprint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinDashboardBlueprint.m; path = Src/Main/Shared/LookinDashboardBlueprint.m; sourceTree = ""; }; + 5F3E14867B8E7450AEDEDA2617BA5FB2 /* UITextView+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextView+LookinServer.m"; path = "Src/Main/Server/Category/UITextView+LookinServer.m"; sourceTree = ""; }; + 5F586E3EC54302A6896FBF08F870CAD9 /* LKS_Helper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_Helper.h; path = Src/Main/Server/Others/LKS_Helper.h; sourceTree = ""; }; + 6091D6A70F537A0BB9A74FFBC706B561 /* MJPropertyKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJPropertyKey.h; path = MJExtension/MJPropertyKey.h; sourceTree = ""; }; + 6126457E7DC341A20EBE987BF5EFBC07 /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = ""; }; + 627BA8BB2ACD90F8F5EE6A82DB3C8A30 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "ViewController+MASAdditions.m"; path = "Masonry/ViewController+MASAdditions.m"; sourceTree = ""; }; + 63F82FBA430AAB56CCE50AA74B7449A4 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; + 63FEF4A55AABED2088DA6B42E280D2B7 /* WKWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "WKWebView+AFNetworking.m"; path = "UIKit+AFNetworking/WKWebView+AFNetworking.m"; sourceTree = ""; }; 641251D3092FFCF2B6259BF8676A212E /* Pods-CustomKeyboard-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-CustomKeyboard-Info.plist"; sourceTree = ""; }; - 646B483EDAD1F8B7F96981EB5E185F2E /* SDWebImageError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageError.h; path = SDWebImage/Core/SDWebImageError.h; sourceTree = ""; }; - 661BCD3C752D21E81C83DA14D3C4502A /* SDGraphicsImageRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDGraphicsImageRenderer.m; path = SDWebImage/Core/SDGraphicsImageRenderer.m; sourceTree = ""; }; - 678A010D7D73785C1E08D97B5F67AAAA /* SDCallbackQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDCallbackQueue.h; path = SDWebImage/Core/SDCallbackQueue.h; sourceTree = ""; }; - 67DDCFED9CF39A1F995D9E7B12E35A7E /* SDWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImage.h; path = WebImage/SDWebImage.h; sourceTree = ""; }; - 6C4CAA32BF7068345545D717BAAF7069 /* SDWebImageCacheSerializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheSerializer.m; path = SDWebImage/Core/SDWebImageCacheSerializer.m; sourceTree = ""; }; - 6DE36A434A8BD3593CCBD95090373332 /* SDWebImageDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDefine.m; path = SDWebImage/Core/SDWebImageDefine.m; sourceTree = ""; }; - 6DFD30C63C15966EA8BF3CAD55EB97F8 /* SDDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDiskCache.h; path = SDWebImage/Core/SDDiskCache.h; sourceTree = ""; }; - 6E7A746456C4F5E2C887572055F6A833 /* SDImageTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageTransformer.m; path = SDWebImage/Core/SDImageTransformer.m; sourceTree = ""; }; - 6EB624EDC7B2F6F92D5F6AEF8AAA4356 /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "ViewController+MASAdditions.h"; path = "Masonry/ViewController+MASAdditions.h"; sourceTree = ""; }; - 70330531B46EEB4398625F2AFC6683E5 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; - 71A4B6E144674403F50435C67561B1BB /* WKWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "WKWebView+AFNetworking.m"; path = "UIKit+AFNetworking/WKWebView+AFNetworking.m"; sourceTree = ""; }; - 71B30FE27ADA94703A3F06804277A5C0 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = ""; }; - 71C9A7FB9BC0D7C0FA902D0643B08962 /* MASConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraint.h; path = Masonry/MASConstraint.h; sourceTree = ""; }; - 724FB5172055CF20AE6E6F4D007D8038 /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = ""; }; - 72789BA685A26A276A98609F54509572 /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-prefix.pch"; sourceTree = ""; }; - 7315702A1F332F57A8765F720EE5B18F /* SDImageAWebPCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAWebPCoder.h; path = SDWebImage/Core/SDImageAWebPCoder.h; sourceTree = ""; }; - 73D1ED74B2085AA85B8213943DE4AD83 /* MJRefreshNormalTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalTrailer.h; path = MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.h; sourceTree = ""; }; - 74446596F2A689B17D9187482A194EEC /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; - 74CC813EBCFDBA413D1E8F2AE302E41A /* MJRefresh.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.debug.xcconfig; sourceTree = ""; }; - 7506ED7F0118C1C5FE230328CCC6543E /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; - 755B7205B482C6B79DEAE02978E7FD20 /* SDWebImageTransitionInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransitionInternal.h; path = SDWebImage/Private/SDWebImageTransitionInternal.h; sourceTree = ""; }; - 76F97ACAD92849B1F665FD0FF282B3C8 /* SDWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOperation.m; path = SDWebImage/Core/SDWebImageOperation.m; sourceTree = ""; }; - 7842E350E0D12563DE7C0EB363356BF8 /* MJPropertyType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyType.m; path = MJExtension/MJPropertyType.m; sourceTree = ""; }; - 7869EB02C0774141B550180F17DBF9F0 /* SDImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoader.m; path = SDWebImage/Core/SDImageLoader.m; sourceTree = ""; }; - 78744B8D1235EE30BFB429D8C13D63F4 /* AFNetworking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.debug.xcconfig; sourceTree = ""; }; - 7980625AB48FABAF33EDB825FF587011 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/Core/SDWebImageCompat.m; sourceTree = ""; }; - 7A46DCA8F7BDEE6453116CAF6CBBAC40 /* NSBezierPath+SDRoundedCorners.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBezierPath+SDRoundedCorners.h"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.h"; sourceTree = ""; }; - 7AE552655E7E703CCEDD4BE44EFA5662 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; - 7B6867FF0B2276E04032D8E5C44B4EB9 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = ""; }; - 7C1791A7C256B13C227BF8DAE4C2EFE9 /* MASConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraint.m; path = Masonry/MASConstraint.m; sourceTree = ""; }; - 7C38C5957F4EAC459AB28A71622C865C /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = SDWebImage/Core/SDImageAPNGCoder.h; sourceTree = ""; }; - 7D3CFDF279C9B9946089A89EFB72A50D /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/Core/UIView+WebCache.m"; sourceTree = ""; }; - 7D4327E5DC3980134C42B829E8798AA4 /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = ""; }; - 7D8FF130378AA0390E3754AB93673319 /* MJProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJProperty.h; path = MJExtension/MJProperty.h; sourceTree = ""; }; + 6462CD790803203FFC45008B85E0C555 /* MJExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.debug.xcconfig; sourceTree = ""; }; + 64CC1902F2F86AF9B5F4F7FBCDA7C2AE /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/Core/SDWebImageManager.h; sourceTree = ""; }; + 64E7ACD01BBC889248107EDDA2D34EC5 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; + 668C50C1ADE5AD0F61431E1CC0366B5C /* SDImageGraphics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGraphics.h; path = SDWebImage/Core/SDImageGraphics.h; sourceTree = ""; }; + 66F2BE6DE434172227ECC11F2576619D /* LKS_InbuiltAttrModificationHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_InbuiltAttrModificationHandler.h; path = Src/Main/Server/Connection/RequestHandler/LKS_InbuiltAttrModificationHandler.h; sourceTree = ""; }; + 6708CFA86C80E1A6A83E259D47D3EAFC /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; + 67D77E75D0263CDFA569481CA359AE73 /* LookinAttributesGroup.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAttributesGroup.m; path = Src/Main/Shared/LookinAttributesGroup.m; sourceTree = ""; }; + 6804931A02925CC75742598277F91E7D /* Masonry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Masonry.h; path = Masonry/Masonry.h; sourceTree = ""; }; + 6A632FE340768C393869A04A3FA157E8 /* MJFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJFoundation.h; path = MJExtension/MJFoundation.h; sourceTree = ""; }; + 6AE4DE6EA99247529F51CDC210E1B91A /* LKS_CustomDisplayItemsMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_CustomDisplayItemsMaker.h; path = Src/Main/Server/Others/LKS_CustomDisplayItemsMaker.h; sourceTree = ""; }; + 6AF531BDD77E2C93F3A9EB19FC90C677 /* MASUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASUtilities.h; path = Masonry/MASUtilities.h; sourceTree = ""; }; + 6B33E2C4415F95B948BC836B89DB55B0 /* LookinAttrType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAttrType.h; path = Src/Main/Shared/LookinAttrType.h; sourceTree = ""; }; + 6B3EDE613D2E648606F454799D40CFA3 /* MJExtension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MJExtension.modulemap; sourceTree = ""; }; + 6B52C45975B621E9B4889D036BAA8D0F /* LookinHierarchyInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinHierarchyInfo.m; path = Src/Main/Shared/LookinHierarchyInfo.m; sourceTree = ""; }; + 6D85FFA2C73630F2AF77342E129DC16E /* SDInternalMacros.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDInternalMacros.m; path = SDWebImage/Private/SDInternalMacros.m; sourceTree = ""; }; + 6E8A92EE0A2A6F0F83B7C2C369B3FC1E /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/Core/UIImage+ForceDecode.m"; sourceTree = ""; }; + 6EFA5E35451613555520D318C62A6A0D /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; + 70BBFC2B49529B31B7D32BD0FAB0EADF /* LKS_HierarchyDisplayItemsMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_HierarchyDisplayItemsMaker.h; path = Src/Main/Server/Others/LKS_HierarchyDisplayItemsMaker.h; sourceTree = ""; }; + 70DF286705B2D1D7B78C7AA955BA2606 /* LookinDisplayItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinDisplayItem.m; path = Src/Main/Shared/LookinDisplayItem.m; sourceTree = ""; }; + 714B36235F9909A284858B25FE2E5788 /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = ""; }; + 715B54C7081C9B50766843BEF2736EA5 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = ""; }; + 71D84BFF9C97CD6ED2FAC67678A93852 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/Core/SDAnimatedImageRep.m; sourceTree = ""; }; + 720CFE8548CD7904294866C990785774 /* LookinServerDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinServerDefines.h; path = Src/Main/Server/Others/LookinServerDefines.h; sourceTree = ""; }; + 748A0893B4653646B0A27B7E0AC19FC8 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; + 756C6AB59627E794C95106401B7E91D7 /* LookinConnectionAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinConnectionAttachment.m; path = Src/Main/Shared/LookinConnectionAttachment.m; sourceTree = ""; }; + 75AC1BE9D1EBA73C1A7D6CBD7AFEFBB3 /* LookinConnectionResponseAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinConnectionResponseAttachment.h; path = Src/Main/Shared/LookinConnectionResponseAttachment.h; sourceTree = ""; }; + 7685E42E1081B69DDDDAF3A75A5FF5FB /* UIView+WebCacheState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheState.h"; path = "SDWebImage/Core/UIView+WebCacheState.h"; sourceTree = ""; }; + 7811748FB18DB56B40AF1874A5426811 /* SDDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDiskCache.m; path = SDWebImage/Core/SDDiskCache.m; sourceTree = ""; }; + 79089E0A7C9885BD8A68564AED25725D /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; + 794BDDB4DB750BE5FDB105674F99DBB6 /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = ""; }; + 796944267FD7D8F745B0D165AD82DDC8 /* SDWebImageOptionsProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOptionsProcessor.h; path = SDWebImage/Core/SDWebImageOptionsProcessor.h; sourceTree = ""; }; + 7A46011226423766627FE02357AA5C78 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/Core/UIImage+MultiFormat.m"; sourceTree = ""; }; + 7A558EBC67B242651FC5E37498D58C11 /* LookinServer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LookinServer-prefix.pch"; sourceTree = ""; }; + 7B3441C26C7AC549C4262F6A34D5D0C0 /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = ""; }; + 7B9AE4382704B83CA411FAF665D77860 /* SDAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageView.m; path = SDWebImage/Core/SDAnimatedImageView.m; sourceTree = ""; }; + 7C37FCE816213CE06FD25D1DD57DD164 /* MASConstraint+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASConstraint+Private.h"; path = "Masonry/MASConstraint+Private.h"; sourceTree = ""; }; + 7D5FD5B9915F367587FFCCA6A20E2F50 /* UIImageView+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+LookinServer.m"; path = "Src/Main/Server/Category/UIImageView+LookinServer.m"; sourceTree = ""; }; 7E3097CFEFDA621E9FB0E62009FF87FC /* MJRefresh-MJRefresh.Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "MJRefresh-MJRefresh.Privacy"; path = MJRefresh.Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 7E6DD5C54D7EC67B674C64E88446BAA7 /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = ""; }; - 7E72BDE0490314836A44AFEE2FD465C2 /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AFNetworking.modulemap; sourceTree = ""; }; - 801C19E603261CA9778C89D068D49697 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; - 80E9D6278C5650A6AD05F331651F6DEB /* SDImageLoadersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoadersManager.h; path = SDWebImage/Core/SDImageLoadersManager.h; sourceTree = ""; }; - 81D5F6E26D64BB94294CEC208FAEEBE2 /* SDAnimatedImagePlayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImagePlayer.h; path = SDWebImage/Core/SDAnimatedImagePlayer.h; sourceTree = ""; }; - 825CA08D9974B4E876CAFA68A0F53F93 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/Core/SDWebImageDownloaderOperation.m; sourceTree = ""; }; - 830D06A83C1E8E77E539514107F83812 /* SDImageGraphics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGraphics.m; path = SDWebImage/Core/SDImageGraphics.m; sourceTree = ""; }; - 8332CB32D0FA2CE8D910AA5A9BE18D8B /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/Core/SDImageCache.m; sourceTree = ""; }; - 840FE4FBC8DFDB4B1238B06FEA5AF259 /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/Core/UIImage+ForceDecode.m"; sourceTree = ""; }; - 8430A616C01FADC1B0DB9E5D08A03C35 /* SDImageHEICCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoder.h; path = SDWebImage/Core/SDImageHEICCoder.h; sourceTree = ""; }; - 851329DB564FCDDAD9A52952F487E28D /* UIColor+SDHexString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+SDHexString.h"; path = "SDWebImage/Private/UIColor+SDHexString.h"; sourceTree = ""; }; - 852C84F2242375BE5446ADE5B9509933 /* ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; sourceTree = ""; }; - 859BA7601F83844D2D2ABC395E386663 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; - 85AD1C60C75A73E360E4320DD271A77D /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; - 87A1195922F05E5D23FF9A3C4509A854 /* MJProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJProperty.m; path = MJExtension/MJProperty.m; sourceTree = ""; }; - 88799C33D6D0AAE2D395A1496F3A9E5D /* View+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASAdditions.h"; path = "Masonry/View+MASAdditions.h"; sourceTree = ""; }; - 897B6BFD5EA50E7440FD4FA3769B3C78 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/Core/UIImage+MultiFormat.h"; sourceTree = ""; }; - 8A926EA8E3863425810DDC585C464587 /* SDWebImageDownloaderConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderConfig.h; path = SDWebImage/Core/SDWebImageDownloaderConfig.h; sourceTree = ""; }; - 8AACAEAAD31005B66599055215ADA658 /* SDAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageView.h; path = SDWebImage/Core/SDAnimatedImageView.h; sourceTree = ""; }; - 8ABF0BFFB097FE97D207EBE5498289D3 /* MASConstraintMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraintMaker.m; path = Masonry/MASConstraintMaker.m; sourceTree = ""; }; - 8AF059A8B1C2B3EE76BCDE329D0C926E /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJRefresh.m"; path = "MJRefresh/UIScrollView+MJRefresh.m"; sourceTree = ""; }; - 8BECBF70665658E16C4E9DDD74C7161A /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = ""; }; - 8C0AB8960CBA6D24923E096B9378691C /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; - 8E7292A83C005323B245A7EF2737878F /* MJRefreshNormalTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalTrailer.m; path = MJRefresh/Custom/Trailer/MJRefreshNormalTrailer.m; sourceTree = ""; }; - 8FC489301C2534B7DD53B90720E80BF3 /* UIImage+ExtendedCacheData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ExtendedCacheData.m"; path = "SDWebImage/Core/UIImage+ExtendedCacheData.m"; sourceTree = ""; }; - 90687AA744E720C17FD8600B60F43FF5 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/Core/NSData+ImageContentType.m"; sourceTree = ""; }; - 916FC91BADACF2A6F0FF12F1385FC1D4 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/Core/SDWebImagePrefetcher.m; sourceTree = ""; }; - 92D14A3D3FA826806436A8CFCBD915DA /* Masonry-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-umbrella.h"; sourceTree = ""; }; - 93A3B9C517383784D38DA222632F5FFB /* SDWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWeakProxy.m; path = SDWebImage/Private/SDWeakProxy.m; sourceTree = ""; }; - 93D1581B25C7E0154AE410EBB56CE516 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/Core/SDImageCache.h; sourceTree = ""; }; - 93EB15003C1E2452E5C21AD7FF38A39D /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = ""; }; - 94F556719E0728E491D5BDF953E9A668 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = MJRefresh/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 950F7A4DEA1A2D31E4A650C9526788F7 /* MJPropertyType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJPropertyType.h; path = MJExtension/MJPropertyType.h; sourceTree = ""; }; + 803500457FA774DB0534BE80EADC55D2 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = ""; }; + 804BF40AEA86A02553D19951CB451042 /* LKS_CustomAttrSetterManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_CustomAttrSetterManager.m; path = Src/Main/Server/Others/LKS_CustomAttrSetterManager.m; sourceTree = ""; }; + 80795F8F1A43832D4B66BBD525759637 /* LookinAttributesSection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAttributesSection.h; path = Src/Main/Shared/LookinAttributesSection.h; sourceTree = ""; }; + 80CD54C66B12297780AB38A67326A123 /* MASLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLayoutConstraint.m; path = Masonry/MASLayoutConstraint.m; sourceTree = ""; }; + 81C1E48136A225905A857057912E10B9 /* SDImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFrame.h; path = SDWebImage/Core/SDImageFrame.h; sourceTree = ""; }; + 82BAD1603BF8AB0697F3B9EFE8195AB2 /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJExtension.h"; path = "MJRefresh/UIScrollView+MJExtension.h"; sourceTree = ""; }; + 83114C8E20B9B217E7EA43F9F77CC974 /* SDDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDiskCache.h; path = SDWebImage/Core/SDDiskCache.h; sourceTree = ""; }; + 836E51BD63F00FF107E843F3947DF237 /* SDImageAPNGCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAPNGCoder.h; path = SDWebImage/Core/SDImageAPNGCoder.h; sourceTree = ""; }; + 8375CF9CD2710851F31670C5AEC1681F /* MJExtensionConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJExtensionConst.m; path = MJExtension/MJExtensionConst.m; sourceTree = ""; }; + 838300FCEA5961F23F53260B6EBAB80D /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = ""; }; + 83CAB8352CBFBF9CE8EB6054C33B535E /* SDWebImageDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDefine.h; path = SDWebImage/Core/SDWebImageDefine.h; sourceTree = ""; }; + 840C5489E8F7E07E8F10036ACEA93B6D /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-umbrella.h"; sourceTree = ""; }; + 845E78A89BC68B640BB9D4766F2B6230 /* UIViewController+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIViewController+LookinServer.h"; path = "Src/Main/Server/Category/UIViewController+LookinServer.h"; sourceTree = ""; }; + 84A09578F37B017034C6F7BCB8F8E853 /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+MJRefresh.h"; path = "MJRefresh/NSBundle+MJRefresh.h"; sourceTree = ""; }; + 84FDFFDC449C8F153A09137D6EAAD4CC /* NSString+Lookin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+Lookin.h"; path = "Src/Main/Shared/Category/NSString+Lookin.h"; sourceTree = ""; }; + 851E0EFD5B18B0AC4C806169B724026F /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/Core/UIButton+WebCache.m"; sourceTree = ""; }; + 851E334AEAE8F7D2EAD4FEADAA487505 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/Core/SDWebImageCompat.h; sourceTree = ""; }; + 8624FE76D62EAB39E53F7E4261584FC5 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/Core/UIView+WebCacheOperation.h"; sourceTree = ""; }; + 8678FFD5CB056455C0EB7778B170EAF6 /* LKS_ObjectRegistry.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_ObjectRegistry.m; path = Src/Main/Server/Others/LKS_ObjectRegistry.m; sourceTree = ""; }; + 870308F72B6057F0D29396CFC0E51B4C /* MJRefresh.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.release.xcconfig; sourceTree = ""; }; + 8733305AC203407D393753CB75CDD02B /* SDImageIOAnimatedCoderInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOAnimatedCoderInternal.h; path = SDWebImage/Private/SDImageIOAnimatedCoderInternal.h; sourceTree = ""; }; + 8796350D3C821036D89B007D8F07CAED /* LookinServer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LookinServer.debug.xcconfig; sourceTree = ""; }; + 894200AB37ADDCF2E91E64941663B9CD /* UIColor+SDHexString.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+SDHexString.m"; path = "SDWebImage/Private/UIColor+SDHexString.m"; sourceTree = ""; }; + 89AD017EC26DF7AC4F66DFDB5DA0BD55 /* UICollectionViewLayout+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewLayout+MJRefresh.h"; path = "MJRefresh/UICollectionViewLayout+MJRefresh.h"; sourceTree = ""; }; + 8AAFEE50CF56B2103D056BC42C8FC0E3 /* LKS_MultiplatformAdapter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_MultiplatformAdapter.m; path = Src/Main/Server/Others/LKS_MultiplatformAdapter.m; sourceTree = ""; }; + 8C6CCE875C9DB21D337D98676A6F0AF1 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/Core/SDWebImageTransition.h; sourceTree = ""; }; + 8DC988FE587011D33A8D968D09574375 /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = ""; }; + 8DD0D105F9EEE0B4DAA94E912B8074BA /* SDWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWeakProxy.h; path = SDWebImage/Private/SDWeakProxy.h; sourceTree = ""; }; + 8DF165DDC3515F177F129981AF41F322 /* SDMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDMemoryCache.m; path = SDWebImage/Core/SDMemoryCache.m; sourceTree = ""; }; + 8F10AD41ECBDA2E31F4D0354293FF10D /* LKS_TraceManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_TraceManager.m; path = Src/Main/Server/Others/LKS_TraceManager.m; sourceTree = ""; }; + 8F6FB5B25BAE1ACEDCF42E5C0A4C81EE /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = SDWebImage/Core/SDImageAPNGCoder.m; sourceTree = ""; }; + 8F79F17D5D8DC4891FB5EBCEF14AED90 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = WebImage/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 908B6B0806B4B9F61D9989FC02488A48 /* LookinIvarTrace.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinIvarTrace.m; path = Src/Base/LookinIvarTrace.m; sourceTree = ""; }; + 914A62A570950E4D83A4EBE0062E5DB2 /* SDAnimatedImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SDAnimatedImageView+WebCache.m"; path = "SDWebImage/Core/SDAnimatedImageView+WebCache.m"; sourceTree = ""; }; + 920C3A261F36A2C648F90937F7072D84 /* LookinEventHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinEventHandler.m; path = Src/Main/Shared/LookinEventHandler.m; sourceTree = ""; }; + 9232737E755EBDB7E66DB0029B1DF11C /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = ""; }; + 924E3600D7E3752D66E60C342840C98A /* SDImageLoadersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoadersManager.h; path = SDWebImage/Core/SDImageLoadersManager.h; sourceTree = ""; }; + 92C09DB4E8BAF5800F087352EF2C4F48 /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = SDWebImage/Core/SDWebImageCacheKeyFilter.m; sourceTree = ""; }; + 93962A02113E51F674015AF1031E28E2 /* LookinObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinObject.m; path = Src/Main/Shared/LookinObject.m; sourceTree = ""; }; + 93D1AE46DAE9B08CD36A2DEBEF9E850F /* NSObject+MJProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJProperty.h"; path = "MJExtension/NSObject+MJProperty.h"; sourceTree = ""; }; + 94A0A26ED8D77A34A56CFCB4F479BBA1 /* Lookin_PTPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Lookin_PTPrivate.h; path = Src/Main/Shared/Peertalk/Lookin_PTPrivate.h; sourceTree = ""; }; + 952BB65CA9AECB7DA59B00E72F6C9A3C /* SDGraphicsImageRenderer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDGraphicsImageRenderer.h; path = SDWebImage/Core/SDGraphicsImageRenderer.h; sourceTree = ""; }; + 95A5615E32E88EE69FF2F104721935DD /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+MASAdditions.m"; path = "Masonry/NSArray+MASAdditions.m"; sourceTree = ""; }; + 96032E81848B76DBF42F21BD90E472F4 /* NSSet+Lookin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSSet+Lookin.m"; path = "Src/Main/Shared/Category/NSSet+Lookin.m"; sourceTree = ""; }; 969A9A842778EFB5D62826500DFF4E11 /* Pods-keyBoard-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-keyBoard-dummy.m"; sourceTree = ""; }; - 969BDA148FEBCD19E1B7701E7F70E539 /* SDWebImageDownloaderRequestModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderRequestModifier.h; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.h; sourceTree = ""; }; - 970B39752136D5831550118975DC4A91 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = MJExtension/PrivacyInfo.xcprivacy; sourceTree = ""; }; - 9784638759F544FA3CC67A7E0CA9454B /* Bugly.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Bugly.framework; sourceTree = ""; }; - 97F65BC08A412ED6706647722A834532 /* SDImageCacheDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheDefine.h; path = SDWebImage/Core/SDImageCacheDefine.h; sourceTree = ""; }; - 9802609AB0266E444A1BD29FA119D9BC /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = SDWebImage/Core/SDWebImageCacheKeyFilter.h; sourceTree = ""; }; - 982D370CD4E116E0C1917E832541C530 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - 98E94877A92313B71CB6789264CC6752 /* AFNetworking-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AFNetworking-Info.plist"; sourceTree = ""; }; - 9954286F43C39384A1EADABA9AAE0B0D /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/Core/SDAnimatedImageRep.m; sourceTree = ""; }; - 9ADF16A9C4A54B7486F74B1F31DE3947 /* Masonry-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Masonry-Info.plist"; sourceTree = ""; }; - 9AF4B903EB65570DDDE8731659809CA1 /* SDImageCacheDefine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheDefine.m; path = SDWebImage/Core/SDImageCacheDefine.m; sourceTree = ""; }; - 9B7D77CB378449CF4A7041A3EA89C102 /* SDImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFrame.m; path = SDWebImage/Core/SDImageFrame.m; sourceTree = ""; }; - 9C040DD9465E298ACD105143A3265009 /* NSImage+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+Compatibility.m"; path = "SDWebImage/Core/NSImage+Compatibility.m"; sourceTree = ""; }; - 9D403D54754F62E7ECBA2668B217E5FD /* NSObject+MJCoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJCoding.m"; path = "MJExtension/NSObject+MJCoding.m"; sourceTree = ""; }; + 97A61C6C7AE704F2C4E7790EA2165AA8 /* NSArray+Lookin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Lookin.m"; path = "Src/Main/Shared/Category/NSArray+Lookin.m"; sourceTree = ""; }; + 97A941D106C85302397B5B03771DB340 /* LKSConfigManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKSConfigManager.h; path = Src/Main/Server/Others/LKSConfigManager.h; sourceTree = ""; }; + 984CA174C8D3E831F87D9D84DD88440D /* LookinCustomDisplayItemInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinCustomDisplayItemInfo.m; path = Src/Main/Shared/LookinCustomDisplayItemInfo.m; sourceTree = ""; }; + 993FB7DD8F0F5CDE14006BCE526D824C /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/Core/SDImageCacheConfig.h; sourceTree = ""; }; + 998EEC31A73E8747C2ACCB121631445C /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "ViewController+MASAdditions.h"; path = "Masonry/ViewController+MASAdditions.h"; sourceTree = ""; }; + 99A76FE381DE593E9457E666DD4A9799 /* UIBlurEffect+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIBlurEffect+LookinServer.m"; path = "Src/Main/Server/Category/UIBlurEffect+LookinServer.m"; sourceTree = ""; }; + 9A0832105E3ABE8B885DD8711CB1DC9A /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; + 9BD2B0FEC06B60E4A994758E4B4E6A26 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/Core/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + 9C12A568F50663B0354C6A5190E85487 /* LookinConnectionAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinConnectionAttachment.h; path = Src/Main/Shared/LookinConnectionAttachment.h; sourceTree = ""; }; + 9CBEBBEC52C8B93FDED0B8E1E9DA1939 /* LKS_ExportManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_ExportManager.h; path = Src/Main/Server/Others/LKS_ExportManager.h; sourceTree = ""; }; + 9D13E946B329A0E46666436B3BF35A5B /* NSImage+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+Compatibility.m"; path = "SDWebImage/Core/NSImage+Compatibility.m"; sourceTree = ""; }; + 9D1B209E057B32F0F386DB8EED983370 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = ""; }; + 9D58F306C3C8B0AEE8145CC2A1BBF419 /* ResourceBundle-MJExtension-MJExtension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-MJExtension-MJExtension-Info.plist"; sourceTree = ""; }; + 9D5928FD36684070A4AF8169CF66A94A /* NSImage+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+Compatibility.h"; path = "SDWebImage/Core/NSImage+Compatibility.h"; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9DBD448EB576D346FBA1D20A1BD13F1D /* SDImageCachesManagerOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManagerOperation.h; path = SDWebImage/Private/SDImageCachesManagerOperation.h; sourceTree = ""; }; + 9DA067C7872BCFB73BBE4FB45B149A91 /* SDImageLoader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoader.m; path = SDWebImage/Core/SDImageLoader.m; sourceTree = ""; }; 9DDD0462C32F55EF5E9CB1056459809F /* Pods-CustomKeyboard-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-CustomKeyboard-umbrella.h"; sourceTree = ""; }; - 9E2F76F628A20AA296860E039C6A51DE /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/Core/UIButton+WebCache.h"; sourceTree = ""; }; - 9E3334C24AC0A37A21A6D9B9ECA94AB2 /* WKWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "WKWebView+AFNetworking.h"; path = "UIKit+AFNetworking/WKWebView+AFNetworking.h"; sourceTree = ""; }; - A11030FED687E26E2A7953D880C8DDD7 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/Core/SDWebImageTransition.m; sourceTree = ""; }; - A113F5BE027C0A2BC1CC3F420069F969 /* SDDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDiskCache.m; path = SDWebImage/Core/SDDiskCache.m; sourceTree = ""; }; - A1D6DA8B66269F171ED8918C664075F4 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/Core/SDWebImageDownloaderOperation.h; sourceTree = ""; }; - A1ECACF57484B51D17735566ED038104 /* SDImageLoadersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageLoadersManager.m; path = SDWebImage/Core/SDImageLoadersManager.m; sourceTree = ""; }; - A20073D67775A184A6AEF2667BC7628C /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = ""; }; - A294AA5EAB4FD3CAF8C4A072117591C1 /* SDInternalMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDInternalMacros.h; path = SDWebImage/Private/SDInternalMacros.h; sourceTree = ""; }; + 9DDE49FB8DD3D0926CB71DCCB48897F7 /* LKS_RequestHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_RequestHandler.m; path = Src/Main/Server/Connection/LKS_RequestHandler.m; sourceTree = ""; }; + 9F0B73A4BF6A04609C98D914ED5F371E /* LKS_ConnectionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_ConnectionManager.m; path = Src/Main/Server/Connection/LKS_ConnectionManager.m; sourceTree = ""; }; + A091B8685CFF858DF1478D74A0602F32 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = ""; }; + A09952981795D69640C1B042E3305F33 /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = ""; }; + A0C35DEC88CFC7AF6FCB2CE7920B0160 /* Masonry-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Masonry-Info.plist"; sourceTree = ""; }; + A10B5FDADD305EEB28DB0D0E2A5F0828 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = ""; }; + A1675DE403D3695A8253D64170EAD85A /* Masonry-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-umbrella.h"; sourceTree = ""; }; + A17B9A736952191C771B8268A863C154 /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = ""; }; + A21778AE89CE9CD4592BABF959AFE823 /* MJRefreshConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConfig.h; path = MJRefresh/MJRefreshConfig.h; sourceTree = ""; }; A2D8E1EB42D41EA6B94901E5B68C9011 /* Pods-keyBoard-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-keyBoard-umbrella.h"; sourceTree = ""; }; + A462389C4E35684C9C577F2F6309F24B /* MASConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraint.h; path = Masonry/MASConstraint.h; sourceTree = ""; }; + A4866C2E69C224CD146F1EEB9F3528FD /* AFCompatibilityMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFCompatibilityMacros.h; path = AFNetworking/AFCompatibilityMacros.h; sourceTree = ""; }; A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AFNetworking; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A6CCAA7B0AD1373217438DACF7AB456C /* SDMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDMemoryCache.m; path = SDWebImage/Core/SDMemoryCache.m; sourceTree = ""; }; + A5C4B6887A00D265269C2F6E18435AC5 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = ""; }; + A5F9CD3FA8354DAD169C496B884A0ADC /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/Core/SDImageCacheConfig.m; sourceTree = ""; }; + A60942B17B0CA3AC711CDCE86BD9558C /* NSArray+Lookin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+Lookin.h"; path = "Src/Main/Shared/Category/NSArray+Lookin.h"; sourceTree = ""; }; + A6E68130F3D101E68A8CD6C9DA0D96C8 /* MJExtension-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJExtension-prefix.pch"; sourceTree = ""; }; A6E8FF241173D596A21D4D4B7D86A810 /* Pods-keyBoard.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-keyBoard.release.xcconfig"; sourceTree = ""; }; - A87E9EA0B6E9AB8C1E29A3AE50F278CB /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/Core/UIView+WebCache.h"; sourceTree = ""; }; - A95F96D9DAA700949C3A302C92FD9231 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; - A9F5CF889820DAD55268C3832155A2E1 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = WebImage/PrivacyInfo.xcprivacy; sourceTree = ""; }; - AB321552F4E1B0F80966FCA9AF11848F /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; - AB8EC26A51378B3F4C5559E371607480 /* SDImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFrame.h; path = SDWebImage/Core/SDImageFrame.h; sourceTree = ""; }; - AC2514CF7A7B043E035CFB079E6FB5A0 /* SDDeviceHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDeviceHelper.h; path = SDWebImage/Private/SDDeviceHelper.h; sourceTree = ""; }; - ADF1D8C19CC2D66E65B4B1746316FFC5 /* SDWebImageOptionsProcessor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOptionsProcessor.m; path = SDWebImage/Core/SDWebImageOptionsProcessor.m; sourceTree = ""; }; - AECAC2F59ABD4A78D2B73C898E485890 /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-umbrella.h"; sourceTree = ""; }; - AED6E178EFE04C18394DE24CF7E24E01 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/Core/UIView+WebCacheOperation.h"; sourceTree = ""; }; - AF26D1DF8BE4D63027161EEBE6FDE7AE /* SDCallbackQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDCallbackQueue.m; path = SDWebImage/Core/SDCallbackQueue.m; sourceTree = ""; }; - AF6FBF6EC0693B752A91650764E380C8 /* UIImage+Transform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Transform.h"; path = "SDWebImage/Core/UIImage+Transform.h"; sourceTree = ""; }; - AF94F3E24B633799AB0B2B75B193A4F3 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; - B070DCCCA22D6ECC24DC0BD5CCEF5372 /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; + A72400E84012F4CE4689D3D15AD2D01E /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/Core/UIImage+MultiFormat.h"; sourceTree = ""; }; + A746694BCB1409FC0B6514429221C198 /* LKS_HierarchyDetailsHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_HierarchyDetailsHandler.m; path = Src/Main/Server/Connection/RequestHandler/LKS_HierarchyDetailsHandler.m; sourceTree = ""; }; + A926DAC8E7777046E8188E4D987F833C /* SDImageIOAnimatedCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOAnimatedCoder.m; path = SDWebImage/Core/SDImageIOAnimatedCoder.m; sourceTree = ""; }; + A96A8C288374B9AD37BBC7970C13C5E0 /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASShorthandAdditions.h"; path = "Masonry/NSArray+MASShorthandAdditions.h"; sourceTree = ""; }; + AA15DA30246619414A9C440764360D92 /* SDImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGIFCoder.h; path = SDWebImage/Core/SDImageGIFCoder.h; sourceTree = ""; }; + AA2B2D56E95C386717A6F0CD8A922C40 /* CALayer+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+LookinServer.h"; path = "Src/Main/Server/Category/CALayer+LookinServer.h"; sourceTree = ""; }; + AAACEE0E3B6D6F380E6DC6F387DAC504 /* MJProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJProperty.m; path = MJExtension/MJProperty.m; sourceTree = ""; }; + AAEC123AE9F853D11A1A1179B24CBACD /* LookinAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAttribute.h; path = Src/Main/Shared/LookinAttribute.h; sourceTree = ""; }; + AAEDBCAB0B0894B9C009A27446ED6F8F /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AFNetworking.modulemap; sourceTree = ""; }; + AAF17CFAE9B41A80886D7AE13FD1E50F /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSLayoutConstraint+MASDebugAdditions.m"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; }; + AB64BF3D27891743565124E885679AE0 /* SDWebImageTransitionInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransitionInternal.h; path = SDWebImage/Private/SDWebImageTransitionInternal.h; sourceTree = ""; }; + AC97CF7554D8385D7E25DF2A4B218D2A /* UITextField+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextField+LookinServer.m"; path = "Src/Main/Server/Category/UITextField+LookinServer.m"; sourceTree = ""; }; + AD02773A95705584AC13BC9360993045 /* LookinAutoLayoutConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAutoLayoutConstraint.h; path = Src/Main/Shared/LookinAutoLayoutConstraint.h; sourceTree = ""; }; + ADA92BE9CEF7C7CB2A8B83926C9086BE /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = ""; }; + ADC57D4AABE4C703C7538D36FA9C800F /* SDImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCodersManager.m; path = SDWebImage/Core/SDImageCodersManager.m; sourceTree = ""; }; + AE2B65C4CF7D797E1149C8944ED21A3D /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/Core/SDWebImagePrefetcher.m; sourceTree = ""; }; + AE49DBFD7747CCA7312F5223902CD0BE /* Lookin_PTChannel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Lookin_PTChannel.h; path = Src/Main/Shared/Peertalk/Lookin_PTChannel.h; sourceTree = ""; }; + B01182E407E01E095CD6A0705E460307 /* MJRefresh-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MJRefresh-Info.plist"; sourceTree = ""; }; + B06A69DA2C8CDCF6F06CD519FC21C514 /* NSObject+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+LookinServer.h"; path = "Src/Main/Server/Category/NSObject+LookinServer.h"; sourceTree = ""; }; + B06D60C4A52A06B583043B5F33E9CE23 /* NSSet+Lookin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSSet+Lookin.h"; path = "Src/Main/Shared/Category/NSSet+Lookin.h"; sourceTree = ""; }; B0B214D775196BA7CA8E17E53048A493 /* SDWebImage */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B147B49E855B11A35493E26865607BDF /* NSBezierPath+SDRoundedCorners.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBezierPath+SDRoundedCorners.m"; path = "SDWebImage/Private/NSBezierPath+SDRoundedCorners.m"; sourceTree = ""; }; - B1CE88DD0007C23B107D2BD3A6AB545B /* MJRefreshTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshTrailer.m; path = MJRefresh/Base/MJRefreshTrailer.m; sourceTree = ""; }; - B20A669086F5506692603D3336437ABD /* SDAnimatedImagePlayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImagePlayer.m; path = SDWebImage/Core/SDAnimatedImagePlayer.m; sourceTree = ""; }; - B3A54C7306CBDB1BC3189CCF492C92DE /* SDImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoder.h; path = SDWebImage/Core/SDImageCoder.h; sourceTree = ""; }; - B509365346F676352BBC6630F5F1FADB /* SDWebImageError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageError.m; path = SDWebImage/Core/SDWebImageError.m; sourceTree = ""; }; - B6011963612818816E2CF40CED8B0112 /* MJRefreshTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshTrailer.h; path = MJRefresh/Base/MJRefreshTrailer.h; sourceTree = ""; }; - B60142D76441D9D2B7BA4991E7523577 /* SDImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageGIFCoder.h; path = SDWebImage/Core/SDImageGIFCoder.h; sourceTree = ""; }; - B61705A318B7E4CE5BB4A9A618397777 /* MJExtension-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJExtension-prefix.pch"; sourceTree = ""; }; - B7BBB3446628A3BC637B9F57A5C49901 /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; - B9DF6B027952E0BE3781007ECC6436E7 /* SDWebImageOptionsProcessor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOptionsProcessor.h; path = SDWebImage/Core/SDWebImageOptionsProcessor.h; sourceTree = ""; }; - BCC0677B77FA6DFFDE007551F1660B1E /* UICollectionViewLayout+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewLayout+MJRefresh.m"; path = "MJRefresh/UICollectionViewLayout+MJRefresh.m"; sourceTree = ""; }; - BE440D8DEC29075E20FE83DB3AB2620D /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; - BE6C3AB94897685F9464AA252C4EFB17 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = ""; }; - BEC2871B1357A63D88FCC0144C7847CD /* MJRefreshConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConfig.h; path = MJRefresh/MJRefreshConfig.h; sourceTree = ""; }; - BF154B0F2EB8913A8674795FD63311D2 /* SDImageAPNGCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAPNGCoder.m; path = SDWebImage/Core/SDImageAPNGCoder.m; sourceTree = ""; }; - BF3675A98BB80F2630D08AB3BE31E1B7 /* SDImageFramePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageFramePool.m; path = SDWebImage/Private/SDImageFramePool.m; sourceTree = ""; }; - C23DF793769699E27A02E0B30615EF6F /* NSObject+MJKeyValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJKeyValue.m"; path = "MJExtension/NSObject+MJKeyValue.m"; sourceTree = ""; }; - C3EC2E3BBB3895884BB4AA3B74A54476 /* SDImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCodersManager.m; path = SDWebImage/Core/SDImageCodersManager.m; sourceTree = ""; }; - C55407E10212267DCB2FC49D3260EF48 /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJExtension.h"; path = "MJRefresh/UIScrollView+MJExtension.h"; sourceTree = ""; }; - C5D0E76AC56695893DB1713CA7212B8C /* MJExtension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJExtension-umbrella.h"; sourceTree = ""; }; - C5D645FDA53D7713D436C992B2BC3E96 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/Core/SDImageCacheConfig.m; sourceTree = ""; }; - C6C465F665338FA163A2F6623C933047 /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/Core/UIImageView+WebCache.m"; sourceTree = ""; }; - C71B36DE1531E30C6C8E2592C55C0ED5 /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJRefresh-dummy.m"; sourceTree = ""; }; + B0E3F7E6463B29A9F532594616A57A29 /* SDWebImageDownloaderDecryptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderDecryptor.m; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.m; sourceTree = ""; }; + B284A89029CBE4B8FCF7E6D9F8A0C2B0 /* SDImageCachesManagerOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCachesManagerOperation.h; path = SDWebImage/Private/SDImageCachesManagerOperation.h; sourceTree = ""; }; + B31031880490EAB03C52D376E4CAE128 /* LKS_AttrModificationPatchHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_AttrModificationPatchHandler.m; path = Src/Main/Server/Connection/RequestHandler/LKS_AttrModificationPatchHandler.m; sourceTree = ""; }; + B32DD5288813818219EDE22D3B5F6ABF /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = ""; }; + B3FA407D1022AF2CB763141971FC4EB0 /* LookinObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinObject.h; path = Src/Main/Shared/LookinObject.h; sourceTree = ""; }; + B459A7146BCDCE5DF7BCC9B1C7AF4030 /* Image+Lookin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Image+Lookin.h"; path = "Src/Main/Shared/Category/Image+Lookin.h"; sourceTree = ""; }; + B4AF9FCBF93D2985C74467EEE4144F2B /* MASConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraint.m; path = Masonry/MASConstraint.m; sourceTree = ""; }; + B583F247128E47740F940599B8E5B36A /* MASLayoutConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLayoutConstraint.h; path = Masonry/MASLayoutConstraint.h; sourceTree = ""; }; + B5A4A68949C49C722CDE476E9A7AA168 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; + B696B0F5ED59F730D9D4DFA1F0BB7CC4 /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/Core/UIView+WebCache.h"; sourceTree = ""; }; + B75044F1BA3F62B24D1F6705D2D66A02 /* LKS_EventHandlerMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_EventHandlerMaker.m; path = Src/Main/Server/Others/LKS_EventHandlerMaker.m; sourceTree = ""; }; + B81E913AAFCC8C59F40167A11BAD1D42 /* CALayer+Lookin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+Lookin.m"; path = "Src/Main/Shared/Category/CALayer+Lookin.m"; sourceTree = ""; }; + B9029F64CB1CB96A634BFF0BEE465441 /* MASViewConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewConstraint.m; path = Masonry/MASViewConstraint.m; sourceTree = ""; }; + B9037AC04176BA7B3FD6E0891AEFA0F3 /* SDImageLoader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageLoader.h; path = SDWebImage/Core/SDImageLoader.h; sourceTree = ""; }; + B91F70B44F5438EBAEF2ED0F5B181C54 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/Core/NSButton+WebCache.h"; sourceTree = ""; }; + B9BCB94F8C306615CCBE9A09967DBEE0 /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = ""; }; + B9D8E6F60F0D21F3781FBE5E8D6A6139 /* LookinIvarTrace.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinIvarTrace.h; path = Src/Base/LookinIvarTrace.h; sourceTree = ""; }; + BA22E2DA45E11B0A6A18E08D78A1B477 /* SDImageTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageTransformer.m; path = SDWebImage/Core/SDImageTransformer.m; sourceTree = ""; }; + BAA877091312263E9AF72D142E48EB04 /* SDAnimatedImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImage.h; path = SDWebImage/Core/SDAnimatedImage.h; sourceTree = ""; }; + BAA8A1296FBF9048287BEE21F3B30624 /* LookinStaticAsyncUpdateTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinStaticAsyncUpdateTask.h; path = Src/Main/Shared/LookinStaticAsyncUpdateTask.h; sourceTree = ""; }; + BAC91C3C7012E2345CE8546D7487DA90 /* SDWebImageDownloaderResponseModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderResponseModifier.m; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.m; sourceTree = ""; }; + BAE0475A033CEA3DA4EC7F34C84FAD33 /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJRefresh.h"; path = "MJRefresh/UIScrollView+MJRefresh.h"; sourceTree = ""; }; + BB2E3314150F2C8286028156B0A762DE /* Color+Lookin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Color+Lookin.h"; path = "Src/Main/Shared/Category/Color+Lookin.h"; sourceTree = ""; }; + BC959845321306D21F7B38574617BF5B /* NSString+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+MJExtension.m"; path = "MJExtension/NSString+MJExtension.m"; sourceTree = ""; }; + BCC3DB7CA8C7545180CB5DE948BC48CD /* NSObject+MJKeyValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJKeyValue.h"; path = "MJExtension/NSObject+MJKeyValue.h"; sourceTree = ""; }; + BCEBC8E89BEE2EE962363FCC92FC6E61 /* LookinAttributesGroup.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAttributesGroup.h; path = Src/Main/Shared/LookinAttributesGroup.h; sourceTree = ""; }; + BD0670FBA78AEDAE39DCB4F35BE07F7F /* UIColor+SDHexString.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+SDHexString.h"; path = "SDWebImage/Private/UIColor+SDHexString.h"; sourceTree = ""; }; + BD8D4C08450095A4BDCDBFA2F8DE70A7 /* LKS_EventHandlerMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_EventHandlerMaker.h; path = Src/Main/Server/Others/LKS_EventHandlerMaker.h; sourceTree = ""; }; + BDF9EAF852B79ED40C1097348925D782 /* UIColor+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+LookinServer.h"; path = "Src/Main/Server/Category/UIColor+LookinServer.h"; sourceTree = ""; }; + BE7D34E50E1D6D499D49FA99FCBA5B5A /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MJExtension.m"; path = "MJRefresh/UIView+MJExtension.m"; sourceTree = ""; }; + BEDB25750BAB3DB385C44969E31A51CA /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; + BF801C9DC266DBE995123F5ED187A549 /* LookinTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinTuple.h; path = Src/Main/Shared/LookinTuple.h; sourceTree = ""; }; + C007CBDC7D49DA6B1DACF451D56A546F /* SDWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageOperation.m; path = SDWebImage/Core/SDWebImageOperation.m; sourceTree = ""; }; + C18D52D869C984C4D4DC6F98B352D5BF /* SDGraphicsImageRenderer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDGraphicsImageRenderer.m; path = SDWebImage/Core/SDGraphicsImageRenderer.m; sourceTree = ""; }; + C18F32B7C3DBF2A6BE1D3D59B7EA3A68 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; + C24220EC38C300A4231BF27AF6DFBABC /* MJRefreshConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConfig.m; path = MJRefresh/MJRefreshConfig.m; sourceTree = ""; }; + C41A5AC3D89258F73DB096AF44609EDD /* SDWebImageDownloaderDecryptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderDecryptor.h; path = SDWebImage/Core/SDWebImageDownloaderDecryptor.h; sourceTree = ""; }; + C422377EFC85D76220E07203EE6D3BC6 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = ""; }; + C46B37904E13A5F8183B10AAE427B26E /* MASCompositeConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASCompositeConstraint.m; path = Masonry/MASCompositeConstraint.m; sourceTree = ""; }; + C4B5B9DB7663D1E0C914308BB2C0686C /* WKWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "WKWebView+AFNetworking.h"; path = "UIKit+AFNetworking/WKWebView+AFNetworking.h"; sourceTree = ""; }; + C5F26A40551254037D690232E0E3515F /* SDWebImageCacheSerializer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheSerializer.m; path = SDWebImage/Core/SDWebImageCacheSerializer.m; sourceTree = ""; }; + C64862E863ABC63C9C69F9D569759376 /* LKS_CustomAttrGroupsMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_CustomAttrGroupsMaker.h; path = Src/Main/Server/Others/LKS_CustomAttrGroupsMaker.h; sourceTree = ""; }; + C834E5D08D35C8AEBF0721A15CE9117A /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-prefix.pch"; sourceTree = ""; }; + C8667C11D6514FFBD572BD04F0665096 /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = ""; }; + C86E87A0833EA6424FC42BF16EB9BA57 /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = ""; }; + C87B486F0C017D80D893AB2194260F03 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = ""; }; + C9CD5CF80DF285969292A93B2FC1C6C5 /* LookinAppInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAppInfo.h; path = Src/Main/Shared/LookinAppInfo.h; sourceTree = ""; }; + C9D1615D95A9058A5F66477080940E82 /* SDWebImageDownloaderResponseModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderResponseModifier.h; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.h; sourceTree = ""; }; + CA019314A251BB497B3E819CDC26387C /* SDWebImageIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageIndicator.m; path = SDWebImage/Core/SDWebImageIndicator.m; sourceTree = ""; }; + CA13C2A1D589388CC04DB0DE31AFECAE /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASShorthandAdditions.h"; path = "Masonry/View+MASShorthandAdditions.h"; sourceTree = ""; }; CAD1D653361EAFCC0E4FFD8252FC1E74 /* Pods-CustomKeyboard.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-CustomKeyboard.modulemap"; sourceTree = ""; }; - CC69297E62F679246B8FE5B49D774CF4 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; - CCDB436E5F20F839485E728CEF386187 /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = ""; }; - CEC061A3621F113DA97A66F89E6A844B /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; + CC23CC0879B489B9B23435E228693BF3 /* MJRefreshStateTrailer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateTrailer.h; path = MJRefresh/Custom/Trailer/MJRefreshStateTrailer.h; sourceTree = ""; }; + CCC0039C105F9489D458A6917B399A0C /* LKS_TraceManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_TraceManager.h; path = Src/Main/Server/Others/LKS_TraceManager.h; sourceTree = ""; }; + CCDF9A8326ECA9F0B261F893178A7421 /* SDImageCacheDefine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheDefine.h; path = SDWebImage/Core/SDImageCacheDefine.h; sourceTree = ""; }; + CD45FF183BCDF552AE5AAE1E6DCEF8B4 /* NSObject+MJKeyValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJKeyValue.m"; path = "MJExtension/NSObject+MJKeyValue.m"; sourceTree = ""; }; + CDAAED17E57698D9774A146AD8F38314 /* MJPropertyKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyKey.m; path = MJExtension/MJPropertyKey.m; sourceTree = ""; }; + CDEDB19624E3C9E8C5154DDA825FFABC /* UIViewController+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+LookinServer.m"; path = "Src/Main/Server/Category/UIViewController+LookinServer.m"; sourceTree = ""; }; + CEA53A9CE48CBC1ECC0B09EA1FDE9FD6 /* SDWebImageDownloaderRequestModifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderRequestModifier.m; path = SDWebImage/Core/SDWebImageDownloaderRequestModifier.m; sourceTree = ""; }; CF1281E58AA1045D4B7F33FC56691C42 /* SDWebImage-SDWebImage */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "SDWebImage-SDWebImage"; path = SDWebImage.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - D0275B47D80FC8AE3A59DFAEA8C65E1C /* MJRefresh-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MJRefresh-Info.plist"; sourceTree = ""; }; - D0B1FCAC31B9EF58F1FD85B83EA55B1C /* SDWebImageIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageIndicator.h; path = SDWebImage/Core/SDWebImageIndicator.h; sourceTree = ""; }; - D13BE3E84BFB9462CF54B22B35F89ADC /* SDFileAttributeHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDFileAttributeHelper.h; path = SDWebImage/Private/SDFileAttributeHelper.h; sourceTree = ""; }; - D28BB6B7AF2BC47AA045CB28AE578B56 /* MASViewConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewConstraint.m; path = Masonry/MASViewConstraint.m; sourceTree = ""; }; - D513B9FE4981B810C5EBD34AAD6D0CD7 /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; sourceTree = ""; }; + CFC090EF901F43F9185E78D093B9E0F2 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; + D06BA623349F0685BBCB4816BDDA9DEF /* SDImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCodersManager.h; path = SDWebImage/Core/SDImageCodersManager.h; sourceTree = ""; }; + D0757789009DAF5FE17451C8742CC19F /* NSObject+Lookin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+Lookin.m"; path = "Src/Main/Shared/Category/NSObject+Lookin.m"; sourceTree = ""; }; + D0A854986C4B29F4B4CD59A9183BF626 /* LookinStaticAsyncUpdateTask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinStaticAsyncUpdateTask.m; path = Src/Main/Shared/LookinStaticAsyncUpdateTask.m; sourceTree = ""; }; + D0D4FAEBC816AD65D32AA5F30C61F379 /* SDWebImageIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageIndicator.h; path = SDWebImage/Core/SDWebImageIndicator.h; sourceTree = ""; }; + D1332008BE919DA536E622206A6116BF /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; + D4B53A1EC10D12A5BE9E935B855DB4C2 /* LookinEventHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinEventHandler.h; path = Src/Main/Shared/LookinEventHandler.h; sourceTree = ""; }; + D4D4D49490338B3182E06909363E193F /* SDWebImageCacheSerializer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheSerializer.h; path = SDWebImage/Core/SDWebImageCacheSerializer.h; sourceTree = ""; }; + D52F763F898CF198A32C6E14F5139155 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = ""; }; + D59346EAB789EE81F0825892B87F78E7 /* LookinAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAttribute.m; path = Src/Main/Shared/LookinAttribute.m; sourceTree = ""; }; + D713378F0FFD12D4CD2ACE135B2C8D35 /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; + D738094D77852E91C1FB0B900841B0DC /* UITableView+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+LookinServer.m"; path = "Src/Main/Server/Category/UITableView+LookinServer.m"; sourceTree = ""; }; D742A7EF918BC67B0884AF366F7415FD /* Pods-CustomKeyboard-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-CustomKeyboard-acknowledgements.plist"; sourceTree = ""; }; - D875CFB5AA1591E80BD3A95A94255894 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; - D915858ABB2794C80C0D2328483F75C4 /* NSObject+MJKeyValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJKeyValue.h"; path = "MJExtension/NSObject+MJKeyValue.h"; sourceTree = ""; }; - D99D7FCB3FD62B8D8BF11087E1D6E47F /* SDWebImageDownloaderResponseModifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderResponseModifier.h; path = SDWebImage/Core/SDWebImageDownloaderResponseModifier.h; sourceTree = ""; }; - DBEED872AB83B013F34A14A1823F4820 /* SDImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCodersManager.h; path = SDWebImage/Core/SDImageCodersManager.h; sourceTree = ""; }; - DBFD2ECA52ECDAAA78246FE8B02312A9 /* SDFileAttributeHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDFileAttributeHelper.m; path = SDWebImage/Private/SDFileAttributeHelper.m; sourceTree = ""; }; - DC6CF0A46A4D9FFFBA2057678DF1978B /* SDAnimatedImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImage.m; path = SDWebImage/Core/SDAnimatedImage.m; sourceTree = ""; }; - DC6DB03243923516662807D789FF26B1 /* UIView+WebCacheState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheState.h"; path = "SDWebImage/Core/UIView+WebCacheState.h"; sourceTree = ""; }; + D779B4B4ABDD5B5950ED77ACB35D7071 /* MJRefreshStateTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateTrailer.m; path = MJRefresh/Custom/Trailer/MJRefreshStateTrailer.m; sourceTree = ""; }; + D7A7C8D2368C31D5517C69AF9C21303A /* LKS_CustomDisplayItemsMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_CustomDisplayItemsMaker.m; path = Src/Main/Server/Others/LKS_CustomDisplayItemsMaker.m; sourceTree = ""; }; + D7CE187EC41E8BF909ED0FE617B5CADB /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = ""; }; + D83A360037475DAD2928CFE370229369 /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+MJRefresh.m"; path = "MJRefresh/NSBundle+MJRefresh.m"; sourceTree = ""; }; + D8940A99ECE28941C56D9A97864AE4E0 /* SDAnimatedImagePlayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImagePlayer.h; path = SDWebImage/Core/SDAnimatedImagePlayer.h; sourceTree = ""; }; + D9091431CFC5C0A100D291AF8A2D2B93 /* LookinCodingValueType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinCodingValueType.h; path = Src/Main/Shared/LookinCodingValueType.h; sourceTree = ""; }; + D93569B386C3B62D7671951E2F3E8129 /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = ""; }; + DA76D826B098D85B81C57F39270E09EC /* MJExtension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJExtension-dummy.m"; sourceTree = ""; }; + DAEE6FA193471A73D57A74AA1324F822 /* SDDisplayLink.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDDisplayLink.h; path = SDWebImage/Private/SDDisplayLink.h; sourceTree = ""; }; + DB279A22CABD71AAB410E88396A3C6E7 /* SDDisplayLink.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDDisplayLink.m; path = SDWebImage/Private/SDDisplayLink.m; sourceTree = ""; }; + DB684D191E333C0E03104EAF677B0281 /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = ""; }; + DB71828FA23A5A6DCB9C54657F7D6D99 /* UIImage+Transform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Transform.h"; path = "SDWebImage/Core/UIImage+Transform.h"; sourceTree = ""; }; + DBB5199AA36CBEDB4430823E47805048 /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = ""; }; + DBB907FE8BA07A712691E20C170A72E0 /* Bugly.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bugly.debug.xcconfig; sourceTree = ""; }; + DBDF1CDEB2C728898F1E8A8BD00C641C /* MJExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.release.xcconfig; sourceTree = ""; }; DCA062FD08AC9694D8D781B3492421C5 /* Pods-keyBoard */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-keyBoard"; path = Pods_keyBoard.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DCFE00F3CC8CED67258D7F7DD13F3156 /* Pods-keyBoard-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-keyBoard-frameworks.sh"; sourceTree = ""; }; + DD2888D9AEDDC5FB4645769FF72434AD /* SDImageFramePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageFramePool.h; path = SDWebImage/Private/SDImageFramePool.h; sourceTree = ""; }; DDAE741F085915AF2475C918F1A17466 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; - DDC08D9E69C76309DA07F96C62824633 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/Core/NSData+ImageContentType.h"; sourceTree = ""; }; - DE966A3AAABAC126A570DC36F74E07AE /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSLayoutConstraint+MASDebugAdditions.m"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; }; - DEAC3EFF66D7CCDC2824B18A44FDBB3B /* MJRefresh.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MJRefresh.modulemap; sourceTree = ""; }; - DF80C56AF1D41887B8622FAC95138810 /* MJRefresh.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.release.xcconfig; sourceTree = ""; }; - DFD5A14F9DC74814903A901B625C5A94 /* SDImageAWebPCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageAWebPCoder.m; path = SDWebImage/Core/SDImageAWebPCoder.m; sourceTree = ""; }; - E0E66128C9FA5581B5257A03454E3761 /* MJExtension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MJExtension.modulemap; sourceTree = ""; }; - E135DFBB6A830F84DCF4A1D31534EE65 /* View+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "View+MASAdditions.m"; path = "Masonry/View+MASAdditions.m"; sourceTree = ""; }; - E200433A892F1843DD9B8C05E3C226BE /* NSObject+MJCoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJCoding.h"; path = "MJExtension/NSObject+MJCoding.h"; sourceTree = ""; }; + DEC169158FF1164E7540D2EE5DE5BDF4 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/Core/SDWebImageDownloader.m; sourceTree = ""; }; + DED6B1DE51BD4E52B477D7C548CF782C /* SDWebImageCacheKeyFilter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCacheKeyFilter.h; path = SDWebImage/Core/SDWebImageCacheKeyFilter.h; sourceTree = ""; }; + DF4971334F726E1A57CC0CC51C6DC727 /* LKS_CustomAttrModificationHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_CustomAttrModificationHandler.m; path = Src/Main/Server/Connection/RequestHandler/LKS_CustomAttrModificationHandler.m; sourceTree = ""; }; + DF90BC0D1488FDD0AE7DD2D9DBE61B6A /* CALayer+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+LookinServer.m"; path = "Src/Main/Server/Category/CALayer+LookinServer.m"; sourceTree = ""; }; + E000A08E3EC43F17949721182B8F804C /* LookinHierarchyInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinHierarchyInfo.h; path = Src/Main/Shared/LookinHierarchyInfo.h; sourceTree = ""; }; + E18CAF822E13B69105C0F262E830328C /* SDAssociatedObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAssociatedObject.h; path = SDWebImage/Private/SDAssociatedObject.h; sourceTree = ""; }; + E196407B2ACD1C9DA4C63CD0E4549377 /* UIView+WebCacheState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheState.m"; path = "SDWebImage/Core/UIView+WebCacheState.m"; sourceTree = ""; }; + E1FCAE90D248FD5EB1718F110A71F968 /* LKS_ExportManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_ExportManager.m; path = Src/Main/Server/Others/LKS_ExportManager.m; sourceTree = ""; }; E214C17CF404D45BDF92DD6C18D371FA /* Pods-keyBoard-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-keyBoard-acknowledgements.markdown"; sourceTree = ""; }; - E28F3972E6749440E493F6BCD8198F4F /* MJExtension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MJExtension-Info.plist"; sourceTree = ""; }; - E2EAE5E554B07101C740E6CB128A93A0 /* SDImageIOAnimatedCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageIOAnimatedCoder.m; path = SDWebImage/Core/SDImageIOAnimatedCoder.m; sourceTree = ""; }; - E310A44D757B0556FA6F2882D1565A8C /* NSString+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+MJExtension.m"; path = "MJExtension/NSString+MJExtension.m"; sourceTree = ""; }; + E25044B9D78FF27BAD6D0EE168A019F5 /* LookinHierarchyFile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinHierarchyFile.h; path = Src/Main/Shared/LookinHierarchyFile.h; sourceTree = ""; }; + E26FE8A705408387562DCE99FF815021 /* LookinServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LookinServer-umbrella.h"; sourceTree = ""; }; + E2EB5B7DFED85087E5CCAA7F25F7F6DD /* UILabel+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UILabel+LookinServer.m"; path = "Src/Main/Server/Category/UILabel+LookinServer.m"; sourceTree = ""; }; + E2F253C004203C5AD94BC922622BC6C7 /* MJRefreshTrailer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshTrailer.m; path = MJRefresh/Base/MJRefreshTrailer.m; sourceTree = ""; }; + E2F4A91F369E1A8FB89246BE23537163 /* LookinConnectionResponseAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinConnectionResponseAttachment.m; path = Src/Main/Shared/LookinConnectionResponseAttachment.m; sourceTree = ""; }; + E39CA707ED9C2F951B2DCEA02E531E96 /* AFNetworking-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AFNetworking-Info.plist"; sourceTree = ""; }; + E416FB13B20E56ABB8795CB5D98D23FE /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/Core/SDWebImagePrefetcher.h; sourceTree = ""; }; + E48D347569829823CC334B4DA45B2BC2 /* Lookin_PTProtocol.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Lookin_PTProtocol.m; path = Src/Main/Shared/Peertalk/Lookin_PTProtocol.m; sourceTree = ""; }; E49D6D248DD1CEE584E6776B9164A1B2 /* MJRefresh */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MJRefresh; path = MJRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E553AE6B35449F8CB4BAA4FFE1DCAFAC /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = ""; }; - E5886305209187E582C024335BD55AE9 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASShorthandAdditions.h"; path = "Masonry/View+MASShorthandAdditions.h"; sourceTree = ""; }; - E5AEFA07EBF944C0387D10A7BD7BC85F /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; }; - E7D9B8C39A19DDF2CE7619D44758B033 /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = ""; }; - E8780E8A7822982224C2ACEBBC3B52B8 /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = ""; }; - E97276CEE18BF4611E1C1D42736F6EAB /* SDMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDMemoryCache.h; path = SDWebImage/Core/SDMemoryCache.h; sourceTree = ""; }; - EA1E48B813787CAC28E89E7F260BFCD4 /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; - EA46C1DE7820870BF842553EA6A951F9 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/Core/UIImage+ForceDecode.h"; sourceTree = ""; }; - EAE5F401F42AA242D6CAE9E463DE5CD4 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; - EAFBBF7E1270693113CDF0C1D9CBB512 /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = ""; }; - F0300A3A30BF1560E306C61ACCE11C1A /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; - F0C38163E5AA6D4BEAA1C7E79C82A930 /* SDAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageView.m; path = SDWebImage/Core/SDAnimatedImageView.m; sourceTree = ""; }; - F0CEEBB5DD628DB121172299787A25A9 /* SDImageCachesManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCachesManager.m; path = SDWebImage/Core/SDImageCachesManager.m; sourceTree = ""; }; - F104350C0F7D19687DAC6BD75101DA7F /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/Core/SDWebImageDownloader.m; sourceTree = ""; }; - F104F9FC5C4BB399EC2C2B96BD7714B8 /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = ""; }; - F37857D4A0467A12B54C180612695C52 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; }; - F4E10DADB58D42AEAD6CD268CEB583E8 /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = ""; }; - F62E78180455B791A034CFBD4F4CE6A3 /* SDImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCoderHelper.m; path = SDWebImage/Core/SDImageCoderHelper.m; sourceTree = ""; }; - F68941BD4F4913D60B00D4A8F049112A /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/Core/UIImage+MultiFormat.m"; sourceTree = ""; }; - F74EE2D92793519D84E4B72CD6AB0C63 /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = ""; }; - F76369243ECD96D54BBB9C4A97EB6946 /* NSImage+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+Compatibility.h"; path = "SDWebImage/Core/NSImage+Compatibility.h"; sourceTree = ""; }; - F7A20DE3DDDA450D1997F9A3184CD3C6 /* SDImageAssetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageAssetManager.h; path = SDWebImage/Private/SDImageAssetManager.h; sourceTree = ""; }; - F7E0DB23007E49794165F74548446C13 /* SDWebImageCacheKeyFilter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCacheKeyFilter.m; path = SDWebImage/Core/SDWebImageCacheKeyFilter.m; sourceTree = ""; }; - F934ACD20FEDAB980427B3D001DF8312 /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+MASAdditions.m"; path = "Masonry/NSArray+MASAdditions.m"; sourceTree = ""; }; - F9CEF650A6E8658ECF7704A7EE2E7452 /* MASConstraintMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraintMaker.h; path = Masonry/MASConstraintMaker.h; sourceTree = ""; }; - FB47049112F4F8EEA8F6068CB0393B3F /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/Core/SDAnimatedImageRep.h; sourceTree = ""; }; - FB792580573132155A61C027392EF360 /* MJExtension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJExtension-dummy.m"; sourceTree = ""; }; - FB988F307C9B24539A026F84144A0402 /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = ""; }; - FF09658FCA5560C3552AF5B4B7E7C6ED /* SDImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageIOCoder.h; path = SDWebImage/Core/SDImageIOCoder.h; sourceTree = ""; }; - FF49D60AE2D0E7C2857D88C5353083C3 /* SDAsyncBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAsyncBlockOperation.m; path = SDWebImage/Private/SDAsyncBlockOperation.m; sourceTree = ""; }; + E56FEF1A9FC3188CBA7C605E21D82A0A /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; + E5BA3AFAF372382F326FE19156B50F24 /* LookinAttrIdentifiers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinAttrIdentifiers.h; path = Src/Main/Shared/LookinAttrIdentifiers.h; sourceTree = ""; }; + E5DB708E9320895D02EB843DDAF4E47E /* SDImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoderHelper.h; path = SDWebImage/Core/SDImageCoderHelper.h; sourceTree = ""; }; + E6D970EF4215F715F0CFE07FA609D904 /* View+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "View+MASAdditions.m"; path = "Masonry/View+MASAdditions.m"; sourceTree = ""; }; + E87409A6C236FBEB17F5FADFE67805F1 /* SDImageGraphics.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageGraphics.m; path = SDWebImage/Core/SDImageGraphics.m; sourceTree = ""; }; + EA0D7B3EBDB71C539711D5E96D0216FA /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = ""; }; + EAA447D9CA8EDFFD26730C6B416FFD84 /* SDAsyncBlockOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAsyncBlockOperation.m; path = SDWebImage/Private/SDAsyncBlockOperation.m; sourceTree = ""; }; + EAAAA4757F7C32D06EFABC2E3F5A7E92 /* Lookin_PTProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Lookin_PTProtocol.h; path = Src/Main/Shared/Peertalk/Lookin_PTProtocol.h; sourceTree = ""; }; + EAB417A8F0BC17E30CAD95F001475DB1 /* UITextField+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextField+LookinServer.h"; path = "Src/Main/Server/Category/UITextField+LookinServer.h"; sourceTree = ""; }; + EC5B400126BFB1B0BADFDFF8969C171A /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = ""; }; + EE91257C2B15E78852085FE246BEF559 /* LookinServer-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "LookinServer-Info.plist"; sourceTree = ""; }; + EEE1FEDC0E884357F32741CD751E4851 /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = ""; }; + EEE70C2EB2F346F05C3482825CA278CA /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/Core/UIView+WebCacheOperation.m"; sourceTree = ""; }; + EF27816E6C55CA22FA9AFA7AFC03334B /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/Core/SDWebImageTransition.m; sourceTree = ""; }; + EF4826C096FF849D4E369D7C176C05C8 /* LKSConfigManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKSConfigManager.m; path = Src/Main/Server/Others/LKSConfigManager.m; sourceTree = ""; }; + F26EC6DE08DD5D154B6F753072C347F9 /* UIImage+Transform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Transform.m"; path = "SDWebImage/Core/UIImage+Transform.m"; sourceTree = ""; }; + F278184E8A4E3E7A2260C7FF4E482DE6 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; + F29A616129C4E4311BF6B3256DB728C2 /* CALayer+Lookin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+Lookin.h"; path = "Src/Main/Shared/Category/CALayer+Lookin.h"; sourceTree = ""; }; + F319089CE8A771B4E00E74F5CF065DFE /* SDImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCoder.h; path = SDWebImage/Core/SDImageCoder.h; sourceTree = ""; }; + F34FC723FED1DA3B3417ED70796A8F55 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; }; + F5062DA8AEAE4430782016BEC468E129 /* NSString+Lookin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+Lookin.m"; path = "Src/Main/Shared/Category/NSString+Lookin.m"; sourceTree = ""; }; + F57983A047506181C8E67291514049B6 /* MJExtensionConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtensionConst.h; path = MJExtension/MJExtensionConst.h; sourceTree = ""; }; + F655B5C3F030F1435ED5BD0A0E68050A /* LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LookinServer.h; path = Src/Main/Server/LookinServer.h; sourceTree = ""; }; + F6A0C7E14AE1D6B963FB5E50B04CC71C /* UILabel+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UILabel+LookinServer.h"; path = "Src/Main/Server/Category/UILabel+LookinServer.h"; sourceTree = ""; }; + F796365C18A92736860BB37F7E034373 /* SDMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDMemoryCache.h; path = SDWebImage/Core/SDMemoryCache.h; sourceTree = ""; }; + F7A19A83DA09753B0E4583C8A57EF97C /* UIImage+MemoryCacheCost.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MemoryCacheCost.m"; path = "SDWebImage/Core/UIImage+MemoryCacheCost.m"; sourceTree = ""; }; + F8490E54D9DFBBD8DD3E31CF3784E7C5 /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = ""; }; + F8787A312BDE6CB010E380D9C7F54B6E /* MJFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJFoundation.m; path = MJExtension/MJFoundation.m; sourceTree = ""; }; + F8A18ADE74F68133570FA542FF4A303C /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/Core/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + F9400AD97C7D390C0022619C51584770 /* LKS_AttrGroupsMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = LKS_AttrGroupsMaker.h; path = Src/Main/Server/Others/LKS_AttrGroupsMaker.h; sourceTree = ""; }; + F99D766826C224A2D7D6052D2D54CA36 /* UIVisualEffectView+LookinServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIVisualEffectView+LookinServer.m"; path = "Src/Main/Server/Category/UIVisualEffectView+LookinServer.m"; sourceTree = ""; }; + F9B942D015FE250DD2C12BC56E9FE0C1 /* MJPropertyType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyType.m; path = MJExtension/MJPropertyType.m; sourceTree = ""; }; + FA0D003C4EDBE2F44CAFEC12C0CAF067 /* UIVisualEffectView+LookinServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIVisualEffectView+LookinServer.h"; path = "Src/Main/Server/Category/UIVisualEffectView+LookinServer.h"; sourceTree = ""; }; + FA6D90B9C25635B7DCB5D4E969BAB85B /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; sourceTree = ""; }; + FBDE8546A774C7DD1D740B8B3DBBB41E /* SDImageHEICCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageHEICCoder.h; path = SDWebImage/Core/SDImageHEICCoder.h; sourceTree = ""; }; + FCD45CDBD694FE635EED9B11544EE273 /* NSObject+Lookin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+Lookin.h"; path = "Src/Main/Shared/Category/NSObject+Lookin.h"; sourceTree = ""; }; + FCFFAF1ADD68F376CCB4269DAA28E457 /* LKS_AttrGroupsMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LKS_AttrGroupsMaker.m; path = Src/Main/Server/Others/LKS_AttrGroupsMaker.m; sourceTree = ""; }; + FD4903250ADF971C256406813D8C1DEE /* LookinAppInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = LookinAppInfo.m; path = Src/Main/Shared/LookinAppInfo.m; sourceTree = ""; }; + FD9A0FF4BC528335E17AF558759CC155 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/Core/NSData+ImageContentType.m"; sourceTree = ""; }; + FDAB549AD6E4F2874D1E546728D0C1EE /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/Core/UIImage+GIF.m"; sourceTree = ""; }; + FDBEDF55963ED3DA043AEFB43D26551B /* UIImage+Metadata.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Metadata.h"; path = "SDWebImage/Core/UIImage+Metadata.h"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -774,13 +1063,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 2195E2C2C2334091D023B7EB98B24603 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 37145BAEB1B97BA7ADD7D6C3E86E99BD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -798,18 +1080,19 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5F8D0AA57E07244D2E43526654F67443 /* Frameworks */ = { + 485AC1F46BE9B5F952A556517C27F798 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 83DE9F788F7FEF1F8FBE5407651F444D /* Frameworks */ = { + 7CFE8F67F3A1361064414896BC73914A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DC87E6C5364DC59641BC8A0676B5EA55 /* Foundation.framework in Frameworks */, + 98AB6B8EB7FF096BCE87488C5AB3DF1C /* Foundation.framework in Frameworks */, + C71935C30C1AEDF32B96670BD8FA64CE /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -821,7 +1104,22 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - E62253CBB3499DA4547AF2A780EC3E2F /* Frameworks */ = { + BA907BE43BC75B5E5F4FF58D55F0352F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EC887E260D0219D14A6F8D043A399103 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B2C76331039F670E41588BB3D1F50E14 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F6011854FAC4D9F4B6C8C3CC24306AF2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -831,20 +1129,47 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 016CE3C0DE69FA6E7375F8B485359AE7 /* Support Files */ = { + 0022AA4D9F9563E9E44048ACE8830EAC /* NSURLSession */ = { isa = PBXGroup; children = ( - DEAC3EFF66D7CCDC2824B18A44FDBB3B /* MJRefresh.modulemap */, - C71B36DE1531E30C6C8E2592C55C0ED5 /* MJRefresh-dummy.m */, - D0275B47D80FC8AE3A59DFAEA8C65E1C /* MJRefresh-Info.plist */, - 72789BA685A26A276A98609F54509572 /* MJRefresh-prefix.pch */, - AECAC2F59ABD4A78D2B73C898E485890 /* MJRefresh-umbrella.h */, - 74CC813EBCFDBA413D1E8F2AE302E41A /* MJRefresh.debug.xcconfig */, - DF80C56AF1D41887B8622FAC95138810 /* MJRefresh.release.xcconfig */, - 852C84F2242375BE5446ADE5B9509933 /* ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist */, + A4866C2E69C224CD146F1EEB9F3528FD /* AFCompatibilityMacros.h */, + BEDB25750BAB3DB385C44969E31A51CA /* AFHTTPSessionManager.h */, + 9A0832105E3ABE8B885DD8711CB1DC9A /* AFHTTPSessionManager.m */, + 578E6DCE361C9C2FFED74421BE9E53CF /* AFURLSessionManager.h */, + 42C02903F3EC2EF8D2384DC86D04D1AB /* AFURLSessionManager.m */, ); - name = "Support Files"; - path = "../Target Support Files/MJRefresh"; + name = NSURLSession; + sourceTree = ""; + }; + 00D99C47EEA945CA228FF97F1BDB431D /* MJExtension */ = { + isa = PBXGroup; + children = ( + 31473DD60D4305B7DA741C55F921ED28 /* MJExtension.h */, + F57983A047506181C8E67291514049B6 /* MJExtensionConst.h */, + 8375CF9CD2710851F31670C5AEC1681F /* MJExtensionConst.m */, + 6A632FE340768C393869A04A3FA157E8 /* MJFoundation.h */, + F8787A312BDE6CB010E380D9C7F54B6E /* MJFoundation.m */, + 350E7CC7CBBC3075A763B5DD04615877 /* MJProperty.h */, + AAACEE0E3B6D6F380E6DC6F387DAC504 /* MJProperty.m */, + 6091D6A70F537A0BB9A74FFBC706B561 /* MJPropertyKey.h */, + CDAAED17E57698D9774A146AD8F38314 /* MJPropertyKey.m */, + 5D9B7125C481E0586F9468DEBF3E76F8 /* MJPropertyType.h */, + F9B942D015FE250DD2C12BC56E9FE0C1 /* MJPropertyType.m */, + 40046208DED5819A627DD0A5AEAB8EB7 /* NSObject+MJClass.h */, + 3BA822CC1E8CF917E43841631FD377CF /* NSObject+MJClass.m */, + 1268201EC6F4BF7A1C93B850D3DB3355 /* NSObject+MJCoding.h */, + 0FC914323BA2AE8D6B04FB881E065C93 /* NSObject+MJCoding.m */, + BCC3DB7CA8C7545180CB5DE948BC48CD /* NSObject+MJKeyValue.h */, + CD45FF183BCDF552AE5AAE1E6DCEF8B4 /* NSObject+MJKeyValue.m */, + 93D1AE46DAE9B08CD36A2DEBEF9E850F /* NSObject+MJProperty.h */, + 227C689732CBCD5ED2D9E1142E9BA6B7 /* NSObject+MJProperty.m */, + 33AB41E897E484FEC64F2BEBBA7AA40C /* NSString+MJExtension.h */, + BC959845321306D21F7B38574617BF5B /* NSString+MJExtension.m */, + F7B60E2E8D053FDD31C77970AD13583B /* Resources */, + C5EB70695F66E901E0A1E52BA833635E /* Support Files */, + ); + name = MJExtension; + path = MJExtension; sourceTree = ""; }; 03C5C200A0787E300053CFA8F53CA094 /* Frameworks */ = { @@ -855,89 +1180,108 @@ name = Frameworks; sourceTree = ""; }; - 18AF1EE6F6DA0C51E0452AA62EF8B8ED /* Masonry */ = { + 04FDA90EC92846BCA87341D9449034D2 /* Pods */ = { isa = PBXGroup; children = ( - 104166B53DA0CBE95AF12518EB609B7A /* MASCompositeConstraint.h */, - 0F7E589343BFFDCABC0FCDF6E321CDA2 /* MASCompositeConstraint.m */, - 71C9A7FB9BC0D7C0FA902D0643B08962 /* MASConstraint.h */, - 7C1791A7C256B13C227BF8DAE4C2EFE9 /* MASConstraint.m */, - 5AC074355067D4E88EB993DD28E44948 /* MASConstraint+Private.h */, - F9CEF650A6E8658ECF7704A7EE2E7452 /* MASConstraintMaker.h */, - 8ABF0BFFB097FE97D207EBE5498289D3 /* MASConstraintMaker.m */, - 52AD4C798F619843C6425BB666EE43A0 /* MASLayoutConstraint.h */, - 047628989EB45DFAC6DD4B6DDC61C1D7 /* MASLayoutConstraint.m */, - 23D13EEFDD6A912D7922FE8AE4E23D60 /* Masonry.h */, - 3F58F61640AAFD16139A83CC4EA55B1D /* MASUtilities.h */, - 2CCE60F6B1B48663415E0A4BC9662B33 /* MASViewAttribute.h */, - E5AEFA07EBF944C0387D10A7BD7BC85F /* MASViewAttribute.m */, - 266F6A7CA0ABF9B26D746459A14BAEBA /* MASViewConstraint.h */, - D28BB6B7AF2BC47AA045CB28AE578B56 /* MASViewConstraint.m */, - 93EB15003C1E2452E5C21AD7FF38A39D /* NSArray+MASAdditions.h */, - F934ACD20FEDAB980427B3D001DF8312 /* NSArray+MASAdditions.m */, - 1DA8FCC29DBFD3824ADEAD9F14A76E86 /* NSArray+MASShorthandAdditions.h */, - 5679D7FEFDE3E519C17C0EAAA7867122 /* NSLayoutConstraint+MASDebugAdditions.h */, - DE966A3AAABAC126A570DC36F74E07AE /* NSLayoutConstraint+MASDebugAdditions.m */, - 88799C33D6D0AAE2D395A1496F3A9E5D /* View+MASAdditions.h */, - E135DFBB6A830F84DCF4A1D31534EE65 /* View+MASAdditions.m */, - E5886305209187E582C024335BD55AE9 /* View+MASShorthandAdditions.h */, - 6EB624EDC7B2F6F92D5F6AEF8AAA4356 /* ViewController+MASAdditions.h */, - 33EBB93597383ED9EEA18C0A9BCE3B84 /* ViewController+MASAdditions.m */, - B9D225EE05CF747670C5F4383D1D8D95 /* Support Files */, + 7033CADED0DE1E94800DEBD4699CCA2B /* AFNetworking */, + E1B49F06C5C5A5E10EAF35AB341C6019 /* Bugly */, + 207BC45CB5E00B460C62F95219104E78 /* LookinServer */, + 0F783D5BDFEAE33E77A63A38F05BB1A3 /* Masonry */, + 00D99C47EEA945CA228FF97F1BDB431D /* MJExtension */, + B1405370189A1A337560242153369E4D /* MJRefresh */, + 1590CE638AC4B182CFC7D4A44C303CBF /* SDWebImage */, + ); + name = Pods; + sourceTree = ""; + }; + 0F783D5BDFEAE33E77A63A38F05BB1A3 /* Masonry */ = { + isa = PBXGroup; + children = ( + D713378F0FFD12D4CD2ACE135B2C8D35 /* MASCompositeConstraint.h */, + C46B37904E13A5F8183B10AAE427B26E /* MASCompositeConstraint.m */, + A462389C4E35684C9C577F2F6309F24B /* MASConstraint.h */, + B4AF9FCBF93D2985C74467EEE4144F2B /* MASConstraint.m */, + 7C37FCE816213CE06FD25D1DD57DD164 /* MASConstraint+Private.h */, + 129F6A10DC8AFBD284583E4CF5ED5793 /* MASConstraintMaker.h */, + 11B0E0F71F410E0ECDFF69F70055F7B7 /* MASConstraintMaker.m */, + B583F247128E47740F940599B8E5B36A /* MASLayoutConstraint.h */, + 80CD54C66B12297780AB38A67326A123 /* MASLayoutConstraint.m */, + 6804931A02925CC75742598277F91E7D /* Masonry.h */, + 6AF531BDD77E2C93F3A9EB19FC90C677 /* MASUtilities.h */, + 0C1333D32D092DD54CBE8B17F9E60A95 /* MASViewAttribute.h */, + 436D2261BEEF1C4B3FB973E64413A09F /* MASViewAttribute.m */, + 2260B16F1B02693319478DB4F54316E1 /* MASViewConstraint.h */, + B9029F64CB1CB96A634BFF0BEE465441 /* MASViewConstraint.m */, + 9D1B209E057B32F0F386DB8EED983370 /* NSArray+MASAdditions.h */, + 95A5615E32E88EE69FF2F104721935DD /* NSArray+MASAdditions.m */, + A96A8C288374B9AD37BBC7970C13C5E0 /* NSArray+MASShorthandAdditions.h */, + 25B9C7CDB8FB7628FD1DBD1506DB6FE3 /* NSLayoutConstraint+MASDebugAdditions.h */, + AAF17CFAE9B41A80886D7AE13FD1E50F /* NSLayoutConstraint+MASDebugAdditions.m */, + 013ECA5DD2CB8359B649081FDA62389D /* View+MASAdditions.h */, + E6D970EF4215F715F0CFE07FA609D904 /* View+MASAdditions.m */, + CA13C2A1D589388CC04DB0DE31AFECAE /* View+MASShorthandAdditions.h */, + 998EEC31A73E8747C2ACCB121631445C /* ViewController+MASAdditions.h */, + 627BA8BB2ACD90F8F5EE6A82DB3C8A30 /* ViewController+MASAdditions.m */, + F34EFC488C0CABAC0784F901B41CEBF5 /* Support Files */, ); name = Masonry; path = Masonry; sourceTree = ""; }; - 19D8D3FE289D2B2C36E0B1D672C942C8 /* Reachability */ = { + 12C23AD5B5D91AF36F61D1B4915B2584 /* Support Files */ = { isa = PBXGroup; children = ( - 523BDC065F0AF63F170A84FAF905FD26 /* AFNetworkReachabilityManager.h */, - B7BBB3446628A3BC637B9F57A5C49901 /* AFNetworkReachabilityManager.m */, + 5E63090732AA98A187ADDAF8E4372AFA /* MJRefresh.modulemap */, + 45A31347DD6C3F7EE0F37263613AAE10 /* MJRefresh-dummy.m */, + B01182E407E01E095CD6A0705E460307 /* MJRefresh-Info.plist */, + C834E5D08D35C8AEBF0721A15CE9117A /* MJRefresh-prefix.pch */, + 840C5489E8F7E07E8F10036ACEA93B6D /* MJRefresh-umbrella.h */, + 335C85A867FBD4B2CEEC783F95659782 /* MJRefresh.debug.xcconfig */, + 870308F72B6057F0D29396CFC0E51B4C /* MJRefresh.release.xcconfig */, + 1E9EFA7F9114207CB40E1613946BD4C5 /* ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist */, ); - name = Reachability; + name = "Support Files"; + path = "../Target Support Files/MJRefresh"; sourceTree = ""; }; - 1B700D6AB864A19F1C70168CC9BAAEC5 /* Serialization */ = { + 1590CE638AC4B182CFC7D4A44C303CBF /* SDWebImage */ = { isa = PBXGroup; children = ( - 5DD19473CA2658646B964B6124A31FB9 /* AFURLRequestSerialization.h */, - 74446596F2A689B17D9187482A194EEC /* AFURLRequestSerialization.m */, - 517973DC2D89829B73698FF20240431A /* AFURLResponseSerialization.h */, - CEC061A3621F113DA97A66F89E6A844B /* AFURLResponseSerialization.m */, + 45BB10323729BD251880F77ABF1C2AF0 /* Core */, + C464B91CA34BBA69580D35F692477C6E /* Support Files */, + ); + name = SDWebImage; + path = SDWebImage; + sourceTree = ""; + }; + 1C12383EE7DD980364C4001D92818FC2 /* Serialization */ = { + isa = PBXGroup; + children = ( + 08C30132ED5FABAEDF867C9B2581BAD8 /* AFURLRequestSerialization.h */, + 748A0893B4653646B0A27B7E0AC19FC8 /* AFURLRequestSerialization.m */, + F278184E8A4E3E7A2260C7FF4E482DE6 /* AFURLResponseSerialization.h */, + B5A4A68949C49C722CDE476E9A7AA168 /* AFURLResponseSerialization.m */, ); name = Serialization; sourceTree = ""; }; - 1F956714C6A7CF7B7999AEB4E29D418F /* MJExtension */ = { + 1DF4983DAFA8F705D35CC59394E78895 /* Security */ = { isa = PBXGroup; children = ( - 569FA95248CF0B824C3928196386FFC2 /* MJExtension.h */, - 2D68500D4C2F7DB8B114E62F888BDD85 /* MJExtensionConst.h */, - 31F5F018A672BC56D29258EEBC019C32 /* MJExtensionConst.m */, - 0AFFFE7105483F8A94BFD883AD56221D /* MJFoundation.h */, - 4830CF5BA96EF2AA3AC7496D62A49A0D /* MJFoundation.m */, - 7D8FF130378AA0390E3754AB93673319 /* MJProperty.h */, - 87A1195922F05E5D23FF9A3C4509A854 /* MJProperty.m */, - 250848691A5C0FC662F372FB71E83AE5 /* MJPropertyKey.h */, - 12CCB648397BE0600012171A844509DE /* MJPropertyKey.m */, - 950F7A4DEA1A2D31E4A650C9526788F7 /* MJPropertyType.h */, - 7842E350E0D12563DE7C0EB363356BF8 /* MJPropertyType.m */, - 25ABF76DAF311B44A4F41DD3F9F04644 /* NSObject+MJClass.h */, - 5A50D4A4631B759E5D73FDFF78C8BF75 /* NSObject+MJClass.m */, - E200433A892F1843DD9B8C05E3C226BE /* NSObject+MJCoding.h */, - 9D403D54754F62E7ECBA2668B217E5FD /* NSObject+MJCoding.m */, - D915858ABB2794C80C0D2328483F75C4 /* NSObject+MJKeyValue.h */, - C23DF793769699E27A02E0B30615EF6F /* NSObject+MJKeyValue.m */, - 0C8185E7D34531047F63FFFBB2C6C9D3 /* NSObject+MJProperty.h */, - 4AFCF05D160C4A925AEC624ED1CD826F /* NSObject+MJProperty.m */, - 0A6C15EE27B77ABD56B0A0807D581260 /* NSString+MJExtension.h */, - E310A44D757B0556FA6F2882D1565A8C /* NSString+MJExtension.m */, - C006D91CB7EF7E3CDD3E746411DCC861 /* Resources */, - 93847A1A2F274DFFE13AFE589395B53B /* Support Files */, + 0300D33CB343F4D8FBD5BC95AD45F71A /* AFSecurityPolicy.h */, + 11370C376BB4F56A26E5030C3491EA42 /* AFSecurityPolicy.m */, ); - name = MJExtension; - path = MJExtension; + name = Security; + sourceTree = ""; + }; + 207BC45CB5E00B460C62F95219104E78 /* LookinServer */ = { + isa = PBXGroup; + children = ( + 3756D150609AF2F91795AAD502BD5612 /* Core */, + A24AA6515E610B72AECB060D2073910A /* Support Files */, + ); + name = LookinServer; + path = LookinServer; sourceTree = ""; }; 2859475DD957B3C624425C23759DE609 /* iOS */ = { @@ -950,240 +1294,172 @@ name = iOS; sourceTree = ""; }; - 2FC4867627CDCD8FC332BB686C62FDE4 /* Core */ = { + 3756D150609AF2F91795AAD502BD5612 /* Core */ = { isa = PBXGroup; children = ( - 7A46DCA8F7BDEE6453116CAF6CBBAC40 /* NSBezierPath+SDRoundedCorners.h */, - B147B49E855B11A35493E26865607BDF /* NSBezierPath+SDRoundedCorners.m */, - 11F1BA773620708277D240BE4CD304E4 /* NSButton+WebCache.h */, - 008AD8F77F87E2DC5C0DB4CD71AC5858 /* NSButton+WebCache.m */, - DDC08D9E69C76309DA07F96C62824633 /* NSData+ImageContentType.h */, - 90687AA744E720C17FD8600B60F43FF5 /* NSData+ImageContentType.m */, - F76369243ECD96D54BBB9C4A97EB6946 /* NSImage+Compatibility.h */, - 9C040DD9465E298ACD105143A3265009 /* NSImage+Compatibility.m */, - 2CCDC185ACCEFD6ACB87234F081FC1A1 /* SDAnimatedImage.h */, - DC6CF0A46A4D9FFFBA2057678DF1978B /* SDAnimatedImage.m */, - 81D5F6E26D64BB94294CEC208FAEEBE2 /* SDAnimatedImagePlayer.h */, - B20A669086F5506692603D3336437ABD /* SDAnimatedImagePlayer.m */, - FB47049112F4F8EEA8F6068CB0393B3F /* SDAnimatedImageRep.h */, - 9954286F43C39384A1EADABA9AAE0B0D /* SDAnimatedImageRep.m */, - 8AACAEAAD31005B66599055215ADA658 /* SDAnimatedImageView.h */, - F0C38163E5AA6D4BEAA1C7E79C82A930 /* SDAnimatedImageView.m */, - 371EEAE238A16CCB71633D3E6EF40F2B /* SDAnimatedImageView+WebCache.h */, - 0C6DD7AD3672258C4407B4269B490F27 /* SDAnimatedImageView+WebCache.m */, - 34E2AA501576A0C5221012B9066EC56A /* SDAssociatedObject.h */, - 0C838D64A8654D1DDA15A6DDC98360A9 /* SDAssociatedObject.m */, - 42134A400043398C196C2BDF73B21075 /* SDAsyncBlockOperation.h */, - FF49D60AE2D0E7C2857D88C5353083C3 /* SDAsyncBlockOperation.m */, - 678A010D7D73785C1E08D97B5F67AAAA /* SDCallbackQueue.h */, - AF26D1DF8BE4D63027161EEBE6FDE7AE /* SDCallbackQueue.m */, - AC2514CF7A7B043E035CFB079E6FB5A0 /* SDDeviceHelper.h */, - 4090C24D16A324EB9D2A6747886BD217 /* SDDeviceHelper.m */, - 6DFD30C63C15966EA8BF3CAD55EB97F8 /* SDDiskCache.h */, - A113F5BE027C0A2BC1CC3F420069F969 /* SDDiskCache.m */, - 078FC3682AC6F2B8020DD6D0F6A1A818 /* SDDisplayLink.h */, - 48E4A519DF8188F67D6109DB1AF82FF9 /* SDDisplayLink.m */, - D13BE3E84BFB9462CF54B22B35F89ADC /* SDFileAttributeHelper.h */, - DBFD2ECA52ECDAAA78246FE8B02312A9 /* SDFileAttributeHelper.m */, - 5FD6594A1D1613C90FF5EF2CBD5CE123 /* SDGraphicsImageRenderer.h */, - 661BCD3C752D21E81C83DA14D3C4502A /* SDGraphicsImageRenderer.m */, - 7C38C5957F4EAC459AB28A71622C865C /* SDImageAPNGCoder.h */, - BF154B0F2EB8913A8674795FD63311D2 /* SDImageAPNGCoder.m */, - F7A20DE3DDDA450D1997F9A3184CD3C6 /* SDImageAssetManager.h */, - 19F5C3BFE7C9E2977EB241266B257ABE /* SDImageAssetManager.m */, - 7315702A1F332F57A8765F720EE5B18F /* SDImageAWebPCoder.h */, - DFD5A14F9DC74814903A901B625C5A94 /* SDImageAWebPCoder.m */, - 93D1581B25C7E0154AE410EBB56CE516 /* SDImageCache.h */, - 8332CB32D0FA2CE8D910AA5A9BE18D8B /* SDImageCache.m */, - 19E0C6994863739B688E61DCE0E025C3 /* SDImageCacheConfig.h */, - C5D645FDA53D7713D436C992B2BC3E96 /* SDImageCacheConfig.m */, - 97F65BC08A412ED6706647722A834532 /* SDImageCacheDefine.h */, - 9AF4B903EB65570DDDE8731659809CA1 /* SDImageCacheDefine.m */, - 0ACA8E457A64FBC07F850B4E390020D4 /* SDImageCachesManager.h */, - F0CEEBB5DD628DB121172299787A25A9 /* SDImageCachesManager.m */, - 9DBD448EB576D346FBA1D20A1BD13F1D /* SDImageCachesManagerOperation.h */, - 305FF55ADA3393924EFC2D4B6D38166D /* SDImageCachesManagerOperation.m */, - B3A54C7306CBDB1BC3189CCF492C92DE /* SDImageCoder.h */, - 01F1EC51FF11D8BE91D0807E9CB714CC /* SDImageCoder.m */, - 176CBDEEAB52421C3AA5CB3917B54885 /* SDImageCoderHelper.h */, - F62E78180455B791A034CFBD4F4CE6A3 /* SDImageCoderHelper.m */, - DBEED872AB83B013F34A14A1823F4820 /* SDImageCodersManager.h */, - C3EC2E3BBB3895884BB4AA3B74A54476 /* SDImageCodersManager.m */, - AB8EC26A51378B3F4C5559E371607480 /* SDImageFrame.h */, - 9B7D77CB378449CF4A7041A3EA89C102 /* SDImageFrame.m */, - 12C162655386843E5BE2582AC09CA762 /* SDImageFramePool.h */, - BF3675A98BB80F2630D08AB3BE31E1B7 /* SDImageFramePool.m */, - B60142D76441D9D2B7BA4991E7523577 /* SDImageGIFCoder.h */, - 42FE2C6A18379D9944FBBA606FB88133 /* SDImageGIFCoder.m */, - 34CEE2DA708B82493E132F274E2E9493 /* SDImageGraphics.h */, - 830D06A83C1E8E77E539514107F83812 /* SDImageGraphics.m */, - 8430A616C01FADC1B0DB9E5D08A03C35 /* SDImageHEICCoder.h */, - 20B21087EF80825B8FC789A191A95BAA /* SDImageHEICCoder.m */, - 13F0EE17165FE326BF8D348C181A1E71 /* SDImageIOAnimatedCoder.h */, - E2EAE5E554B07101C740E6CB128A93A0 /* SDImageIOAnimatedCoder.m */, - 0CB3E312C9D65596A37072C76944B850 /* SDImageIOAnimatedCoderInternal.h */, - FF09658FCA5560C3552AF5B4B7E7C6ED /* SDImageIOCoder.h */, - 21EE020A32A9ADF76D7C1AF1A9B28D63 /* SDImageIOCoder.m */, - 50DC89AF710F42BFF3D4C048EFAC8BB7 /* SDImageLoader.h */, - 7869EB02C0774141B550180F17DBF9F0 /* SDImageLoader.m */, - 80E9D6278C5650A6AD05F331651F6DEB /* SDImageLoadersManager.h */, - A1ECACF57484B51D17735566ED038104 /* SDImageLoadersManager.m */, - 2C0A8B13D619D89C3E57F4B83ACBF157 /* SDImageTransformer.h */, - 6E7A746456C4F5E2C887572055F6A833 /* SDImageTransformer.m */, - A294AA5EAB4FD3CAF8C4A072117591C1 /* SDInternalMacros.h */, - 06A2AED69705719F9BEBAEDC9D1D18C6 /* SDInternalMacros.m */, - E97276CEE18BF4611E1C1D42736F6EAB /* SDMemoryCache.h */, - A6CCAA7B0AD1373217438DACF7AB456C /* SDMemoryCache.m */, - 61B4061AC178FEE58C9618133524CF08 /* SDmetamacros.h */, - 1F0E8534D3C055E4D5D27EBF7422DA74 /* SDWeakProxy.h */, - 93A3B9C517383784D38DA222632F5FFB /* SDWeakProxy.m */, - 67DDCFED9CF39A1F995D9E7B12E35A7E /* SDWebImage.h */, - 9802609AB0266E444A1BD29FA119D9BC /* SDWebImageCacheKeyFilter.h */, - F7E0DB23007E49794165F74548446C13 /* SDWebImageCacheKeyFilter.m */, - 4A71363040CF6A8E6D918CEF79A555D5 /* SDWebImageCacheSerializer.h */, - 6C4CAA32BF7068345545D717BAAF7069 /* SDWebImageCacheSerializer.m */, - 7B6867FF0B2276E04032D8E5C44B4EB9 /* SDWebImageCompat.h */, - 7980625AB48FABAF33EDB825FF587011 /* SDWebImageCompat.m */, - 19C379703ED728112C6AD8D69CB97193 /* SDWebImageDefine.h */, - 6DE36A434A8BD3593CCBD95090373332 /* SDWebImageDefine.m */, - 00031196DD7FBA552243DCF5CEB19ABD /* SDWebImageDownloader.h */, - F104350C0F7D19687DAC6BD75101DA7F /* SDWebImageDownloader.m */, - 8A926EA8E3863425810DDC585C464587 /* SDWebImageDownloaderConfig.h */, - 1E8EE46DFF5945CB5FDB220509F5E1A0 /* SDWebImageDownloaderConfig.m */, - 29834704EC1453F0ACBDF5CAA435E7B0 /* SDWebImageDownloaderDecryptor.h */, - 1C27DC7D5FFFA31A8EA1C7B95F3079E1 /* SDWebImageDownloaderDecryptor.m */, - A1D6DA8B66269F171ED8918C664075F4 /* SDWebImageDownloaderOperation.h */, - 825CA08D9974B4E876CAFA68A0F53F93 /* SDWebImageDownloaderOperation.m */, - 969BDA148FEBCD19E1B7701E7F70E539 /* SDWebImageDownloaderRequestModifier.h */, - 06B71FC03BF92D5C7E3E050752C0E06C /* SDWebImageDownloaderRequestModifier.m */, - D99D7FCB3FD62B8D8BF11087E1D6E47F /* SDWebImageDownloaderResponseModifier.h */, - 4F51691B6717B6D9E4E3FE0977CF3163 /* SDWebImageDownloaderResponseModifier.m */, - 646B483EDAD1F8B7F96981EB5E185F2E /* SDWebImageError.h */, - B509365346F676352BBC6630F5F1FADB /* SDWebImageError.m */, - D0B1FCAC31B9EF58F1FD85B83EA55B1C /* SDWebImageIndicator.h */, - 0FC44A2AEE9BAA02332A14994FF0E2E0 /* SDWebImageIndicator.m */, - 02379CD5F0D938EE2DBABC8871CB17E5 /* SDWebImageManager.h */, - 09C03827CE30DECF1B8884688B6651D8 /* SDWebImageManager.m */, - 33152C1C1E9FE19D1E9C8D8BF0C963DA /* SDWebImageOperation.h */, - 76F97ACAD92849B1F665FD0FF282B3C8 /* SDWebImageOperation.m */, - B9DF6B027952E0BE3781007ECC6436E7 /* SDWebImageOptionsProcessor.h */, - ADF1D8C19CC2D66E65B4B1746316FFC5 /* SDWebImageOptionsProcessor.m */, - 0DC8E0CC70A7B84D1A1E1FAAF5AF5A4D /* SDWebImagePrefetcher.h */, - 916FC91BADACF2A6F0FF12F1385FC1D4 /* SDWebImagePrefetcher.m */, - 575E3DAA2F5DDC8FBD895B8BEA5FB8C6 /* SDWebImageTransition.h */, - A11030FED687E26E2A7953D880C8DDD7 /* SDWebImageTransition.m */, - 755B7205B482C6B79DEAE02978E7FD20 /* SDWebImageTransitionInternal.h */, - 9E2F76F628A20AA296860E039C6A51DE /* UIButton+WebCache.h */, - 4638EBD469283AF4DC5CBD3CE927D254 /* UIButton+WebCache.m */, - 851329DB564FCDDAD9A52952F487E28D /* UIColor+SDHexString.h */, - 10E420AEEA134E4CDDBAA68DEA103561 /* UIColor+SDHexString.m */, - 377FB4D51134D774594E6EAF0BB4DFAA /* UIImage+ExtendedCacheData.h */, - 8FC489301C2534B7DD53B90720E80BF3 /* UIImage+ExtendedCacheData.m */, - EA46C1DE7820870BF842553EA6A951F9 /* UIImage+ForceDecode.h */, - 840FE4FBC8DFDB4B1238B06FEA5AF259 /* UIImage+ForceDecode.m */, - 429C09B93893D24656048D336CE95D59 /* UIImage+GIF.h */, - 24F6DCD61BBDE3823CE167416B3799D1 /* UIImage+GIF.m */, - 4797723C6D7C918B816F46FCFB028F6F /* UIImage+MemoryCacheCost.h */, - EA1E48B813787CAC28E89E7F260BFCD4 /* UIImage+MemoryCacheCost.m */, - 03DE7669ACCB33ED7598791177D4881A /* UIImage+Metadata.h */, - 46F91B0801CEBD1D73003708566CC913 /* UIImage+Metadata.m */, - 897B6BFD5EA50E7440FD4FA3769B3C78 /* UIImage+MultiFormat.h */, - F68941BD4F4913D60B00D4A8F049112A /* UIImage+MultiFormat.m */, - AF6FBF6EC0693B752A91650764E380C8 /* UIImage+Transform.h */, - 14C4334FE2177757C132CBBCD17C11B5 /* UIImage+Transform.m */, - 982D370CD4E116E0C1917E832541C530 /* UIImageView+HighlightedWebCache.h */, - 56347C360CEDAA8246A01A213DEBBF8B /* UIImageView+HighlightedWebCache.m */, - 23078E14E88B14332A0B4BE57A2A9488 /* UIImageView+WebCache.h */, - C6C465F665338FA163A2F6623C933047 /* UIImageView+WebCache.m */, - A87E9EA0B6E9AB8C1E29A3AE50F278CB /* UIView+WebCache.h */, - 7D3CFDF279C9B9946089A89EFB72A50D /* UIView+WebCache.m */, - AED6E178EFE04C18394DE24CF7E24E01 /* UIView+WebCacheOperation.h */, - 3D5935FEEF657D48BF93BE04A41CF816 /* UIView+WebCacheOperation.m */, - DC6DB03243923516662807D789FF26B1 /* UIView+WebCacheState.h */, - 197BBC12418F4C1E7719181019D1E9EA /* UIView+WebCacheState.m */, - 96966FAF94AEBEB4718998C79115AD0F /* Resources */, + F29A616129C4E4311BF6B3256DB728C2 /* CALayer+Lookin.h */, + B81E913AAFCC8C59F40167A11BAD1D42 /* CALayer+Lookin.m */, + AA2B2D56E95C386717A6F0CD8A922C40 /* CALayer+LookinServer.h */, + DF90BC0D1488FDD0AE7DD2D9DBE61B6A /* CALayer+LookinServer.m */, + BB2E3314150F2C8286028156B0A762DE /* Color+Lookin.h */, + 3EFE803ED03E92B2B8EC05A0FC2130D3 /* Color+Lookin.m */, + B459A7146BCDCE5DF7BCC9B1C7AF4030 /* Image+Lookin.h */, + 5CC1CB26EBFBA958C44A45620E65D37E /* Image+Lookin.m */, + F9400AD97C7D390C0022619C51584770 /* LKS_AttrGroupsMaker.h */, + FCFFAF1ADD68F376CCB4269DAA28E457 /* LKS_AttrGroupsMaker.m */, + 521CE5DFBD4FA9519A07333FD40087EE /* LKS_AttrModificationPatchHandler.h */, + B31031880490EAB03C52D376E4CAE128 /* LKS_AttrModificationPatchHandler.m */, + 4DD4CF37CC301AC7FE2A7E1D6E25262A /* LKS_ConnectionManager.h */, + 9F0B73A4BF6A04609C98D914ED5F371E /* LKS_ConnectionManager.m */, + C64862E863ABC63C9C69F9D569759376 /* LKS_CustomAttrGroupsMaker.h */, + 0BD1A357400FFDAACAA0A9EF93FCBE15 /* LKS_CustomAttrGroupsMaker.m */, + 5AE82ACD8457FC1F884B6922FEF63CB6 /* LKS_CustomAttrModificationHandler.h */, + DF4971334F726E1A57CC0CC51C6DC727 /* LKS_CustomAttrModificationHandler.m */, + 2FA4B9B10356D7846EAC732784AE4B60 /* LKS_CustomAttrSetterManager.h */, + 804BF40AEA86A02553D19951CB451042 /* LKS_CustomAttrSetterManager.m */, + 6AE4DE6EA99247529F51CDC210E1B91A /* LKS_CustomDisplayItemsMaker.h */, + D7A7C8D2368C31D5517C69AF9C21303A /* LKS_CustomDisplayItemsMaker.m */, + BD8D4C08450095A4BDCDBFA2F8DE70A7 /* LKS_EventHandlerMaker.h */, + B75044F1BA3F62B24D1F6705D2D66A02 /* LKS_EventHandlerMaker.m */, + 9CBEBBEC52C8B93FDED0B8E1E9DA1939 /* LKS_ExportManager.h */, + E1FCAE90D248FD5EB1718F110A71F968 /* LKS_ExportManager.m */, + 26F0B678A641C41764C7544218AD9F83 /* LKS_GestureTargetActionsSearcher.h */, + 45E4723FBE71FF9ADE4AB2F76D2DA14F /* LKS_GestureTargetActionsSearcher.m */, + 5F586E3EC54302A6896FBF08F870CAD9 /* LKS_Helper.h */, + 16F8B2064DB9779ECB8F1B480CA181C3 /* LKS_Helper.m */, + 278B371619258173DE9D9B0FFA6BA140 /* LKS_HierarchyDetailsHandler.h */, + A746694BCB1409FC0B6514429221C198 /* LKS_HierarchyDetailsHandler.m */, + 70BBFC2B49529B31B7D32BD0FAB0EADF /* LKS_HierarchyDisplayItemsMaker.h */, + 2D2CD83C67F05747C39D88CED9A5DDBC /* LKS_HierarchyDisplayItemsMaker.m */, + 66F2BE6DE434172227ECC11F2576619D /* LKS_InbuiltAttrModificationHandler.h */, + 354321D8D4D2663CC74E3C8C7010C963 /* LKS_InbuiltAttrModificationHandler.m */, + 4AC69AA60F0E51E261AA9071D16524F8 /* LKS_MultiplatformAdapter.h */, + 8AAFEE50CF56B2103D056BC42C8FC0E3 /* LKS_MultiplatformAdapter.m */, + 14FD02BD7DB8AC12A9596FD7D10BA589 /* LKS_ObjectRegistry.h */, + 8678FFD5CB056455C0EB7778B170EAF6 /* LKS_ObjectRegistry.m */, + 58F260DB3140258F92F78788594C313F /* LKS_RequestHandler.h */, + 9DDE49FB8DD3D0926CB71DCCB48897F7 /* LKS_RequestHandler.m */, + CCC0039C105F9489D458A6917B399A0C /* LKS_TraceManager.h */, + 8F10AD41ECBDA2E31F4D0354293FF10D /* LKS_TraceManager.m */, + 97A941D106C85302397B5B03771DB340 /* LKSConfigManager.h */, + EF4826C096FF849D4E369D7C176C05C8 /* LKSConfigManager.m */, + AE49DBFD7747CCA7312F5223902CD0BE /* Lookin_PTChannel.h */, + 276C305CE849709E6E95E8B8BCACFFBB /* Lookin_PTChannel.m */, + 94A0A26ED8D77A34A56CFCB4F479BBA1 /* Lookin_PTPrivate.h */, + EAAAA4757F7C32D06EFABC2E3F5A7E92 /* Lookin_PTProtocol.h */, + E48D347569829823CC334B4DA45B2BC2 /* Lookin_PTProtocol.m */, + 5CDE75D520BF5D9777D6ACD7798BC004 /* Lookin_PTUSBHub.h */, + 59556424F69D2F15031FF91203C5B1D7 /* Lookin_PTUSBHub.m */, + C9CD5CF80DF285969292A93B2FC1C6C5 /* LookinAppInfo.h */, + FD4903250ADF971C256406813D8C1DEE /* LookinAppInfo.m */, + AAEC123AE9F853D11A1A1179B24CBACD /* LookinAttribute.h */, + D59346EAB789EE81F0825892B87F78E7 /* LookinAttribute.m */, + 30738EF48289437474189DD2B1C18680 /* LookinAttributeModification.h */, + 02595F4CE092E8F076796074E901A65C /* LookinAttributeModification.m */, + BCEBC8E89BEE2EE962363FCC92FC6E61 /* LookinAttributesGroup.h */, + 67D77E75D0263CDFA569481CA359AE73 /* LookinAttributesGroup.m */, + 80795F8F1A43832D4B66BBD525759637 /* LookinAttributesSection.h */, + 42516AE5009205BBCFD63441B614A7E7 /* LookinAttributesSection.m */, + E5BA3AFAF372382F326FE19156B50F24 /* LookinAttrIdentifiers.h */, + 3040952A3BB90E1A48E70463CF6AC78E /* LookinAttrIdentifiers.m */, + 6B33E2C4415F95B948BC836B89DB55B0 /* LookinAttrType.h */, + AD02773A95705584AC13BC9360993045 /* LookinAutoLayoutConstraint.h */, + 255503B67607D6F8418BD1A29701AFE1 /* LookinAutoLayoutConstraint.m */, + D9091431CFC5C0A100D291AF8A2D2B93 /* LookinCodingValueType.h */, + 9C12A568F50663B0354C6A5190E85487 /* LookinConnectionAttachment.h */, + 756C6AB59627E794C95106401B7E91D7 /* LookinConnectionAttachment.m */, + 75AC1BE9D1EBA73C1A7D6CBD7AFEFBB3 /* LookinConnectionResponseAttachment.h */, + E2F4A91F369E1A8FB89246BE23537163 /* LookinConnectionResponseAttachment.m */, + 564C2CDD0AE1B9DE54315A467EA6BBB5 /* LookinCustomAttrModification.h */, + 2E29830F3F03359FA3D6E5051EA37BE8 /* LookinCustomAttrModification.m */, + 385C18376D7D7314789C812587A3B1A6 /* LookinCustomDisplayItemInfo.h */, + 984CA174C8D3E831F87D9D84DD88440D /* LookinCustomDisplayItemInfo.m */, + 070AFBF58C2CF5274A3FAEE778C0864E /* LookinDashboardBlueprint.h */, + 5EFF5F769414BBE23E36B9213F813FB6 /* LookinDashboardBlueprint.m */, + 0F541D4B8A3B7E063BB4AE488C9443D0 /* LookinDefines.h */, + 16AD6D30F07932689DDECD4AC477E876 /* LookinDisplayItem.h */, + 70DF286705B2D1D7B78C7AA955BA2606 /* LookinDisplayItem.m */, + 10C92CFDBED4322E033ABC6F5ACC96AB /* LookinDisplayItemDetail.h */, + 424E1CD2A8804E0A1724D8EADA301314 /* LookinDisplayItemDetail.m */, + D4B53A1EC10D12A5BE9E935B855DB4C2 /* LookinEventHandler.h */, + 920C3A261F36A2C648F90937F7072D84 /* LookinEventHandler.m */, + E25044B9D78FF27BAD6D0EE168A019F5 /* LookinHierarchyFile.h */, + 1F5560257C3ABE19E3CE945E12F1679A /* LookinHierarchyFile.m */, + E000A08E3EC43F17949721182B8F804C /* LookinHierarchyInfo.h */, + 6B52C45975B621E9B4889D036BAA8D0F /* LookinHierarchyInfo.m */, + B9D8E6F60F0D21F3781FBE5E8D6A6139 /* LookinIvarTrace.h */, + 908B6B0806B4B9F61D9989FC02488A48 /* LookinIvarTrace.m */, + B3FA407D1022AF2CB763141971FC4EB0 /* LookinObject.h */, + 93962A02113E51F674015AF1031E28E2 /* LookinObject.m */, + F655B5C3F030F1435ED5BD0A0E68050A /* LookinServer.h */, + 720CFE8548CD7904294866C990785774 /* LookinServerDefines.h */, + BAA8A1296FBF9048287BEE21F3B30624 /* LookinStaticAsyncUpdateTask.h */, + D0A854986C4B29F4B4CD59A9183BF626 /* LookinStaticAsyncUpdateTask.m */, + BF801C9DC266DBE995123F5ED187A549 /* LookinTuple.h */, + 14E874114A831512644E2A5EB09CD1A2 /* LookinTuple.m */, + 456AC6BFC6F1376659E96E494E05B72B /* LookinWeakContainer.h */, + 20491D6CA1BB8F2F29EF3415E599ACEE /* LookinWeakContainer.m */, + A60942B17B0CA3AC711CDCE86BD9558C /* NSArray+Lookin.h */, + 97A61C6C7AE704F2C4E7790EA2165AA8 /* NSArray+Lookin.m */, + FCD45CDBD694FE635EED9B11544EE273 /* NSObject+Lookin.h */, + D0757789009DAF5FE17451C8742CC19F /* NSObject+Lookin.m */, + B06A69DA2C8CDCF6F06CD519FC21C514 /* NSObject+LookinServer.h */, + 2716B52AE20CE03F3CE527E710496F24 /* NSObject+LookinServer.m */, + B06D60C4A52A06B583043B5F33E9CE23 /* NSSet+Lookin.h */, + 96032E81848B76DBF42F21BD90E472F4 /* NSSet+Lookin.m */, + 84FDFFDC449C8F153A09137D6EAAD4CC /* NSString+Lookin.h */, + F5062DA8AEAE4430782016BEC468E129 /* NSString+Lookin.m */, + 23E1DEFC1B8E7B2CCCE1A0B8392894AD /* Peertalk.h */, + 07D77214AE62D3768C2BB6BDB50720B4 /* UIBlurEffect+LookinServer.h */, + 99A76FE381DE593E9457E666DD4A9799 /* UIBlurEffect+LookinServer.m */, + BDF9EAF852B79ED40C1097348925D782 /* UIColor+LookinServer.h */, + 3888E51E50172FB2ABE3D3D0E2C528B5 /* UIColor+LookinServer.m */, + 5A9B1B38878AB3338A36D3D2DD4CBA99 /* UIImage+LookinServer.h */, + 36FE5D23FB2EF9BEB81A161D40B10342 /* UIImage+LookinServer.m */, + 2BAD1F27E9FC617CBBAB146C0BA99F46 /* UIImageView+LookinServer.h */, + 7D5FD5B9915F367587FFCCA6A20E2F50 /* UIImageView+LookinServer.m */, + F6A0C7E14AE1D6B963FB5E50B04CC71C /* UILabel+LookinServer.h */, + E2EB5B7DFED85087E5CCAA7F25F7F6DD /* UILabel+LookinServer.m */, + 1CA47DE0773F00D68874CB81729C4ED5 /* UITableView+LookinServer.h */, + D738094D77852E91C1FB0B900841B0DC /* UITableView+LookinServer.m */, + EAB417A8F0BC17E30CAD95F001475DB1 /* UITextField+LookinServer.h */, + AC97CF7554D8385D7E25DF2A4B218D2A /* UITextField+LookinServer.m */, + 19C21A3D5DAE989B7ED66E39CDEFC148 /* UITextView+LookinServer.h */, + 5F3E14867B8E7450AEDEDA2617BA5FB2 /* UITextView+LookinServer.m */, + 283AB44ABB83D8E9379522F7DA0C9F41 /* UIView+LookinServer.h */, + 3BD084A818C3461AD1629F9205885E5E /* UIView+LookinServer.m */, + 845E78A89BC68B640BB9D4766F2B6230 /* UIViewController+LookinServer.h */, + CDEDB19624E3C9E8C5154DDA825FFABC /* UIViewController+LookinServer.m */, + FA0D003C4EDBE2F44CAFEC12C0CAF067 /* UIVisualEffectView+LookinServer.h */, + F99D766826C224A2D7D6052D2D54CA36 /* UIVisualEffectView+LookinServer.m */, ); name = Core; sourceTree = ""; }; - 3128165374A2707E315E77D530A52B15 /* MJRefresh */ = { + 39D5C9AD671D153B262532B5476D7282 /* UIKit */ = { isa = PBXGroup; children = ( - 2D2A2C7E78B1029B85E812A9CC5D4F58 /* MJRefresh.h */, - 7D4327E5DC3980134C42B829E8798AA4 /* MJRefreshAutoFooter.h */, - 568638C925360332377ACFB503131A76 /* MJRefreshAutoFooter.m */, - 1D9CC7A1A5CD78BA5BDFC0C1D94B2D4D /* MJRefreshAutoGifFooter.h */, - 2514349975FAC97A668A1C6665BD754F /* MJRefreshAutoGifFooter.m */, - 0073EB182F9CC003B9721B132AC0082F /* MJRefreshAutoNormalFooter.h */, - 7E6DD5C54D7EC67B674C64E88446BAA7 /* MJRefreshAutoNormalFooter.m */, - 3526591F674CF19FB39EF872089A7F49 /* MJRefreshAutoStateFooter.h */, - CCDB436E5F20F839485E728CEF386187 /* MJRefreshAutoStateFooter.m */, - 3126B87E909122AFEE37CA26F800E7D9 /* MJRefreshBackFooter.h */, - 19839A21E0B314D9E8C99EBD5D071916 /* MJRefreshBackFooter.m */, - 29AFC65F883E204F73DDE040C829BC77 /* MJRefreshBackGifFooter.h */, - 32EACA7B3E95EF3C511EEAED34B5C23A /* MJRefreshBackGifFooter.m */, - 087882A7DEA5E7EECA5B73EB89E95C00 /* MJRefreshBackNormalFooter.h */, - 14C952AD321D89B78D085CA0FBC817D9 /* MJRefreshBackNormalFooter.m */, - 1F8526067D06A009E96461455DBA1B40 /* MJRefreshBackStateFooter.h */, - 71B30FE27ADA94703A3F06804277A5C0 /* MJRefreshBackStateFooter.m */, - E553AE6B35449F8CB4BAA4FFE1DCAFAC /* MJRefreshComponent.h */, - FB988F307C9B24539A026F84144A0402 /* MJRefreshComponent.m */, - BEC2871B1357A63D88FCC0144C7847CD /* MJRefreshConfig.h */, - 2EFA72948DE45F4B6CAD9DA5C625D259 /* MJRefreshConfig.m */, - BE6C3AB94897685F9464AA252C4EFB17 /* MJRefreshConst.h */, - 8BECBF70665658E16C4E9DDD74C7161A /* MJRefreshConst.m */, - 53392BC7B7115E12AC2077F4447BF455 /* MJRefreshFooter.h */, - EAFBBF7E1270693113CDF0C1D9CBB512 /* MJRefreshFooter.m */, - F4E10DADB58D42AEAD6CD268CEB583E8 /* MJRefreshGifHeader.h */, - 275A2D66E7913A4B508816E187F4D3C3 /* MJRefreshGifHeader.m */, - 724FB5172055CF20AE6E6F4D007D8038 /* MJRefreshHeader.h */, - F74EE2D92793519D84E4B72CD6AB0C63 /* MJRefreshHeader.m */, - 5713367A1E361064DE338AB389631FF5 /* MJRefreshNormalHeader.h */, - E7D9B8C39A19DDF2CE7619D44758B033 /* MJRefreshNormalHeader.m */, - 73D1ED74B2085AA85B8213943DE4AD83 /* MJRefreshNormalTrailer.h */, - 8E7292A83C005323B245A7EF2737878F /* MJRefreshNormalTrailer.m */, - A20073D67775A184A6AEF2667BC7628C /* MJRefreshStateHeader.h */, - D513B9FE4981B810C5EBD34AAD6D0CD7 /* MJRefreshStateHeader.m */, - 036A5C31DE156FE1001CC60EF1E3E122 /* MJRefreshStateTrailer.h */, - 34B9AAE9B2C02781F4AC71AEDB56A439 /* MJRefreshStateTrailer.m */, - B6011963612818816E2CF40CED8B0112 /* MJRefreshTrailer.h */, - B1CE88DD0007C23B107D2BD3A6AB545B /* MJRefreshTrailer.m */, - 2E459098B6FF83AA9172F97696B64090 /* NSBundle+MJRefresh.h */, - 37DCC80FE271D2095A398F8D8F22C7E7 /* NSBundle+MJRefresh.m */, - 24B89B49F862DFF8218AA2D11CEDFD3E /* UICollectionViewLayout+MJRefresh.h */, - BCC0677B77FA6DFFDE007551F1660B1E /* UICollectionViewLayout+MJRefresh.m */, - C55407E10212267DCB2FC49D3260EF48 /* UIScrollView+MJExtension.h */, - 3B4BB6924504E595528A838685E1B608 /* UIScrollView+MJExtension.m */, - 4C64CBB1952BF537420E489E4AF7DED5 /* UIScrollView+MJRefresh.h */, - 8AF059A8B1C2B3EE76BCDE329D0C926E /* UIScrollView+MJRefresh.m */, - 35F55EE8682F170A101CA85DD55D1B58 /* UIView+MJExtension.h */, - 06B650CAE141ABD90E360415151BC9B9 /* UIView+MJExtension.m */, - 33D98C7E27F657F30141071B1B662940 /* Resources */, - 016CE3C0DE69FA6E7375F8B485359AE7 /* Support Files */, + 081967E91FB2135CDDE098522CC1F303 /* AFAutoPurgingImageCache.h */, + B32DD5288813818219EDE22D3B5F6ABF /* AFAutoPurgingImageCache.m */, + DBB5199AA36CBEDB4430823E47805048 /* AFImageDownloader.h */, + 715B54C7081C9B50766843BEF2736EA5 /* AFImageDownloader.m */, + 0AEC89E1DB573A8895DAE690A3E4E531 /* AFNetworkActivityIndicatorManager.h */, + 63F82FBA430AAB56CCE50AA74B7449A4 /* AFNetworkActivityIndicatorManager.m */, + 4FB34E0E78E7FB13DDF20F067BE65187 /* UIActivityIndicatorView+AFNetworking.h */, + 27DBD37CA00D46F9E675FBD0A123CF21 /* UIActivityIndicatorView+AFNetworking.m */, + 4971D64582BFFE7AABA697FE6171D9AC /* UIButton+AFNetworking.h */, + 5056018B2BE1CBBCA76F0A1E0653D4D3 /* UIButton+AFNetworking.m */, + 79089E0A7C9885BD8A68564AED25725D /* UIImageView+AFNetworking.h */, + 6EFA5E35451613555520D318C62A6A0D /* UIImageView+AFNetworking.m */, + 254A2506DA8D281B3021ACECC4F127B7 /* UIKit+AFNetworking.h */, + 6708CFA86C80E1A6A83E259D47D3EAFC /* UIProgressView+AFNetworking.h */, + 1715EE59F5A92423F93FAFB62F1D7885 /* UIProgressView+AFNetworking.m */, + CFC090EF901F43F9185E78D093B9E0F2 /* UIRefreshControl+AFNetworking.h */, + 224720D17C83C285A57A14AE3249983B /* UIRefreshControl+AFNetworking.m */, + C4B5B9DB7663D1E0C914308BB2C0686C /* WKWebView+AFNetworking.h */, + 63FEF4A55AABED2088DA6B42E280D2B7 /* WKWebView+AFNetworking.m */, ); - name = MJRefresh; - path = MJRefresh; - sourceTree = ""; - }; - 33D98C7E27F657F30141071B1B662940 /* Resources */ = { - isa = PBXGroup; - children = ( - 5FDFD2C717749B65FE64DACB99DF72A3 /* MJRefresh.bundle */, - 94F556719E0728E491D5BDF953E9A668 /* PrivacyInfo.xcprivacy */, - ); - name = Resources; - sourceTree = ""; - }; - 347AB39793E933B72AA519D8A60C8AFD /* NSURLSession */ = { - isa = PBXGroup; - children = ( - 2B8247E0ADA45F5408F3DE8313900894 /* AFCompatibilityMacros.h */, - 1C60E3EC4F7CE664E3A6586ED2AC0ED5 /* AFHTTPSessionManager.h */, - 8C0AB8960CBA6D24923E096B9378691C /* AFHTTPSessionManager.m */, - A95F96D9DAA700949C3A302C92FD9231 /* AFURLSessionManager.h */, - 7506ED7F0118C1C5FE230328CCC6543E /* AFURLSessionManager.m */, - ); - name = NSURLSession; + name = UIKit; sourceTree = ""; }; 4098ED899C8DF8E013F9F260ECFAA236 /* Pods-keyBoard */ = { @@ -1203,6 +1479,162 @@ path = "Target Support Files/Pods-keyBoard"; sourceTree = ""; }; + 45BB10323729BD251880F77ABF1C2AF0 /* Core */ = { + isa = PBXGroup; + children = ( + 5D2FE77EBB4DA88368FEE0FB24854873 /* NSBezierPath+SDRoundedCorners.h */, + 2412E2A59A075C38936A2610D1ABC897 /* NSBezierPath+SDRoundedCorners.m */, + B91F70B44F5438EBAEF2ED0F5B181C54 /* NSButton+WebCache.h */, + 427721CF1489C69E69EFD257F673200D /* NSButton+WebCache.m */, + A091B8685CFF858DF1478D74A0602F32 /* NSData+ImageContentType.h */, + FD9A0FF4BC528335E17AF558759CC155 /* NSData+ImageContentType.m */, + 9D5928FD36684070A4AF8169CF66A94A /* NSImage+Compatibility.h */, + 9D13E946B329A0E46666436B3BF35A5B /* NSImage+Compatibility.m */, + BAA877091312263E9AF72D142E48EB04 /* SDAnimatedImage.h */, + 008D12F98C44419EC0A8DB3925320238 /* SDAnimatedImage.m */, + D8940A99ECE28941C56D9A97864AE4E0 /* SDAnimatedImagePlayer.h */, + 20ABB6114972E81639D089CAB0FCFD92 /* SDAnimatedImagePlayer.m */, + D7CE187EC41E8BF909ED0FE617B5CADB /* SDAnimatedImageRep.h */, + 71D84BFF9C97CD6ED2FAC67678A93852 /* SDAnimatedImageRep.m */, + 38C5D9064023A870F25FD047E1B0F535 /* SDAnimatedImageView.h */, + 7B9AE4382704B83CA411FAF665D77860 /* SDAnimatedImageView.m */, + 391472186DEB6AD02CB97FE31E7786DD /* SDAnimatedImageView+WebCache.h */, + 914A62A570950E4D83A4EBE0062E5DB2 /* SDAnimatedImageView+WebCache.m */, + E18CAF822E13B69105C0F262E830328C /* SDAssociatedObject.h */, + 06E5F468BEEB51DB8A7E77C947B30422 /* SDAssociatedObject.m */, + 3AEEF11037C1BCFE69D6DA00C1F6DB71 /* SDAsyncBlockOperation.h */, + EAA447D9CA8EDFFD26730C6B416FFD84 /* SDAsyncBlockOperation.m */, + 0AC4657B3FE19E5DAB493D06AC070AA5 /* SDCallbackQueue.h */, + 1AFF8D521A2F59A97942CA676EC5CD83 /* SDCallbackQueue.m */, + 0B8D3ED63A0D6E1C4341827B7D01B7D8 /* SDDeviceHelper.h */, + 5083F1C9E5A258671D4A20ADDB000283 /* SDDeviceHelper.m */, + 83114C8E20B9B217E7EA43F9F77CC974 /* SDDiskCache.h */, + 7811748FB18DB56B40AF1874A5426811 /* SDDiskCache.m */, + DAEE6FA193471A73D57A74AA1324F822 /* SDDisplayLink.h */, + DB279A22CABD71AAB410E88396A3C6E7 /* SDDisplayLink.m */, + 3AE4997796DA358B1DB8A66215370EFB /* SDFileAttributeHelper.h */, + 1DF2ECF78EA0E6413FB6512AE11F68B1 /* SDFileAttributeHelper.m */, + 952BB65CA9AECB7DA59B00E72F6C9A3C /* SDGraphicsImageRenderer.h */, + C18D52D869C984C4D4DC6F98B352D5BF /* SDGraphicsImageRenderer.m */, + 836E51BD63F00FF107E843F3947DF237 /* SDImageAPNGCoder.h */, + 8F6FB5B25BAE1ACEDCF42E5C0A4C81EE /* SDImageAPNGCoder.m */, + 2DDC5CE94B3CD031DD7B5BC418DDC09E /* SDImageAssetManager.h */, + 0F5CDEC5FA7978C383600FA2E6E0D6D6 /* SDImageAssetManager.m */, + 452A668763CDF94BDE8E00DEBEA3CBFD /* SDImageAWebPCoder.h */, + 00078AED6DDB9E77E4B7A11743D4B41D /* SDImageAWebPCoder.m */, + 3F4964A87C231B4E7FCB7761033A3CE7 /* SDImageCache.h */, + 50FF239901B003C3F00C684A8C24FABA /* SDImageCache.m */, + 993FB7DD8F0F5CDE14006BCE526D824C /* SDImageCacheConfig.h */, + A5F9CD3FA8354DAD169C496B884A0ADC /* SDImageCacheConfig.m */, + CCDF9A8326ECA9F0B261F893178A7421 /* SDImageCacheDefine.h */, + 43EBB3C244FB3EC69D90D12B011B7D4F /* SDImageCacheDefine.m */, + 196FCA4B75B6A5EBA44015FE58014E80 /* SDImageCachesManager.h */, + 083445CDF27981FED5ABFEA79E295D27 /* SDImageCachesManager.m */, + B284A89029CBE4B8FCF7E6D9F8A0C2B0 /* SDImageCachesManagerOperation.h */, + 562970F3419C1EB0AEBC96577B7475A7 /* SDImageCachesManagerOperation.m */, + F319089CE8A771B4E00E74F5CF065DFE /* SDImageCoder.h */, + 065292DC9A45144FF2D837AE8CD65F8A /* SDImageCoder.m */, + E5DB708E9320895D02EB843DDAF4E47E /* SDImageCoderHelper.h */, + 8DC988FE587011D33A8D968D09574375 /* SDImageCoderHelper.m */, + D06BA623349F0685BBCB4816BDDA9DEF /* SDImageCodersManager.h */, + ADC57D4AABE4C703C7538D36FA9C800F /* SDImageCodersManager.m */, + 81C1E48136A225905A857057912E10B9 /* SDImageFrame.h */, + 398FC32341E8B23F05E8B88C228D8361 /* SDImageFrame.m */, + DD2888D9AEDDC5FB4645769FF72434AD /* SDImageFramePool.h */, + 3961BFF026424ABBD07A8DED78015F3B /* SDImageFramePool.m */, + AA15DA30246619414A9C440764360D92 /* SDImageGIFCoder.h */, + 46ABF3C07C780ABA5090E971A8BA3659 /* SDImageGIFCoder.m */, + 668C50C1ADE5AD0F61431E1CC0366B5C /* SDImageGraphics.h */, + E87409A6C236FBEB17F5FADFE67805F1 /* SDImageGraphics.m */, + FBDE8546A774C7DD1D740B8B3DBBB41E /* SDImageHEICCoder.h */, + 02E46BBE37B9E605E49E103E7F87F695 /* SDImageHEICCoder.m */, + 19A28292A0713CF593D9AF3DEF86D9CC /* SDImageIOAnimatedCoder.h */, + A926DAC8E7777046E8188E4D987F833C /* SDImageIOAnimatedCoder.m */, + 8733305AC203407D393753CB75CDD02B /* SDImageIOAnimatedCoderInternal.h */, + 27F231C28D0C004102CE0F6380753C42 /* SDImageIOCoder.h */, + 5E02261623C97F02C5D19CEDE7158EFF /* SDImageIOCoder.m */, + B9037AC04176BA7B3FD6E0891AEFA0F3 /* SDImageLoader.h */, + 9DA067C7872BCFB73BBE4FB45B149A91 /* SDImageLoader.m */, + 924E3600D7E3752D66E60C342840C98A /* SDImageLoadersManager.h */, + 9232737E755EBDB7E66DB0029B1DF11C /* SDImageLoadersManager.m */, + 03EE952C3A1BEC939C8DE9E8AEE99680 /* SDImageTransformer.h */, + BA22E2DA45E11B0A6A18E08D78A1B477 /* SDImageTransformer.m */, + 1CBC630E97E6160C1201FF36CF51A0B1 /* SDInternalMacros.h */, + 6D85FFA2C73630F2AF77342E129DC16E /* SDInternalMacros.m */, + F796365C18A92736860BB37F7E034373 /* SDMemoryCache.h */, + 8DF165DDC3515F177F129981AF41F322 /* SDMemoryCache.m */, + 09E7AB4EEB7AE4F100B108AD6C5152E5 /* SDmetamacros.h */, + 8DD0D105F9EEE0B4DAA94E912B8074BA /* SDWeakProxy.h */, + 4A635255686FD2FCD8C5CAC9FEE2DF53 /* SDWeakProxy.m */, + 59D4DABB171BC7F7B030B3ABE69E9840 /* SDWebImage.h */, + DED6B1DE51BD4E52B477D7C548CF782C /* SDWebImageCacheKeyFilter.h */, + 92C09DB4E8BAF5800F087352EF2C4F48 /* SDWebImageCacheKeyFilter.m */, + D4D4D49490338B3182E06909363E193F /* SDWebImageCacheSerializer.h */, + C5F26A40551254037D690232E0E3515F /* SDWebImageCacheSerializer.m */, + 851E334AEAE8F7D2EAD4FEADAA487505 /* SDWebImageCompat.h */, + 1599325D7A76B2919AC08302175DCE80 /* SDWebImageCompat.m */, + 83CAB8352CBFBF9CE8EB6054C33B535E /* SDWebImageDefine.h */, + 484B42214B225457DE36B4C078B84B99 /* SDWebImageDefine.m */, + 23A3D2686010C595388C060C97BDD19D /* SDWebImageDownloader.h */, + DEC169158FF1164E7540D2EE5DE5BDF4 /* SDWebImageDownloader.m */, + 1CD67E822AFAF2390FFDE37D7406AF22 /* SDWebImageDownloaderConfig.h */, + 1C1934434C5B978B6111F3274360F19E /* SDWebImageDownloaderConfig.m */, + C41A5AC3D89258F73DB096AF44609EDD /* SDWebImageDownloaderDecryptor.h */, + B0E3F7E6463B29A9F532594616A57A29 /* SDWebImageDownloaderDecryptor.m */, + F8A18ADE74F68133570FA542FF4A303C /* SDWebImageDownloaderOperation.h */, + 181E31AA047EF4D7C7D768D6E0745646 /* SDWebImageDownloaderOperation.m */, + 44A4252246EC49F62F0C25505E934B16 /* SDWebImageDownloaderRequestModifier.h */, + CEA53A9CE48CBC1ECC0B09EA1FDE9FD6 /* SDWebImageDownloaderRequestModifier.m */, + C9D1615D95A9058A5F66477080940E82 /* SDWebImageDownloaderResponseModifier.h */, + BAC91C3C7012E2345CE8546D7487DA90 /* SDWebImageDownloaderResponseModifier.m */, + 355BA71055E49EFFC9C986A110289CEC /* SDWebImageError.h */, + 28BBA0E685399A782E77B8A5A0D610E8 /* SDWebImageError.m */, + D0D4FAEBC816AD65D32AA5F30C61F379 /* SDWebImageIndicator.h */, + CA019314A251BB497B3E819CDC26387C /* SDWebImageIndicator.m */, + 64CC1902F2F86AF9B5F4F7FBCDA7C2AE /* SDWebImageManager.h */, + 41DA7358EB7CB91409C1C9F11F5C3EBA /* SDWebImageManager.m */, + 4E632E9EC94233CBF7A6E9F6C8A0F560 /* SDWebImageOperation.h */, + C007CBDC7D49DA6B1DACF451D56A546F /* SDWebImageOperation.m */, + 796944267FD7D8F745B0D165AD82DDC8 /* SDWebImageOptionsProcessor.h */, + 2EA9A6385695AF05307948AD57B725B2 /* SDWebImageOptionsProcessor.m */, + E416FB13B20E56ABB8795CB5D98D23FE /* SDWebImagePrefetcher.h */, + AE2B65C4CF7D797E1149C8944ED21A3D /* SDWebImagePrefetcher.m */, + 8C6CCE875C9DB21D337D98676A6F0AF1 /* SDWebImageTransition.h */, + EF27816E6C55CA22FA9AFA7AFC03334B /* SDWebImageTransition.m */, + AB64BF3D27891743565124E885679AE0 /* SDWebImageTransitionInternal.h */, + 3914EA51A6CABD3AB197013F9FA20C33 /* UIButton+WebCache.h */, + 851E0EFD5B18B0AC4C806169B724026F /* UIButton+WebCache.m */, + BD0670FBA78AEDAE39DCB4F35BE07F7F /* UIColor+SDHexString.h */, + 894200AB37ADDCF2E91E64941663B9CD /* UIColor+SDHexString.m */, + 4AD66CE6D722E5E886958FE0F99A6DA6 /* UIImage+ExtendedCacheData.h */, + 0EC0BD7D613E101DC1F6A91D23A66983 /* UIImage+ExtendedCacheData.m */, + 55DC88EAB1707FF0C1E1A085175B04B7 /* UIImage+ForceDecode.h */, + 6E8A92EE0A2A6F0F83B7C2C369B3FC1E /* UIImage+ForceDecode.m */, + 36D5DF0AB990D1F11E146EA73B6AFFD5 /* UIImage+GIF.h */, + FDAB549AD6E4F2874D1E546728D0C1EE /* UIImage+GIF.m */, + 044192A93545487A7E0420B603C4285C /* UIImage+MemoryCacheCost.h */, + F7A19A83DA09753B0E4583C8A57EF97C /* UIImage+MemoryCacheCost.m */, + FDBEDF55963ED3DA043AEFB43D26551B /* UIImage+Metadata.h */, + 3BBC54810CE213EDD92DD4CE11A399A8 /* UIImage+Metadata.m */, + A72400E84012F4CE4689D3D15AD2D01E /* UIImage+MultiFormat.h */, + 7A46011226423766627FE02357AA5C78 /* UIImage+MultiFormat.m */, + DB71828FA23A5A6DCB9C54657F7D6D99 /* UIImage+Transform.h */, + F26EC6DE08DD5D154B6F753072C347F9 /* UIImage+Transform.m */, + 1929DED59BFBA00FD324FE4259681F17 /* UIImageView+HighlightedWebCache.h */, + 9BD2B0FEC06B60E4A994758E4B4E6A26 /* UIImageView+HighlightedWebCache.m */, + 3FEDE0FBCBA817765A1C7A879A27434B /* UIImageView+WebCache.h */, + 4E6D72207BDDCDC558D0C6F315A4D52A /* UIImageView+WebCache.m */, + B696B0F5ED59F730D9D4DFA1F0BB7CC4 /* UIView+WebCache.h */, + 08B62FFF2C8CEBFA37C7AE6B1C443DF6 /* UIView+WebCache.m */, + 8624FE76D62EAB39E53F7E4261584FC5 /* UIView+WebCacheOperation.h */, + EEE70C2EB2F346F05C3482825CA278CA /* UIView+WebCacheOperation.m */, + 7685E42E1081B69DDDDAF3A75A5FF5FB /* UIView+WebCacheState.h */, + E196407B2ACD1C9DA4C63CD0E4549377 /* UIView+WebCacheState.m */, + 4920189CD8F9658EBC59ECC36E75082E /* Resources */, + ); + name = Core; + sourceTree = ""; + }; 47B776543D6613BCB6FB72308F863018 /* Pods-CustomKeyboard */ = { isa = PBXGroup; children = ( @@ -1219,124 +1651,34 @@ path = "Target Support Files/Pods-CustomKeyboard"; sourceTree = ""; }; - 502B3DC21E7D9121A0C4B98D3286C994 /* Bugly */ = { + 4920189CD8F9658EBC59ECC36E75082E /* Resources */ = { isa = PBXGroup; children = ( - 88D3451B2C2D8161F934A9C946E320E9 /* Frameworks */, - E09502DD4B1D7ABBB4407C6ED07C0666 /* Support Files */, + 8F79F17D5D8DC4891FB5EBCEF14AED90 /* PrivacyInfo.xcprivacy */, ); - name = Bugly; - path = Bugly; + name = Resources; sourceTree = ""; }; - 6365FA12681868274FAA98E6F51817F6 /* Support Files */ = { + 648089F3E610D42989B43C9398785666 /* Support Files */ = { isa = PBXGroup; children = ( - 7E72BDE0490314836A44AFEE2FD465C2 /* AFNetworking.modulemap */, - CC69297E62F679246B8FE5B49D774CF4 /* AFNetworking-dummy.m */, - 98E94877A92313B71CB6789264CC6752 /* AFNetworking-Info.plist */, - F37857D4A0467A12B54C180612695C52 /* AFNetworking-prefix.pch */, - 14D8DE9600B7E469FA4A83E84C149E08 /* AFNetworking-umbrella.h */, - 78744B8D1235EE30BFB429D8C13D63F4 /* AFNetworking.debug.xcconfig */, - 23D6F4D8D5B6512D7A50FF1054426C09 /* AFNetworking.release.xcconfig */, + AAEDBCAB0B0894B9C009A27446ED6F8F /* AFNetworking.modulemap */, + 249F9D6284D7E5FA7E6B1698622C3922 /* AFNetworking-dummy.m */, + E39CA707ED9C2F951B2DCEA02E531E96 /* AFNetworking-Info.plist */, + F34FC723FED1DA3B3417ED70796A8F55 /* AFNetworking-prefix.pch */, + EA0D7B3EBDB71C539711D5E96D0216FA /* AFNetworking-umbrella.h */, + 1940502A2847EE5C9620326DBE54B6DE /* AFNetworking.debug.xcconfig */, + 0CC9C159DF574F5F481FDD547E219367 /* AFNetworking.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/AFNetworking"; sourceTree = ""; }; - 72657A79EE3B081E5F0D7C1166237E68 /* AFNetworking */ = { - isa = PBXGroup; - children = ( - BE440D8DEC29075E20FE83DB3AB2620D /* AFNetworking.h */, - 347AB39793E933B72AA519D8A60C8AFD /* NSURLSession */, - 19D8D3FE289D2B2C36E0B1D672C942C8 /* Reachability */, - D1B9DC187765592AAEEACCE698694E27 /* Security */, - 1B700D6AB864A19F1C70168CC9BAAEC5 /* Serialization */, - 6365FA12681868274FAA98E6F51817F6 /* Support Files */, - A63CD7E158D91CCE464486A00A29695D /* UIKit */, - ); - name = AFNetworking; - path = AFNetworking; - sourceTree = ""; - }; - 72EAC702A61A19B6EC92D70B6CA9D4E8 /* Support Files */ = { - isa = PBXGroup; - children = ( - 2356B7A3F963324EEBA83CB0C527CC22 /* ResourceBundle-SDWebImage-SDWebImage-Info.plist */, - 38A043FDCD06C3C9914C9A22FB6B1D28 /* SDWebImage.modulemap */, - 34F1A2FD98EEB8019052FBD5528585C9 /* SDWebImage-dummy.m */, - F104F9FC5C4BB399EC2C2B96BD7714B8 /* SDWebImage-Info.plist */, - 801C19E603261CA9778C89D068D49697 /* SDWebImage-prefix.pch */, - 70330531B46EEB4398625F2AFC6683E5 /* SDWebImage-umbrella.h */, - 20B1DAD84F32D1AF296F0D63C5DEE9AB /* SDWebImage.debug.xcconfig */, - 25119C155F0BB240A5DDFB8155627C04 /* SDWebImage.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SDWebImage"; - sourceTree = ""; - }; - 88D3451B2C2D8161F934A9C946E320E9 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 9784638759F544FA3CC67A7E0CA9454B /* Bugly.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 93847A1A2F274DFFE13AFE589395B53B /* Support Files */ = { - isa = PBXGroup; - children = ( - E0E66128C9FA5581B5257A03454E3761 /* MJExtension.modulemap */, - FB792580573132155A61C027392EF360 /* MJExtension-dummy.m */, - E28F3972E6749440E493F6BCD8198F4F /* MJExtension-Info.plist */, - B61705A318B7E4CE5BB4A9A618397777 /* MJExtension-prefix.pch */, - C5D0E76AC56695893DB1713CA7212B8C /* MJExtension-umbrella.h */, - 3316E3BF456739AB7A0F0FD1920F5F6B /* MJExtension.debug.xcconfig */, - 4B22EE0B7D2C1D1066750C4AB84FDA27 /* MJExtension.release.xcconfig */, - 1AFEE2DD6CE0A6302F3235AF172A2B77 /* ResourceBundle-MJExtension-MJExtension-Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/MJExtension"; - sourceTree = ""; - }; - 96966FAF94AEBEB4718998C79115AD0F /* Resources */ = { - isa = PBXGroup; - children = ( - A9F5CF889820DAD55268C3832155A2E1 /* PrivacyInfo.xcprivacy */, - ); - name = Resources; - sourceTree = ""; - }; - A63CD7E158D91CCE464486A00A29695D /* UIKit */ = { - isa = PBXGroup; - children = ( - 246841FAF82F0BA847818A9594B81CCB /* AFAutoPurgingImageCache.h */, - 3FBCEF9827DD721BAF021C98F7311D30 /* AFAutoPurgingImageCache.m */, - E8780E8A7822982224C2ACEBBC3B52B8 /* AFImageDownloader.h */, - 61D0A0EB33F4B0A380D6DE9E8E5D56D7 /* AFImageDownloader.m */, - D875CFB5AA1591E80BD3A95A94255894 /* AFNetworkActivityIndicatorManager.h */, - 859BA7601F83844D2D2ABC395E386663 /* AFNetworkActivityIndicatorManager.m */, - 29DD9709CE876731037B630B8F1370DA /* UIActivityIndicatorView+AFNetworking.h */, - 4C41FE7B076060F0600FEC9D5AFF762A /* UIActivityIndicatorView+AFNetworking.m */, - 7AE552655E7E703CCEDD4BE44EFA5662 /* UIButton+AFNetworking.h */, - F0300A3A30BF1560E306C61ACCE11C1A /* UIButton+AFNetworking.m */, - AB321552F4E1B0F80966FCA9AF11848F /* UIImageView+AFNetworking.h */, - AF94F3E24B633799AB0B2B75B193A4F3 /* UIImageView+AFNetworking.m */, - 2008561C63F2B5CE8C1C38CF97F13753 /* UIKit+AFNetworking.h */, - EAE5F401F42AA242D6CAE9E463DE5CD4 /* UIProgressView+AFNetworking.h */, - 018B520CB407C3492F13C3767C15E377 /* UIProgressView+AFNetworking.m */, - 0044E51493E8CC5F8C46E1EC18F97722 /* UIRefreshControl+AFNetworking.h */, - B070DCCCA22D6ECC24DC0BD5CCEF5372 /* UIRefreshControl+AFNetworking.m */, - 9E3334C24AC0A37A21A6D9B9ECA94AB2 /* WKWebView+AFNetworking.h */, - 71A4B6E144674403F50435C67561B1BB /* WKWebView+AFNetworking.m */, - ); - name = UIKit; - sourceTree = ""; - }; - AA7E5CA260B4C52744905877A30A95DD /* Products */ = { + 676B9CE5A6E7AA2967DC65B937B27934 /* Products */ = { isa = PBXGroup; children = ( A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking */, + 25664483ABF4DC8EC03E7472AA04333B /* LookinServer */, 1FFED36A657123030ABB700256D73F15 /* Masonry */, 2B276B0A79173A1D6E83C9B4FB9A4A57 /* MJExtension */, 43EAAD2AB7E6B407E80E95F643F93D22 /* MJExtension-MJExtension */, @@ -1350,80 +1692,205 @@ name = Products; sourceTree = ""; }; - B9D225EE05CF747670C5F4383D1D8D95 /* Support Files */ = { + 7033CADED0DE1E94800DEBD4699CCA2B /* AFNetworking */ = { isa = PBXGroup; children = ( - 1170792DCF45BF664C43019D3E77D80F /* Masonry.modulemap */, - 5E8106411081DD6C7F5FE7804947412C /* Masonry-dummy.m */, - 9ADF16A9C4A54B7486F74B1F31DE3947 /* Masonry-Info.plist */, - 1C3E83B47A120437F73D41A878F182D1 /* Masonry-prefix.pch */, - 92D14A3D3FA826806436A8CFCBD915DA /* Masonry-umbrella.h */, - 4EF47C40D45E06BA89946B4C9F04A546 /* Masonry.debug.xcconfig */, - 396F4E7921EA26CDE8AAEADDD8CFBB49 /* Masonry.release.xcconfig */, + E56FEF1A9FC3188CBA7C605E21D82A0A /* AFNetworking.h */, + 0022AA4D9F9563E9E44048ACE8830EAC /* NSURLSession */, + 939A57E1DDAC55D5C69090C1F5870298 /* Reachability */, + 1DF4983DAFA8F705D35CC59394E78895 /* Security */, + 1C12383EE7DD980364C4001D92818FC2 /* Serialization */, + 648089F3E610D42989B43C9398785666 /* Support Files */, + 39D5C9AD671D153B262532B5476D7282 /* UIKit */, ); - name = "Support Files"; - path = "../Target Support Files/Masonry"; + name = AFNetworking; + path = AFNetworking; sourceTree = ""; }; - C006D91CB7EF7E3CDD3E746411DCC861 /* Resources */ = { + 7CE997EABABE05F8CF43316DF86ACB40 /* Support Files */ = { isa = PBXGroup; children = ( - 970B39752136D5831550118975DC4A91 /* PrivacyInfo.xcprivacy */, + DBB907FE8BA07A712691E20C170A72E0 /* Bugly.debug.xcconfig */, + 0F824B39219E9142F3A7CD9862002C60 /* Bugly.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/Bugly"; + sourceTree = ""; + }; + 7D43D2B896FD998668FBE9B4659BE7DB /* Frameworks */ = { + isa = PBXGroup; + children = ( + 28162E57FEF7AEFCBD1DF2DA5265929F /* Bugly.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 92B283D705AB92769E44EC289397804B /* Resources */ = { + isa = PBXGroup; + children = ( + A09952981795D69640C1B042E3305F33 /* MJRefresh.bundle */, + 391A041C36FE7567BD540C5CE3F4E52A /* PrivacyInfo.xcprivacy */, ); name = Resources; sourceTree = ""; }; + 939A57E1DDAC55D5C69090C1F5870298 /* Reachability */ = { + isa = PBXGroup; + children = ( + 64E7ACD01BBC889248107EDDA2D34EC5 /* AFNetworkReachabilityManager.h */, + D1332008BE919DA536E622206A6116BF /* AFNetworkReachabilityManager.m */, + ); + name = Reachability; + sourceTree = ""; + }; + A24AA6515E610B72AECB060D2073910A /* Support Files */ = { + isa = PBXGroup; + children = ( + 441C15832925B6A3561346ADCC0F3591 /* LookinServer.modulemap */, + 5630EC1015102C0EF4C6B8B7664C338C /* LookinServer-dummy.m */, + EE91257C2B15E78852085FE246BEF559 /* LookinServer-Info.plist */, + 7A558EBC67B242651FC5E37498D58C11 /* LookinServer-prefix.pch */, + E26FE8A705408387562DCE99FF815021 /* LookinServer-umbrella.h */, + 8796350D3C821036D89B007D8F07CAED /* LookinServer.debug.xcconfig */, + 1EC7EF6A5825A2D3F22E4BC14CD91F18 /* LookinServer.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/LookinServer"; + sourceTree = ""; + }; + B1405370189A1A337560242153369E4D /* MJRefresh */ = { + isa = PBXGroup; + children = ( + 48F7FA6256DAD683842D571B6AF77F51 /* MJRefresh.h */, + 37909A5A250D08DEFD5B5DE8C09C37F6 /* MJRefreshAutoFooter.h */, + 3A066B727D20F282030A1ADDC6C93483 /* MJRefreshAutoFooter.m */, + 1741F6722966FBFEF352A4C6C4B790CB /* MJRefreshAutoGifFooter.h */, + 144DA4097EB311278BCC70CB7964B972 /* MJRefreshAutoGifFooter.m */, + 448429D0C0BEB975134960D1DC282A12 /* MJRefreshAutoNormalFooter.h */, + 4100F303D221E90FB5552B8BADAD3D1B /* MJRefreshAutoNormalFooter.m */, + 2A9F390A64D12DF562DD8E40B2B719DA /* MJRefreshAutoStateFooter.h */, + 0628FA5908F18B74E57C187734650C8B /* MJRefreshAutoStateFooter.m */, + A5C4B6887A00D265269C2F6E18435AC5 /* MJRefreshBackFooter.h */, + 052D1452680A5875F5F4556B2C3EBF0A /* MJRefreshBackFooter.m */, + 3CAC61D29948B64BA8051D1562B8B48A /* MJRefreshBackGifFooter.h */, + D93569B386C3B62D7671951E2F3E8129 /* MJRefreshBackGifFooter.m */, + B9BCB94F8C306615CCBE9A09967DBEE0 /* MJRefreshBackNormalFooter.h */, + 0F6F82FEF48E6F695530EC6293A66090 /* MJRefreshBackNormalFooter.m */, + DB684D191E333C0E03104EAF677B0281 /* MJRefreshBackStateFooter.h */, + C87B486F0C017D80D893AB2194260F03 /* MJRefreshBackStateFooter.m */, + F8490E54D9DFBBD8DD3E31CF3784E7C5 /* MJRefreshComponent.h */, + A17B9A736952191C771B8268A863C154 /* MJRefreshComponent.m */, + A21778AE89CE9CD4592BABF959AFE823 /* MJRefreshConfig.h */, + C24220EC38C300A4231BF27AF6DFBABC /* MJRefreshConfig.m */, + 1DA74014630CFBABD2FDBEF38DF8983E /* MJRefreshConst.h */, + 24A712595C444E0BA97B44FF4CDCE313 /* MJRefreshConst.m */, + ADA92BE9CEF7C7CB2A8B83926C9086BE /* MJRefreshFooter.h */, + 1878BDCAD754FE1097FEBCFED0BE49AD /* MJRefreshFooter.m */, + 794BDDB4DB750BE5FDB105674F99DBB6 /* MJRefreshGifHeader.h */, + 803500457FA774DB0534BE80EADC55D2 /* MJRefreshGifHeader.m */, + C8667C11D6514FFBD572BD04F0665096 /* MJRefreshHeader.h */, + EEE1FEDC0E884357F32741CD751E4851 /* MJRefreshHeader.m */, + D52F763F898CF198A32C6E14F5139155 /* MJRefreshNormalHeader.h */, + 714B36235F9909A284858B25FE2E5788 /* MJRefreshNormalHeader.m */, + 2FF6894CC33A836717208C1596FFDF36 /* MJRefreshNormalTrailer.h */, + 463E1287B5A31340EBA5533E07F066C4 /* MJRefreshNormalTrailer.m */, + 6126457E7DC341A20EBE987BF5EFBC07 /* MJRefreshStateHeader.h */, + FA6D90B9C25635B7DCB5D4E969BAB85B /* MJRefreshStateHeader.m */, + CC23CC0879B489B9B23435E228693BF3 /* MJRefreshStateTrailer.h */, + D779B4B4ABDD5B5950ED77ACB35D7071 /* MJRefreshStateTrailer.m */, + 33572E44B9E84887832C0BA36262B529 /* MJRefreshTrailer.h */, + E2F253C004203C5AD94BC922622BC6C7 /* MJRefreshTrailer.m */, + 84A09578F37B017034C6F7BCB8F8E853 /* NSBundle+MJRefresh.h */, + D83A360037475DAD2928CFE370229369 /* NSBundle+MJRefresh.m */, + 89AD017EC26DF7AC4F66DFDB5DA0BD55 /* UICollectionViewLayout+MJRefresh.h */, + 51A28B0F46A9250A309DFBCF68529D46 /* UICollectionViewLayout+MJRefresh.m */, + 82BAD1603BF8AB0697F3B9EFE8195AB2 /* UIScrollView+MJExtension.h */, + 44D55FDE34D60D0A3766885FFAA60ACC /* UIScrollView+MJExtension.m */, + BAE0475A033CEA3DA4EC7F34C84FAD33 /* UIScrollView+MJRefresh.h */, + 3757A445F05F370F80774CD721B3AFF1 /* UIScrollView+MJRefresh.m */, + A10B5FDADD305EEB28DB0D0E2A5F0828 /* UIView+MJExtension.h */, + BE7D34E50E1D6D499D49FA99FCBA5B5A /* UIView+MJExtension.m */, + 92B283D705AB92769E44EC289397804B /* Resources */, + 12C23AD5B5D91AF36F61D1B4915B2584 /* Support Files */, + ); + name = MJRefresh; + path = MJRefresh; + sourceTree = ""; + }; + C464B91CA34BBA69580D35F692477C6E /* Support Files */ = { + isa = PBXGroup; + children = ( + 284474120A851CCF4B959DA801DFA788 /* ResourceBundle-SDWebImage-SDWebImage-Info.plist */, + EC5B400126BFB1B0BADFDFF8969C171A /* SDWebImage.modulemap */, + C18F32B7C3DBF2A6BE1D3D59B7EA3A68 /* SDWebImage-dummy.m */, + 41DAF3643DD99F049E89894109A00BDD /* SDWebImage-Info.plist */, + 4C5D8C455EC9ADE90A57284C2BEAF681 /* SDWebImage-prefix.pch */, + C422377EFC85D76220E07203EE6D3BC6 /* SDWebImage-umbrella.h */, + C86E87A0833EA6424FC42BF16EB9BA57 /* SDWebImage.debug.xcconfig */, + 838300FCEA5961F23F53260B6EBAB80D /* SDWebImage.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/SDWebImage"; + sourceTree = ""; + }; + C5EB70695F66E901E0A1E52BA833635E /* Support Files */ = { + isa = PBXGroup; + children = ( + 6B3EDE613D2E648606F454799D40CFA3 /* MJExtension.modulemap */, + DA76D826B098D85B81C57F39270E09EC /* MJExtension-dummy.m */, + 1C3B2D3E031B611BB16FA578099AB2D9 /* MJExtension-Info.plist */, + A6E68130F3D101E68A8CD6C9DA0D96C8 /* MJExtension-prefix.pch */, + 19B17B1E7436BD3BF7FE58E23EB65780 /* MJExtension-umbrella.h */, + 6462CD790803203FFC45008B85E0C555 /* MJExtension.debug.xcconfig */, + DBDF1CDEB2C728898F1E8A8BD00C641C /* MJExtension.release.xcconfig */, + 9D58F306C3C8B0AEE8145CC2A1BBF419 /* ResourceBundle-MJExtension-MJExtension-Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/MJExtension"; + sourceTree = ""; + }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 03C5C200A0787E300053CFA8F53CA094 /* Frameworks */, - DCE595EEF85D396533FF4892F3008A92 /* Pods */, - AA7E5CA260B4C52744905877A30A95DD /* Products */, + 04FDA90EC92846BCA87341D9449034D2 /* Pods */, + 676B9CE5A6E7AA2967DC65B937B27934 /* Products */, F7ED90CD818DD0484BF7DB0E1E3B9AB2 /* Targets Support Files */, ); sourceTree = ""; }; - D1B9DC187765592AAEEACCE698694E27 /* Security */ = { + E1B49F06C5C5A5E10EAF35AB341C6019 /* Bugly */ = { isa = PBXGroup; children = ( - 85AD1C60C75A73E360E4320DD271A77D /* AFSecurityPolicy.h */, - 52AA08F30FFF4D9FF32F48E3AC195A6A /* AFSecurityPolicy.m */, + 7D43D2B896FD998668FBE9B4659BE7DB /* Frameworks */, + 7CE997EABABE05F8CF43316DF86ACB40 /* Support Files */, ); - name = Security; + name = Bugly; + path = Bugly; sourceTree = ""; }; - D4CA9D10912142FCCA40F947B4FC5D1C /* SDWebImage */ = { + F34EFC488C0CABAC0784F901B41CEBF5 /* Support Files */ = { isa = PBXGroup; children = ( - 2FC4867627CDCD8FC332BB686C62FDE4 /* Core */, - 72EAC702A61A19B6EC92D70B6CA9D4E8 /* Support Files */, - ); - name = SDWebImage; - path = SDWebImage; - sourceTree = ""; - }; - DCE595EEF85D396533FF4892F3008A92 /* Pods */ = { - isa = PBXGroup; - children = ( - 72657A79EE3B081E5F0D7C1166237E68 /* AFNetworking */, - 502B3DC21E7D9121A0C4B98D3286C994 /* Bugly */, - 18AF1EE6F6DA0C51E0452AA62EF8B8ED /* Masonry */, - 1F956714C6A7CF7B7999AEB4E29D418F /* MJExtension */, - 3128165374A2707E315E77D530A52B15 /* MJRefresh */, - D4CA9D10912142FCCA40F947B4FC5D1C /* SDWebImage */, - ); - name = Pods; - sourceTree = ""; - }; - E09502DD4B1D7ABBB4407C6ED07C0666 /* Support Files */ = { - isa = PBXGroup; - children = ( - 4CD2E3B8C4EBAB8CE1F46D4D7B1B5CAA /* Bugly.debug.xcconfig */, - 6134DA50CBB0F618C7502B9B4E23963F /* Bugly.release.xcconfig */, + 131CFAAD6F5934ECDF337EF98A4C2530 /* Masonry.modulemap */, + 7B3441C26C7AC549C4262F6A34D5D0C0 /* Masonry-dummy.m */, + A0C35DEC88CFC7AF6FCB2CE7920B0160 /* Masonry-Info.plist */, + 491BA663479FAFE4EBCADBC2B81F42CD /* Masonry-prefix.pch */, + A1675DE403D3695A8253D64170EAD85A /* Masonry-umbrella.h */, + 27BBD1EF2FA93D420264224AAFDB346F /* Masonry.debug.xcconfig */, + 5A001068B47EC5E23C991C85B5D1DC80 /* Masonry.release.xcconfig */, ); name = "Support Files"; - path = "../Target Support Files/Bugly"; + path = "../Target Support Files/Masonry"; + sourceTree = ""; + }; + F7B60E2E8D053FDD31C77970AD13583B /* Resources */ = { + isa = PBXGroup; + children = ( + 28044484DF43321746ED7EE2E8CE92EC /* PrivacyInfo.xcprivacy */, + ); + name = Resources; sourceTree = ""; }; F7ED90CD818DD0484BF7DB0E1E3B9AB2 /* Targets Support Files */ = { @@ -1597,6 +2064,93 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 354A86DA8AD84D87EB55F767D75E1EED /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + FC59A881F35E517FA69EB6E0D66612CB /* Pods-keyBoard-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3D4C17449A573C7CF2AE5D5EDDB5335C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 821FF6B43F7ADAB6B60459D2966B33CB /* CALayer+Lookin.h in Headers */, + C9E8C9372C2DA29D302B058BE3AE9877 /* CALayer+LookinServer.h in Headers */, + 56F1B543BC54204336CB5E50B60F719F /* Color+Lookin.h in Headers */, + 93E8C78EAE0B7613201813966B8E04E2 /* Image+Lookin.h in Headers */, + BBF5FDA7D647517E2F904FE8E5596D96 /* LKS_AttrGroupsMaker.h in Headers */, + 9F89DCAA4092F3897E43E89842069A26 /* LKS_AttrModificationPatchHandler.h in Headers */, + CE86196C00DC1D658B6CB7D47A0233AA /* LKS_ConnectionManager.h in Headers */, + 5735091665AC18FAD028EB68786A85AE /* LKS_CustomAttrGroupsMaker.h in Headers */, + B2B5444DFE63D2835A7561C1D64C9344 /* LKS_CustomAttrModificationHandler.h in Headers */, + C4CC01ED368863C6E3220988FBC6CEFB /* LKS_CustomAttrSetterManager.h in Headers */, + A8AD2AE9695630E93DE504211EBAFBF1 /* LKS_CustomDisplayItemsMaker.h in Headers */, + 2A24F241D7D74FF6DEA953F9DD49391C /* LKS_EventHandlerMaker.h in Headers */, + 5D0DEC179A7B4143769C663082E2662A /* LKS_ExportManager.h in Headers */, + 9FB234EB4D8B5BCC699DB491E204594F /* LKS_GestureTargetActionsSearcher.h in Headers */, + C6FEC1088121FEA7DDC3384B7ECF3B44 /* LKS_Helper.h in Headers */, + 89B88FAD396608AAA9F935E471BB3CB9 /* LKS_HierarchyDetailsHandler.h in Headers */, + 7E4F0978B25350B2B28678A0BE7B3785 /* LKS_HierarchyDisplayItemsMaker.h in Headers */, + 4E964FFE29CFF8613C0029C913F39A05 /* LKS_InbuiltAttrModificationHandler.h in Headers */, + 32FF240AE9443A1D2CFE27F50B55F591 /* LKS_MultiplatformAdapter.h in Headers */, + AF185CDCA462AD6450543676951C82F9 /* LKS_ObjectRegistry.h in Headers */, + 2E86A7C77E43AEA4697979F1F848E68D /* LKS_RequestHandler.h in Headers */, + 1EC3AEA15AE416A53357261B37C622BD /* LKS_TraceManager.h in Headers */, + B2BC43DEC8DE2B9234693FE3782AB76C /* LKSConfigManager.h in Headers */, + CA56274BE7CBB3E759E0364785DF9799 /* Lookin_PTChannel.h in Headers */, + F62B0711DA506CCB3DF79F65134566C7 /* Lookin_PTPrivate.h in Headers */, + C9B63C6ED2ED691EA83D3EE65939444B /* Lookin_PTProtocol.h in Headers */, + 53C1722650FCAB2637867D0DC31FC3CB /* Lookin_PTUSBHub.h in Headers */, + 1C5CCB87E5B9C500F07A8244D7906295 /* LookinAppInfo.h in Headers */, + 1EDF5F5B68D4A76CE59D5B6CC7B6C469 /* LookinAttribute.h in Headers */, + 7E8A564A958AF81E5F63F34B8E550E58 /* LookinAttributeModification.h in Headers */, + 1B52E938D7999FC0CDA2AA22674948EB /* LookinAttributesGroup.h in Headers */, + 40AD5D0AB3ABF7F3A5A4A98BC5B84419 /* LookinAttributesSection.h in Headers */, + 9DFFD4780CA32B8E53D9F4FBC8B3F5AC /* LookinAttrIdentifiers.h in Headers */, + 0845A6CB7AE77A99CC475BD14101FE87 /* LookinAttrType.h in Headers */, + 9EBA682DA814406E9E5EF300587AF341 /* LookinAutoLayoutConstraint.h in Headers */, + 4A15ABB502D625EBE3E63100664AB822 /* LookinCodingValueType.h in Headers */, + 61EAFBCDC83B2C603918B3C9D9A73A18 /* LookinConnectionAttachment.h in Headers */, + 261C31F4038EC00D5961218C97905E21 /* LookinConnectionResponseAttachment.h in Headers */, + BFAC671767912906E90060B0F4BED5FB /* LookinCustomAttrModification.h in Headers */, + 6EFC0630CB2761A2B1FC47176CCD62D1 /* LookinCustomDisplayItemInfo.h in Headers */, + 27212D06F5EDE3BB10264D93075B2275 /* LookinDashboardBlueprint.h in Headers */, + E0B48B9D5D45AF3500FC718459D66E6C /* LookinDefines.h in Headers */, + C1D9802BE2A6410FFDFB1650FB9BA317 /* LookinDisplayItem.h in Headers */, + 1FD36A180D43C773D95D8E5BF719494C /* LookinDisplayItemDetail.h in Headers */, + 0B449236AF25C6C11B0DE3D6D0E4A19B /* LookinEventHandler.h in Headers */, + 150116E888969E8304BA3E2BB6529461 /* LookinHierarchyFile.h in Headers */, + 1CA85ECC202E5CF62530BAD7C0DCDAF2 /* LookinHierarchyInfo.h in Headers */, + 021ACCD4343D154E4782A5ECE222A8DF /* LookinIvarTrace.h in Headers */, + C992A335399F942237E754EE65C40CA5 /* LookinObject.h in Headers */, + EB646114ABEA7A4D6C2A724404778670 /* LookinServer.h in Headers */, + DD7F63D4E4640C7386877BB787740272 /* LookinServer-umbrella.h in Headers */, + A324722BA42F21E98F158EA6C133D715 /* LookinServerDefines.h in Headers */, + 67FCC0F9B42B1C20A66E99A3D56BED18 /* LookinStaticAsyncUpdateTask.h in Headers */, + 1D18A1A5D485D57192B021A8765C0AF5 /* LookinTuple.h in Headers */, + 332F2099D726E75CEFAF1F734104A066 /* LookinWeakContainer.h in Headers */, + 35D42759A562C482EA5DF574F75CF3B8 /* NSArray+Lookin.h in Headers */, + 4DA2C6099343CD55160ECB3EBDDFE1DF /* NSObject+Lookin.h in Headers */, + A93BA1C5A4FFEF3ACF371690485A2703 /* NSObject+LookinServer.h in Headers */, + 3B1C72DC480AB19BD55B6275750D62FE /* NSSet+Lookin.h in Headers */, + BBA61EF31BFDFA6FCA34DC4EBE6E1D9A /* NSString+Lookin.h in Headers */, + 117F4B6F653A8DA2637C5C93B4993884 /* Peertalk.h in Headers */, + 4EC8DBADA7BB954276351A639EB4398D /* UIBlurEffect+LookinServer.h in Headers */, + C2033A68F13923BF9B3EE19F39FC1411 /* UIColor+LookinServer.h in Headers */, + E82964ED7092CDCDAD08BC596A57B43A /* UIImage+LookinServer.h in Headers */, + D559CC4D0695CEE05F3B4C1C06475044 /* UIImageView+LookinServer.h in Headers */, + A6728DA26A7C457B78A7A3CCFA9D9A10 /* UILabel+LookinServer.h in Headers */, + A1ACD509069144C27542774A41FE0243 /* UITableView+LookinServer.h in Headers */, + 683D708C157C95ADB467BDD2230BD4E3 /* UITextField+LookinServer.h in Headers */, + 231A40F14D020AE2F61AA5C3289E6CF9 /* UITextView+LookinServer.h in Headers */, + F6A0D6EA1B5DC3FE04DC4A1B0A914121 /* UIView+LookinServer.h in Headers */, + 3800EA1B83FDE869FB2E4B049F519962 /* UIViewController+LookinServer.h in Headers */, + 6525ECE1CAFC1259F9E6E5FDDE6CF218 /* UIVisualEffectView+LookinServer.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 66226021984AAF2F39AE410BEA754D6C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1605,14 +2159,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 6EFC0393FC31641E19E2060FE077490A /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - BCFA1CA56CA625A754714006E0032750 /* Pods-keyBoard-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; C6390AB04A018D57637AAB0718C31A83 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1662,22 +2208,23 @@ }; 18BD026D2210082A239FC15D072FD5BF /* Pods-keyBoard */ = { isa = PBXNativeTarget; - buildConfigurationList = FCE3E8712CE5CB67BC702E493D7E2243 /* Build configuration list for PBXNativeTarget "Pods-keyBoard" */; + buildConfigurationList = 0D33D5527989B3BDB78BE0C5C7A44AE6 /* Build configuration list for PBXNativeTarget "Pods-keyBoard" */; buildPhases = ( - 6EFC0393FC31641E19E2060FE077490A /* Headers */, - AFB5D9B93B578996ABD51507560BD64E /* Sources */, - 83DE9F788F7FEF1F8FBE5407651F444D /* Frameworks */, - 9CB9573035BE4B2A4B846ACC7B123B63 /* Resources */, + 354A86DA8AD84D87EB55F767D75E1EED /* Headers */, + C47F0627C570239B8BA00073454B0DA9 /* Sources */, + EC887E260D0219D14A6F8D043A399103 /* Frameworks */, + 9F6F8BC8AE40CD57D35EC112DE759AE9 /* Resources */, ); buildRules = ( ); dependencies = ( - 0721A67E09079773C9FD71FC8AD5FC9D /* PBXTargetDependency */, - 42FDF14E242A83A309A5E0E9AD872BFB /* PBXTargetDependency */, - 3A51A97E9A7AF97FA982A4106AD313E7 /* PBXTargetDependency */, - 3B75BE7D78DA9D8EB2007A2C8507D93E /* PBXTargetDependency */, - A0F34F7F072B46F24802F53958145C52 /* PBXTargetDependency */, - 10BF5B7304DB404D9CB72D3A79065773 /* PBXTargetDependency */, + 0E4625FEB558303C0407444D58E8EF5D /* PBXTargetDependency */, + 043F16AB106599B74C1DF30D7B056C40 /* PBXTargetDependency */, + B241D32172A8D765D139FCBCF08502EE /* PBXTargetDependency */, + D94642FA736D187E292C22A5C8E6A607 /* PBXTargetDependency */, + 6B68DB16502085DEDBFE0C04D68FBAC4 /* PBXTargetDependency */, + 03479B28121DF7E3B83A82C316F54F47 /* PBXTargetDependency */, + FE395F2982F15E952B8148299F920DB5 /* PBXTargetDependency */, ); name = "Pods-keyBoard"; productName = Pods_keyBoard; @@ -1696,7 +2243,7 @@ buildRules = ( ); dependencies = ( - 88E2D8F9CA39C89731F3AE8B00D15E67 /* PBXTargetDependency */, + 92324FC45BC3593C88139698B6C24305 /* PBXTargetDependency */, ); name = SDWebImage; productName = SDWebImage; @@ -1715,7 +2262,7 @@ buildRules = ( ); dependencies = ( - 394032A92C21422B814C089279FA7D6F /* PBXTargetDependency */, + D8B03ACFA370E2781FB5A62969E7E3E4 /* PBXTargetDependency */, ); name = MJExtension; productName = MJExtension; @@ -1740,6 +2287,24 @@ productReference = 1FFED36A657123030ABB700256D73F15 /* Masonry */; productType = "com.apple.product-type.framework"; }; + 638FEAAFC575BB76BC6AC055CDDA3506 /* LookinServer */ = { + isa = PBXNativeTarget; + buildConfigurationList = E7624967EDC883D80ED3DA81C495736B /* Build configuration list for PBXNativeTarget "LookinServer" */; + buildPhases = ( + 3D4C17449A573C7CF2AE5D5EDDB5335C /* Headers */, + 8AF957863B2E92075C7B36542829939B /* Sources */, + 7CFE8F67F3A1361064414896BC73914A /* Frameworks */, + D518E37278D48F046F4C76EA0E72D5AC /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LookinServer; + productName = LookinServer; + productReference = 25664483ABF4DC8EC03E7472AA04333B /* LookinServer */; + productType = "com.apple.product-type.framework"; + }; 6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */ = { isa = PBXNativeTarget; buildConfigurationList = 29BB59B7B51BC6194771995E3356CF70 /* Build configuration list for PBXNativeTarget "MJRefresh" */; @@ -1752,7 +2317,7 @@ buildRules = ( ); dependencies = ( - F4DB95A938613EB239394D9BC7D85E47 /* PBXTargetDependency */, + 9F16942F49507F0B6B86B7911F66F171 /* PBXTargetDependency */, ); name = MJRefresh; productName = MJRefresh; @@ -1761,11 +2326,11 @@ }; 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */ = { isa = PBXNativeTarget; - buildConfigurationList = 3A3BFFB46D4AE092AC96BD3D9D624546 /* Build configuration list for PBXNativeTarget "SDWebImage-SDWebImage" */; + buildConfigurationList = 9283E8BFF499091AF669213C19E23AF9 /* Build configuration list for PBXNativeTarget "SDWebImage-SDWebImage" */; buildPhases = ( - 14B98376E3B2827487D1B5BA7E349E67 /* Sources */, - 5F8D0AA57E07244D2E43526654F67443 /* Frameworks */, - F94894A2558471C720587EA6709F2019 /* Resources */, + 572240FC0709947C504C2BFC0B3F6CDF /* Sources */, + F6011854FAC4D9F4B6C8C3CC24306AF2 /* Frameworks */, + 9D591632D11C40B24A25839FB6F3AD19 /* Resources */, ); buildRules = ( ); @@ -1778,11 +2343,11 @@ }; B26054DF1DEA11585A231AF6D1D80D5E /* MJRefresh-MJRefresh.Privacy */ = { isa = PBXNativeTarget; - buildConfigurationList = 68B32BA86F0CEE6E06F49B0F2C62CD73 /* Build configuration list for PBXNativeTarget "MJRefresh-MJRefresh.Privacy" */; + buildConfigurationList = D8D75C9DB6E360B17AA2D4C821931D99 /* Build configuration list for PBXNativeTarget "MJRefresh-MJRefresh.Privacy" */; buildPhases = ( - A1FDE66B11377A083FC25DE4671B3305 /* Sources */, - 2195E2C2C2334091D023B7EB98B24603 /* Frameworks */, - FF140DFA44CFFB4A12C0595EC42174A6 /* Resources */, + 2B4375041138FDC870EBC2F1DE32D276 /* Sources */, + BA907BE43BC75B5E5F4FF58D55F0352F /* Frameworks */, + 11D398AB6EFCD0EB98126DB92D54F638 /* Resources */, ); buildRules = ( ); @@ -1795,11 +2360,11 @@ }; B32AF3F43989CBA171BB1FB3957A4509 /* MJExtension-MJExtension */ = { isa = PBXNativeTarget; - buildConfigurationList = 4650649B39AEE2A0C6FEE8FF9B18E065 /* Build configuration list for PBXNativeTarget "MJExtension-MJExtension" */; + buildConfigurationList = 6BB2C7E338CD9DF6BB8CDBFFF3DB23F2 /* Build configuration list for PBXNativeTarget "MJExtension-MJExtension" */; buildPhases = ( - 83E45E911DCE522BC4265AAB5CBA73D3 /* Sources */, - E62253CBB3499DA4547AF2A780EC3E2F /* Frameworks */, - AA2ABB6111F2F1BE117241EC515B268B /* Resources */, + E99A13C4E1567980F91AA0A7B98BC612 /* Sources */, + 485AC1F46BE9B5F952A556517C27F798 /* Frameworks */, + 80C3D82C2D57964F07086A7697C1FA45 /* Resources */, ); buildRules = ( ); @@ -1848,12 +2413,13 @@ mainGroup = CF1408CF629C7361332E53B88F7BD30C; minimizedProjectReferenceProxies = 0; preferredProjectObjectVersion = 77; - productRefGroup = AA7E5CA260B4C52744905877A30A95DD /* Products */; + productRefGroup = 676B9CE5A6E7AA2967DC65B937B27934 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */, 4A68CFD979D413A619DF631BB121D98F /* Bugly */, + 638FEAAFC575BB76BC6AC055CDDA3506 /* LookinServer */, 55AF53E6C77A10ED4985E04D74A8878E /* Masonry */, 4D3BA58D0583DF37575CACAB3DDADC85 /* MJExtension */, B32AF3F43989CBA171BB1FB3957A4509 /* MJExtension-MJExtension */, @@ -1868,6 +2434,14 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 11D398AB6EFCD0EB98126DB92D54F638 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 66B3C7D4B7582B30E58C5BC74A711BB8 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1B0BF833FF02F4B145B7A6461734A0F1 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1893,6 +2467,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 80C3D82C2D57964F07086A7697C1FA45 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E753BC1F919608729F3E4963D61D4F78 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9BB224D4E89ABC2539ABBEBDC9696C8F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1900,18 +2482,25 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9CB9573035BE4B2A4B846ACC7B123B63 /* Resources */ = { + 9D591632D11C40B24A25839FB6F3AD19 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A2E11C19FD9FEDCF6384715C1F12D4C0 /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9F6F8BC8AE40CD57D35EC112DE759AE9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - AA2ABB6111F2F1BE117241EC515B268B /* Resources */ = { + D518E37278D48F046F4C76EA0E72D5AC /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1C73BC7EEF39CC3D3A21EACAD858413D /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1929,22 +2518,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F94894A2558471C720587EA6709F2019 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0BADC710EA22BBCD76E59748C2A56ECF /* PrivacyInfo.xcprivacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FF140DFA44CFFB4A12C0595EC42174A6 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AF1A6353DEDBE196A10C8897F94DDA8E /* PrivacyInfo.xcprivacy in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -2046,13 +2619,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 14B98376E3B2827487D1B5BA7E349E67 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 253ADC0B42FA607A67D61C10A572535E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2061,25 +2627,97 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 83E45E911DCE522BC4265AAB5CBA73D3 /* Sources */ = { + 2B4375041138FDC870EBC2F1DE32D276 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - A1FDE66B11377A083FC25DE4671B3305 /* Sources */ = { + 572240FC0709947C504C2BFC0B3F6CDF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - AFB5D9B93B578996ABD51507560BD64E /* Sources */ = { + 8AF957863B2E92075C7B36542829939B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3CE201A6CFF26BD49792F9A8E4C822A5 /* Pods-keyBoard-dummy.m in Sources */, + 0BE3B8DB6034364E7CF3AE9D01C7C0B4 /* CALayer+Lookin.m in Sources */, + 7D736CE5AD0A987D2A7D2FD72E31BF41 /* CALayer+LookinServer.m in Sources */, + 6002CB94684D7C786700D2A294146AEC /* Color+Lookin.m in Sources */, + 50096BAC0F3270FB111E76D32714E579 /* Image+Lookin.m in Sources */, + AFDC0B8255B2F3CED8E609F8A3BD1CDB /* LKS_AttrGroupsMaker.m in Sources */, + 6BC2A615678C8BAE9F34ABA68BFDEF78 /* LKS_AttrModificationPatchHandler.m in Sources */, + 6C57809DCEA4B6C0CA79918A69FD75DE /* LKS_ConnectionManager.m in Sources */, + FFC6D50089FA32FD7AAF25747E56EA60 /* LKS_CustomAttrGroupsMaker.m in Sources */, + 928A1ED0692DF0229F66A87135F93F2A /* LKS_CustomAttrModificationHandler.m in Sources */, + B565C08CE947CF591B1D3582272D5E1D /* LKS_CustomAttrSetterManager.m in Sources */, + 3E3D09700A62280A9EB8D65B97335ED8 /* LKS_CustomDisplayItemsMaker.m in Sources */, + 27CC45A4ABE5B40723D35310D05CD146 /* LKS_EventHandlerMaker.m in Sources */, + C8771885BEA9EA0BD2E2C474587325E2 /* LKS_ExportManager.m in Sources */, + B79864F972C51037B350802D8CD48024 /* LKS_GestureTargetActionsSearcher.m in Sources */, + 69F6E66A089C40FB1063DE15499BCFDE /* LKS_Helper.m in Sources */, + 78A3C3994AFFC6A2D4970AEB6D797CE5 /* LKS_HierarchyDetailsHandler.m in Sources */, + 89EAB8D0452D0E2114ED971B10D98CC3 /* LKS_HierarchyDisplayItemsMaker.m in Sources */, + 7C8782A3078662BC2EF639A9608A2C82 /* LKS_InbuiltAttrModificationHandler.m in Sources */, + 2759D8D4FCE58812ADECB348E369C6F0 /* LKS_MultiplatformAdapter.m in Sources */, + 6960FF2C4D61A09722930B33B1C7135D /* LKS_ObjectRegistry.m in Sources */, + AE69A3B75BEEB9E2C54168BF0C502BC6 /* LKS_RequestHandler.m in Sources */, + 810C8D7902163BBA0185A4A112B2DFD6 /* LKS_TraceManager.m in Sources */, + A9BEDE2ADF9D1E0D0D1A241806A1A486 /* LKSConfigManager.m in Sources */, + D091F05269EE0566B665B00C7D912F8E /* Lookin_PTChannel.m in Sources */, + 0C79142D1349DD9A969F47A0A8AAA0CB /* Lookin_PTProtocol.m in Sources */, + 20E738E52B4712385489A62374C74C7F /* Lookin_PTUSBHub.m in Sources */, + 464A0100327C8531D86BDC31737CCF75 /* LookinAppInfo.m in Sources */, + 8A256CA266FB314BBD4DB2287DAEF247 /* LookinAttribute.m in Sources */, + 2DDA5F044BC698BC5D48A7CFDDBF71E3 /* LookinAttributeModification.m in Sources */, + 74ABF19BACB99F862DB62AA14508AFA0 /* LookinAttributesGroup.m in Sources */, + 7C53FB6BBB0CBAA879F1603B0FEDB80B /* LookinAttributesSection.m in Sources */, + F8616FAFEE1124368CB96473CE20CDB4 /* LookinAttrIdentifiers.m in Sources */, + 1FDEA3FFA45F29C1331723E9579D66A5 /* LookinAutoLayoutConstraint.m in Sources */, + A6B2B022993BBC55550CFBB0A0C78209 /* LookinConnectionAttachment.m in Sources */, + 9887678D7D6BC165694560D92AF2C31A /* LookinConnectionResponseAttachment.m in Sources */, + 85BB8B4B5C29C5EEC52282F33A4CAF23 /* LookinCustomAttrModification.m in Sources */, + E7FEAB9F421F7EBAF021F792D8E9C4D6 /* LookinCustomDisplayItemInfo.m in Sources */, + 447BBB1BCA8E0F2D23634888BED6DA81 /* LookinDashboardBlueprint.m in Sources */, + B81566F19789EBD9BE2714E2A6059D36 /* LookinDisplayItem.m in Sources */, + BC7A1933CCF40C3C5E2E4A70AD2D0657 /* LookinDisplayItemDetail.m in Sources */, + 9E6B00AF2ECE462D4D3C42AFC02F2AD7 /* LookinEventHandler.m in Sources */, + 6CE8701D161A4BC0860FAF3951762A34 /* LookinHierarchyFile.m in Sources */, + 9DDDCFC08B54A61C519DA78F94464E6B /* LookinHierarchyInfo.m in Sources */, + D89C7D5455E3E8E2D7EC6B880253BD9B /* LookinIvarTrace.m in Sources */, + 5A8BC91257FF6B36237BF09A7A6EADF6 /* LookinObject.m in Sources */, + A9609EEBDD5FD40292925E80ED84D5DF /* LookinServer-dummy.m in Sources */, + 9A89C16038149623A1DF06D47E7F953A /* LookinStaticAsyncUpdateTask.m in Sources */, + 9E3C5CB1C97B2ED16218956999BFF7AC /* LookinTuple.m in Sources */, + 2CDC7B9EAD356E35FEAF526EEA6A8E91 /* LookinWeakContainer.m in Sources */, + D1230E19DD1507E6370B80DF6653AC2A /* NSArray+Lookin.m in Sources */, + F6A2DEEA8E8B92D365AFDDBD5E8C1218 /* NSObject+Lookin.m in Sources */, + FA6DA93357E2E9E9AADDFB3E39DEB6C2 /* NSObject+LookinServer.m in Sources */, + 5490C03887ACF6C4EAC25ADFBB509CE5 /* NSSet+Lookin.m in Sources */, + 2460C08042AF8B7D0492A062F755986E /* NSString+Lookin.m in Sources */, + F8F1B1196CAA5114BA9A95AA7E6D6AEB /* UIBlurEffect+LookinServer.m in Sources */, + 41A4AAE7E6024E7AAB83DD22FB42D34D /* UIColor+LookinServer.m in Sources */, + 68C3E98F8B9D6035962F29AE025DA891 /* UIImage+LookinServer.m in Sources */, + 392F62298E0D8C669229E132D791BBF5 /* UIImageView+LookinServer.m in Sources */, + B5C521FFB8E09DFE348238E21556842F /* UILabel+LookinServer.m in Sources */, + F3F4A6309BD95DFAA4DCC60A4E07C515 /* UITableView+LookinServer.m in Sources */, + 3BB69CB142D744367868F834912993CB /* UITextField+LookinServer.m in Sources */, + 9B06400877E40C173F5A1C9761F288CB /* UITextView+LookinServer.m in Sources */, + 9B1EF09A8A473D92C1258B00791BF5F0 /* UIView+LookinServer.m in Sources */, + DF525E5405FAD3B98B0C2D966EB2DD95 /* UIViewController+LookinServer.m in Sources */, + 1EDC6F899051F0E858270F7556AF2F12 /* UIVisualEffectView+LookinServer.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C47F0627C570239B8BA00073454B0DA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 244B4AFFAB4156D2844528160ABFC3C8 /* Pods-keyBoard-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2156,103 +2794,82 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E99A13C4E1567980F91AA0A7B98BC612 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 0721A67E09079773C9FD71FC8AD5FC9D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = AFNetworking; - target = 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */; - targetProxy = F4298358FEAF506C773B2D34F3DF6B12 /* PBXContainerItemProxy */; - }; - 10BF5B7304DB404D9CB72D3A79065773 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SDWebImage; - target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; - targetProxy = F236FEF1E37470AFA015925961D566A3 /* PBXContainerItemProxy */; - }; - 394032A92C21422B814C089279FA7D6F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "MJExtension-MJExtension"; - target = B32AF3F43989CBA171BB1FB3957A4509 /* MJExtension-MJExtension */; - targetProxy = 23C4ACB33CF11EF7F294BFEFDFEE525F /* PBXContainerItemProxy */; - }; - 3A51A97E9A7AF97FA982A4106AD313E7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = MJExtension; - target = 4D3BA58D0583DF37575CACAB3DDADC85 /* MJExtension */; - targetProxy = D31947E4B8C395A2964CC7C4CA10B4B3 /* PBXContainerItemProxy */; - }; - 3B75BE7D78DA9D8EB2007A2C8507D93E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = MJRefresh; - target = 6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */; - targetProxy = D00922B5D33413CCF1E3D4753D9B5522 /* PBXContainerItemProxy */; - }; - 42FDF14E242A83A309A5E0E9AD872BFB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Bugly; - target = 4A68CFD979D413A619DF631BB121D98F /* Bugly */; - targetProxy = ED8283C03EBD084126ED5759CD5B7EF5 /* PBXContainerItemProxy */; - }; - 88E2D8F9CA39C89731F3AE8B00D15E67 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "SDWebImage-SDWebImage"; - target = 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */; - targetProxy = 8C46BC742135C578AA462516574ECF6A /* PBXContainerItemProxy */; - }; - A0F34F7F072B46F24802F53958145C52 /* PBXTargetDependency */ = { + 03479B28121DF7E3B83A82C316F54F47 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Masonry; target = 55AF53E6C77A10ED4985E04D74A8878E /* Masonry */; - targetProxy = 7F4A11CEA9C42F01CCC8FD8CF31E0D31 /* PBXContainerItemProxy */; + targetProxy = 3F8A35535F395BE84B4A539F6E9DBF34 /* PBXContainerItemProxy */; }; - F4DB95A938613EB239394D9BC7D85E47 /* PBXTargetDependency */ = { + 043F16AB106599B74C1DF30D7B056C40 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Bugly; + target = 4A68CFD979D413A619DF631BB121D98F /* Bugly */; + targetProxy = 21E2F063DEDE55524CCC96983E4DCA4C /* PBXContainerItemProxy */; + }; + 0E4625FEB558303C0407444D58E8EF5D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AFNetworking; + target = 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */; + targetProxy = F1AA0CF10713431E8883F507BBC693FA /* PBXContainerItemProxy */; + }; + 6B68DB16502085DEDBFE0C04D68FBAC4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MJRefresh; + target = 6868056D761E163D10FDAF8CF1C4D9B8 /* MJRefresh */; + targetProxy = 170C9F8A38F4CF079D27AF1BCAF893F2 /* PBXContainerItemProxy */; + }; + 92324FC45BC3593C88139698B6C24305 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SDWebImage-SDWebImage"; + target = 94CFBA7D633ECA58DF85C327B035E6A3 /* SDWebImage-SDWebImage */; + targetProxy = 9E527C7BC36E9521D6CCC7505783F2CB /* PBXContainerItemProxy */; + }; + 9F16942F49507F0B6B86B7911F66F171 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "MJRefresh-MJRefresh.Privacy"; target = B26054DF1DEA11585A231AF6D1D80D5E /* MJRefresh-MJRefresh.Privacy */; - targetProxy = 74C35E0C9F3979D774EBA89927D5F9BE /* PBXContainerItemProxy */; + targetProxy = 12BD60C24C01B20FDE8828B052220831 /* PBXContainerItemProxy */; + }; + B241D32172A8D765D139FCBCF08502EE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = LookinServer; + target = 638FEAAFC575BB76BC6AC055CDDA3506 /* LookinServer */; + targetProxy = A39AC9607F9509F9905E56AC9B6CC731 /* PBXContainerItemProxy */; + }; + D8B03ACFA370E2781FB5A62969E7E3E4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "MJExtension-MJExtension"; + target = B32AF3F43989CBA171BB1FB3957A4509 /* MJExtension-MJExtension */; + targetProxy = 22D1506217D99FEDABDB9AAFE5D2E547 /* PBXContainerItemProxy */; + }; + D94642FA736D187E292C22A5C8E6A607 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MJExtension; + target = 4D3BA58D0583DF37575CACAB3DDADC85 /* MJExtension */; + targetProxy = 21CBD700B5A79737B887480BE0697AF5 /* PBXContainerItemProxy */; + }; + FE395F2982F15E952B8148299F920DB5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDWebImage; + target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; + targetProxy = 38401E33DF4010EFB3C691A96858743F /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 03A5A25907B9F099CB1930F2C4AA0E3F /* Release */ = { + 059750D69FD3EE3E7C7DC7180DA1F23A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4B22EE0B7D2C1D1066750C4AB84FDA27 /* MJExtension.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJExtension"; - IBSC_MODULE = MJExtension; - INFOPLIST_FILE = "Target Support Files/MJExtension/ResourceBundle-MJExtension-MJExtension-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - PRODUCT_NAME = MJExtension; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 0A6B03880AA76C2476846FABA9DAB99A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 74CC813EBCFDBA413D1E8F2AE302E41A /* MJRefresh.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJRefresh"; - IBSC_MODULE = MJRefresh; - INFOPLIST_FILE = "Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - PRODUCT_NAME = MJRefresh.Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 16DD238F86190BFED9FB2F16A83B2A56 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 20B1DAD84F32D1AF296F0D63C5DEE9AB /* SDWebImage.debug.xcconfig */; + baseConfigurationReference = C86E87A0833EA6424FC42BF16EB9BA57 /* SDWebImage.debug.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage"; @@ -2267,44 +2884,7 @@ }; name = Debug; }; - 2D1085CA7BD144CABF012FC10C6C9120 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4EF47C40D45E06BA89946B4C9F04A546 /* Masonry.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/Masonry/Masonry-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/Masonry/Masonry.modulemap"; - PRODUCT_MODULE_NAME = Masonry; - PRODUCT_NAME = Masonry; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 4CF8CD0C5349DA6326EF3FCF43C53402 /* Debug */ = { + 15347A4CA32413545A6BCCB091929F60 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 35BFA337F4E1FDE67C773A82CCDFD6DA /* Pods-keyBoard.debug.xcconfig */; buildSettings = { @@ -2343,9 +2923,117 @@ }; name = Debug; }; + 1A69165A21A7A1CC42A38CF8ADE98215 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1EC7EF6A5825A2D3F22E4BC14CD91F18 /* LookinServer.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/LookinServer/LookinServer-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/LookinServer/LookinServer-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/LookinServer/LookinServer.modulemap"; + PRODUCT_MODULE_NAME = LookinServer; + PRODUCT_NAME = LookinServer; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_INSTALL_OBJC_HEADER = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 2D1085CA7BD144CABF012FC10C6C9120 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 27BBD1EF2FA93D420264224AAFDB346F /* Masonry.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/Masonry/Masonry-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/Masonry/Masonry.modulemap"; + PRODUCT_MODULE_NAME = Masonry; + PRODUCT_NAME = Masonry; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 32A78042A4E0FFFC2B2D86B34DA245F2 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 870308F72B6057F0D29396CFC0E51B4C /* MJRefresh.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJRefresh"; + IBSC_MODULE = MJRefresh; + INFOPLIST_FILE = "Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + PRODUCT_NAME = MJRefresh.Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 4A4E99B54D816B4760FDD5BF8FE310A1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 838300FCEA5961F23F53260B6EBAB80D /* SDWebImage.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage"; + IBSC_MODULE = SDWebImage; + INFOPLIST_FILE = "Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + PRODUCT_NAME = SDWebImage; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; 51753BD6FE635BB9421BCA4C05F63C6A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DF80C56AF1D41887B8622FAC95138810 /* MJRefresh.release.xcconfig */; + baseConfigurationReference = 870308F72B6057F0D29396CFC0E51B4C /* MJRefresh.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2382,66 +3070,9 @@ }; name = Release; }; - 5B8933506DB0D0650A36E47F8AB90C24 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3316E3BF456739AB7A0F0FD1920F5F6B /* MJExtension.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJExtension"; - IBSC_MODULE = MJExtension; - INFOPLIST_FILE = "Target Support Files/MJExtension/ResourceBundle-MJExtension-MJExtension-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - PRODUCT_NAME = MJExtension; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 5EB0D7D4CF48681DA30DD58C2E33B044 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A6E8FF241173D596A21D4D4B7D86A810 /* Pods-keyBoard.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - INFOPLIST_FILE = "Target Support Files/Pods-keyBoard/Pods-keyBoard-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-keyBoard/Pods-keyBoard.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 614F7847ADAD2F1EEC9E48FAEC955108 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 74CC813EBCFDBA413D1E8F2AE302E41A /* MJRefresh.debug.xcconfig */; + baseConfigurationReference = 335C85A867FBD4B2CEEC783F95659782 /* MJRefresh.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2477,6 +3108,42 @@ }; name = Debug; }; + 618AB008538F74AAF983C04297207BB6 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8796350D3C821036D89B007D8F07CAED /* LookinServer.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/LookinServer/LookinServer-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/LookinServer/LookinServer-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/LookinServer/LookinServer.modulemap"; + PRODUCT_MODULE_NAME = LookinServer; + PRODUCT_NAME = LookinServer; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_INSTALL_OBJC_HEADER = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 8DE5143C03248BB6CD542DE3963D6F3A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2583,20 +3250,43 @@ }; name = Release; }; - 91762687457A2879115FDE4E6963488E /* Release */ = { + 90ED13A0CF760E361F749E0AE1FEC6E2 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DF80C56AF1D41887B8622FAC95138810 /* MJRefresh.release.xcconfig */; + baseConfigurationReference = A6E8FF241173D596A21D4D4B7D86A810 /* Pods-keyBoard.release.xcconfig */; buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJRefresh"; - IBSC_MODULE = MJRefresh; - INFOPLIST_FILE = "Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - PRODUCT_NAME = MJRefresh.Privacy; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-keyBoard/Pods-keyBoard-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-keyBoard/Pods-keyBoard.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Release; }; @@ -2664,7 +3354,7 @@ }; 9E9FB1E032B56896F9380263D45A0F9A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4B22EE0B7D2C1D1066750C4AB84FDA27 /* MJExtension.release.xcconfig */; + baseConfigurationReference = DBDF1CDEB2C728898F1E8A8BD00C641C /* MJExtension.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2703,7 +3393,7 @@ }; 9F519E5162C0E51D10B7E999E2FD0125 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 25119C155F0BB240A5DDFB8155627C04 /* SDWebImage.release.xcconfig */; + baseConfigurationReference = 838300FCEA5961F23F53260B6EBAB80D /* SDWebImage.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2739,9 +3429,26 @@ }; name = Release; }; + A6B8C2C0F8348772EF9BDBA80D506CAE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 335C85A867FBD4B2CEEC783F95659782 /* MJRefresh.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJRefresh"; + IBSC_MODULE = MJRefresh; + INFOPLIST_FILE = "Target Support Files/MJRefresh/ResourceBundle-MJRefresh.Privacy-MJRefresh-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + PRODUCT_NAME = MJRefresh.Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; B04295D726C1883ADA40A304483D7E33 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 20B1DAD84F32D1AF296F0D63C5DEE9AB /* SDWebImage.debug.xcconfig */; + baseConfigurationReference = C86E87A0833EA6424FC42BF16EB9BA57 /* SDWebImage.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2778,7 +3485,7 @@ }; B26FBB655ABB114E4C0D589843814D6C /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6134DA50CBB0F618C7502B9B4E23963F /* Bugly.release.xcconfig */; + baseConfigurationReference = 0F824B39219E9142F3A7CD9862002C60 /* Bugly.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2835,7 +3542,7 @@ }; CBAFED52B4B51F600FAF2141BA449F2E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4CD2E3B8C4EBAB8CE1F46D4D7B1B5CAA /* Bugly.debug.xcconfig */; + baseConfigurationReference = DBB907FE8BA07A712691E20C170A72E0 /* Bugly.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -2852,7 +3559,7 @@ }; CEE7FEC0A1B23DE7053203A448EEB294 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 78744B8D1235EE30BFB429D8C13D63F4 /* AFNetworking.debug.xcconfig */; + baseConfigurationReference = 1940502A2847EE5C9620326DBE54B6DE /* AFNetworking.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2889,7 +3596,7 @@ }; D0AB0AEF4014B926FCD853D3AE0A370A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 396F4E7921EA26CDE8AAEADDD8CFBB49 /* Masonry.release.xcconfig */; + baseConfigurationReference = 5A001068B47EC5E23C991C85B5D1DC80 /* Masonry.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2927,7 +3634,7 @@ }; DA533AA9B577872DAFB44EF2CF26C49A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 23D6F4D8D5B6512D7A50FF1054426C09 /* AFNetworking.release.xcconfig */; + baseConfigurationReference = 0CC9C159DF574F5F481FDD547E219367 /* AFNetworking.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -2963,26 +3670,9 @@ }; name = Release; }; - E41C0991D6353467CA87E00582A5976C /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 25119C155F0BB240A5DDFB8155627C04 /* SDWebImage.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SDWebImage"; - IBSC_MODULE = SDWebImage; - INFOPLIST_FILE = "Target Support Files/SDWebImage/ResourceBundle-SDWebImage-SDWebImage-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - PRODUCT_NAME = SDWebImage; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; EC66105EE15F9DC9B6F20F58FB67957D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3316E3BF456739AB7A0F0FD1920F5F6B /* MJExtension.debug.xcconfig */; + baseConfigurationReference = 6462CD790803203FFC45008B85E0C555 /* MJExtension.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3018,9 +3708,52 @@ }; name = Debug; }; + ED0577B04A2098B020C8D37DD284AB22 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DBDF1CDEB2C728898F1E8A8BD00C641C /* MJExtension.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJExtension"; + IBSC_MODULE = MJExtension; + INFOPLIST_FILE = "Target Support Files/MJExtension/ResourceBundle-MJExtension-MJExtension-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + PRODUCT_NAME = MJExtension; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + FD76268B44628EF9361646B2E870F63C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6462CD790803203FFC45008B85E0C555 /* MJExtension.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/MJExtension"; + IBSC_MODULE = MJExtension; + INFOPLIST_FILE = "Target Support Files/MJExtension/ResourceBundle-MJExtension-MJExtension-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + PRODUCT_NAME = MJExtension; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 0D33D5527989B3BDB78BE0C5C7A44AE6 /* Build configuration list for PBXNativeTarget "Pods-keyBoard" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 15347A4CA32413545A6BCCB091929F60 /* Debug */, + 90ED13A0CF760E361F749E0AE1FEC6E2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 29BB59B7B51BC6194771995E3356CF70 /* Build configuration list for PBXNativeTarget "MJRefresh" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3039,24 +3772,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 3A3BFFB46D4AE092AC96BD3D9D624546 /* Build configuration list for PBXNativeTarget "SDWebImage-SDWebImage" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 16DD238F86190BFED9FB2F16A83B2A56 /* Debug */, - E41C0991D6353467CA87E00582A5976C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4650649B39AEE2A0C6FEE8FF9B18E065 /* Build configuration list for PBXNativeTarget "MJExtension-MJExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5B8933506DB0D0650A36E47F8AB90C24 /* Debug */, - 03A5A25907B9F099CB1930F2C4AA0E3F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3075,11 +3790,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 68B32BA86F0CEE6E06F49B0F2C62CD73 /* Build configuration list for PBXNativeTarget "MJRefresh-MJRefresh.Privacy" */ = { + 6BB2C7E338CD9DF6BB8CDBFFF3DB23F2 /* Build configuration list for PBXNativeTarget "MJExtension-MJExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0A6B03880AA76C2476846FABA9DAB99A /* Debug */, - 91762687457A2879115FDE4E6963488E /* Release */, + FD76268B44628EF9361646B2E870F63C /* Debug */, + ED0577B04A2098B020C8D37DD284AB22 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -3093,6 +3808,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 9283E8BFF499091AF669213C19E23AF9 /* Build configuration list for PBXNativeTarget "SDWebImage-SDWebImage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 059750D69FD3EE3E7C7DC7180DA1F23A /* Debug */, + 4A4E99B54D816B4760FDD5BF8FE310A1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 9CC7AA793D9397C15E010F8242EE1046 /* Build configuration list for PBXAggregateTarget "Bugly" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3111,6 +3835,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + D8D75C9DB6E360B17AA2D4C821931D99 /* Build configuration list for PBXNativeTarget "MJRefresh-MJRefresh.Privacy" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A6B8C2C0F8348772EF9BDBA80D506CAE /* Debug */, + 32A78042A4E0FFFC2B2D86B34DA245F2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; DA39DBDB0F7D05D976CC7C6A67459F5F /* Build configuration list for PBXNativeTarget "Pods-CustomKeyboard" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3120,11 +3853,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - FCE3E8712CE5CB67BC702E493D7E2243 /* Build configuration list for PBXNativeTarget "Pods-keyBoard" */ = { + E7624967EDC883D80ED3DA81C495736B /* Build configuration list for PBXNativeTarget "LookinServer" */ = { isa = XCConfigurationList; buildConfigurations = ( - 4CF8CD0C5349DA6326EF3FCF43C53402 /* Debug */, - 5EB0D7D4CF48681DA30DD58C2E33B044 /* Release */, + 618AB008538F74AAF983C04297207BB6 /* Debug */, + 1A69165A21A7A1CC42A38CF8ADE98215 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/LookinServer.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/LookinServer.xcscheme new file mode 100644 index 0000000..a0dc613 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/mac.xcuserdatad/xcschemes/LookinServer.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Target Support Files/LookinServer/LookinServer-Info.plist b/Pods/Target Support Files/LookinServer/LookinServer-Info.plist new file mode 100644 index 0000000..eafed42 --- /dev/null +++ b/Pods/Target Support Files/LookinServer/LookinServer-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.2.8 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/LookinServer/LookinServer-dummy.m b/Pods/Target Support Files/LookinServer/LookinServer-dummy.m new file mode 100644 index 0000000..f86bacf --- /dev/null +++ b/Pods/Target Support Files/LookinServer/LookinServer-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_LookinServer : NSObject +@end +@implementation PodsDummy_LookinServer +@end diff --git a/Pods/Target Support Files/LookinServer/LookinServer-prefix.pch b/Pods/Target Support Files/LookinServer/LookinServer-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/LookinServer/LookinServer-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/LookinServer/LookinServer-umbrella.h b/Pods/Target Support Files/LookinServer/LookinServer-umbrella.h new file mode 100644 index 0000000..a3dddb0 --- /dev/null +++ b/Pods/Target Support Files/LookinServer/LookinServer-umbrella.h @@ -0,0 +1,87 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "CALayer+LookinServer.h" +#import "NSObject+LookinServer.h" +#import "UIBlurEffect+LookinServer.h" +#import "UIColor+LookinServer.h" +#import "UIImage+LookinServer.h" +#import "UIImageView+LookinServer.h" +#import "UILabel+LookinServer.h" +#import "UITableView+LookinServer.h" +#import "UITextField+LookinServer.h" +#import "UITextView+LookinServer.h" +#import "UIView+LookinServer.h" +#import "UIViewController+LookinServer.h" +#import "UIVisualEffectView+LookinServer.h" +#import "LKS_ConnectionManager.h" +#import "LKS_RequestHandler.h" +#import "LKS_AttrModificationPatchHandler.h" +#import "LKS_CustomAttrModificationHandler.h" +#import "LKS_HierarchyDetailsHandler.h" +#import "LKS_InbuiltAttrModificationHandler.h" +#import "LookinServer.h" +#import "LKSConfigManager.h" +#import "LKS_AttrGroupsMaker.h" +#import "LKS_CustomAttrGroupsMaker.h" +#import "LKS_CustomAttrSetterManager.h" +#import "LKS_CustomDisplayItemsMaker.h" +#import "LKS_EventHandlerMaker.h" +#import "LKS_ExportManager.h" +#import "LKS_GestureTargetActionsSearcher.h" +#import "LKS_Helper.h" +#import "LKS_HierarchyDisplayItemsMaker.h" +#import "LKS_MultiplatformAdapter.h" +#import "LKS_ObjectRegistry.h" +#import "LKS_TraceManager.h" +#import "LookinServerDefines.h" +#import "CALayer+Lookin.h" +#import "Color+Lookin.h" +#import "Image+Lookin.h" +#import "NSArray+Lookin.h" +#import "NSObject+Lookin.h" +#import "NSSet+Lookin.h" +#import "NSString+Lookin.h" +#import "LookinAppInfo.h" +#import "LookinAttribute.h" +#import "LookinAttributeModification.h" +#import "LookinAttributesGroup.h" +#import "LookinAttributesSection.h" +#import "LookinAttrIdentifiers.h" +#import "LookinAttrType.h" +#import "LookinAutoLayoutConstraint.h" +#import "LookinCodingValueType.h" +#import "LookinConnectionAttachment.h" +#import "LookinConnectionResponseAttachment.h" +#import "LookinCustomAttrModification.h" +#import "LookinCustomDisplayItemInfo.h" +#import "LookinDashboardBlueprint.h" +#import "LookinDefines.h" +#import "LookinDisplayItem.h" +#import "LookinDisplayItemDetail.h" +#import "LookinEventHandler.h" +#import "LookinHierarchyFile.h" +#import "LookinHierarchyInfo.h" +#import "LookinObject.h" +#import "LookinStaticAsyncUpdateTask.h" +#import "LookinTuple.h" +#import "LookinWeakContainer.h" +#import "Lookin_PTChannel.h" +#import "Lookin_PTPrivate.h" +#import "Lookin_PTProtocol.h" +#import "Lookin_PTUSBHub.h" +#import "Peertalk.h" +#import "LookinIvarTrace.h" + +FOUNDATION_EXPORT double LookinServerVersionNumber; +FOUNDATION_EXPORT const unsigned char LookinServerVersionString[]; + diff --git a/Pods/Target Support Files/LookinServer/LookinServer.debug.xcconfig b/Pods/Target Support Files/LookinServer/LookinServer.debug.xcconfig new file mode 100644 index 0000000..4b85527 --- /dev/null +++ b/Pods/Target Support Files/LookinServer/LookinServer.debug.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LookinServer +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) SHOULD_COMPILE_LOOKIN_SERVER=1 +OTHER_LDFLAGS = $(inherited) -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/LookinServer +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) SHOULD_COMPILE_LOOKIN_SERVER +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/LookinServer/LookinServer.modulemap b/Pods/Target Support Files/LookinServer/LookinServer.modulemap new file mode 100644 index 0000000..96c186b --- /dev/null +++ b/Pods/Target Support Files/LookinServer/LookinServer.modulemap @@ -0,0 +1,6 @@ +framework module LookinServer { + umbrella header "LookinServer-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/LookinServer/LookinServer.release.xcconfig b/Pods/Target Support Files/LookinServer/LookinServer.release.xcconfig new file mode 100644 index 0000000..4b85527 --- /dev/null +++ b/Pods/Target Support Files/LookinServer/LookinServer.release.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LookinServer +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 $(inherited) SHOULD_COMPILE_LOOKIN_SERVER=1 +OTHER_LDFLAGS = $(inherited) -framework "UIKit" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/LookinServer +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) SHOULD_COMPILE_LOOKIN_SERVER +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-acknowledgements.markdown b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-acknowledgements.markdown index 7de4a89..18b7808 100644 --- a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-acknowledgements.markdown @@ -29,6 +29,30 @@ THE SOFTWARE. Copyright (C) 2017 Tencent Bugly, Inc. All rights reserved. +## LookinServer + +MIT License + +Copyright (c) [2023] [LI KAI] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + ## MJExtension Copyright (c) 2013-2019 MJExtension (https://github.com/CoderMJLee/MJExtension) diff --git a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-acknowledgements.plist b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-acknowledgements.plist index fd6aa88..723a62e 100644 --- a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-acknowledgements.plist @@ -52,6 +52,36 @@ THE SOFTWARE. Type PSGroupSpecifier + + FooterText + MIT License + +Copyright (c) [2023] [LI KAI] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + License + GPL-3.0 + Title + LookinServer + Type + PSGroupSpecifier + FooterText Copyright (c) 2013-2019 MJExtension (https://github.com/CoderMJLee/MJExtension) diff --git a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-Debug-input-files.xcfilelist index 06b5aa0..b9ad469 100644 --- a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-Debug-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-Debug-input-files.xcfilelist @@ -1,5 +1,6 @@ ${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks.sh ${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework +${BUILT_PRODUCTS_DIR}/LookinServer/LookinServer.framework ${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework ${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework ${BUILT_PRODUCTS_DIR}/Masonry/Masonry.framework diff --git a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-Debug-output-files.xcfilelist index 66a1534..7c0c7d8 100644 --- a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-Debug-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-Debug-output-files.xcfilelist @@ -1,4 +1,5 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AFNetworking.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LookinServer.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Masonry.framework diff --git a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks.sh b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks.sh index b731e30..29e1505 100755 --- a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks.sh +++ b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks.sh @@ -177,6 +177,7 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework" + install_framework "${BUILT_PRODUCTS_DIR}/LookinServer/LookinServer.framework" install_framework "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework" install_framework "${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework" install_framework "${BUILT_PRODUCTS_DIR}/Masonry/Masonry.framework" diff --git a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard.debug.xcconfig b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard.debug.xcconfig index 2e2ca3c..906dd25 100644 --- a/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard.debug.xcconfig +++ b/Pods/Target Support Files/Pods-keyBoard/Pods-keyBoard.debug.xcconfig @@ -1,10 +1,10 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_ROOT}/Bugly" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/LookinServer" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_ROOT}/Bugly" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LookinServer/LookinServer.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJExtension/MJExtension.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh/MJRefresh.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Masonry/Masonry.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "AFNetworking" -framework "Bugly" -framework "Foundation" -framework "ImageIO" -framework "MJExtension" -framework "MJRefresh" -framework "Masonry" -framework "SDWebImage" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "-F${PODS_CONFIGURATION_BUILD_DIR}/Bugly" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "-F${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "-F${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" +OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"z" -framework "AFNetworking" -framework "Bugly" -framework "Foundation" -framework "ImageIO" -framework "LookinServer" -framework "MJExtension" -framework "MJRefresh" -framework "Masonry" -framework "SDWebImage" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "-F${PODS_CONFIGURATION_BUILD_DIR}/Bugly" "-F${PODS_CONFIGURATION_BUILD_DIR}/LookinServer" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJExtension" "-F${PODS_CONFIGURATION_BUILD_DIR}/MJRefresh" "-F${PODS_CONFIGURATION_BUILD_DIR}/Masonry" "-F${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. diff --git a/keyBoard.xcodeproj/project.pbxproj b/keyBoard.xcodeproj/project.pbxproj index 1f59212..b71ed3c 100644 --- a/keyBoard.xcodeproj/project.pbxproj +++ b/keyBoard.xcodeproj/project.pbxproj @@ -29,6 +29,9 @@ 04FC95612EAFAF51007BD342 /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC95462EAFAF51007BD342 /* ViewController+MASAdditions.m */; }; 04FC95622EAFAF51007BD342 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 04FC953B2EAFAF51007BD342 /* LICENSE */; }; 04FC95632EAFAF51007BD342 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 04FC95562EAFAF51007BD342 /* README.md */; }; + 04FC95672EB0546C007BD342 /* KBKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC95652EB0546C007BD342 /* KBKey.m */; }; + 04FC956A2EB05497007BD342 /* KBKeyButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC95692EB05497007BD342 /* KBKeyButton.m */; }; + 04FC956D2EB054B7007BD342 /* KBKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC956C2EB054B7007BD342 /* KBKeyboardView.m */; }; 7A36414DFDA5BEC9B7D2E318 /* Pods_CustomKeyboard.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C1092FB2B452F95B15D4263 /* Pods_CustomKeyboard.framework */; }; ECC9EE02174D86E8D792472F /* Pods_keyBoard.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 967065BB5230E43F293B3AF9 /* Pods_keyBoard.framework */; }; /* End PBXBuildFile section */ @@ -104,6 +107,12 @@ 04FC95532EAFAF51007BD342 /* MASViewConstraint.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MASViewConstraint.m; sourceTree = ""; }; 04FC95542EAFAF51007BD342 /* MASViewAttribute.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MASViewAttribute.m; sourceTree = ""; }; 04FC95562EAFAF51007BD342 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 04FC95642EB0546C007BD342 /* KBKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBKey.h; sourceTree = ""; }; + 04FC95652EB0546C007BD342 /* KBKey.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBKey.m; sourceTree = ""; }; + 04FC95682EB05497007BD342 /* KBKeyButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBKeyButton.h; sourceTree = ""; }; + 04FC95692EB05497007BD342 /* KBKeyButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBKeyButton.m; sourceTree = ""; }; + 04FC956B2EB054B7007BD342 /* KBKeyboardView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBKeyboardView.h; sourceTree = ""; }; + 04FC956C2EB054B7007BD342 /* KBKeyboardView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBKeyboardView.m; sourceTree = ""; }; 2C1092FB2B452F95B15D4263 /* Pods_CustomKeyboard.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CustomKeyboard.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 51FE7C4C42C2255B3C1C4128 /* Pods-keyBoard.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-keyBoard.release.xcconfig"; path = "Target Support Files/Pods-keyBoard/Pods-keyBoard.release.xcconfig"; sourceTree = ""; }; 727EC7532EAF848B00B36487 /* keyBoard.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = keyBoard.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -154,6 +163,7 @@ 04C6EAD72EAF870B0089C901 /* CustomKeyboard */ = { isa = PBXGroup; children = ( + 04FC95662EB0546C007BD342 /* Model */, 04C6EADA2EAF8C7B0089C901 /* View */, 04C6EAD42EAF870B0089C901 /* Info.plist */, 04C6EAD52EAF870B0089C901 /* KeyboardViewController.h */, @@ -169,6 +179,10 @@ children = ( 04C6EADB2EAF8CEB0089C901 /* KBToolBar.h */, 04C6EADC2EAF8CEB0089C901 /* KBToolBar.m */, + 04FC95682EB05497007BD342 /* KBKeyButton.h */, + 04FC95692EB05497007BD342 /* KBKeyButton.m */, + 04FC956B2EB054B7007BD342 /* KBKeyboardView.h */, + 04FC956C2EB054B7007BD342 /* KBKeyboardView.m */, ); path = View; sourceTree = ""; @@ -224,6 +238,15 @@ path = Masonry; sourceTree = ""; }; + 04FC95662EB0546C007BD342 /* Model */ = { + isa = PBXGroup; + children = ( + 04FC95642EB0546C007BD342 /* KBKey.h */, + 04FC95652EB0546C007BD342 /* KBKey.m */, + ); + path = Model; + sourceTree = ""; + }; 2C53A0856097DCFBE7B55649 /* Pods */ = { isa = PBXGroup; children = ( @@ -397,14 +420,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks.sh\"\n"; @@ -441,12 +460,15 @@ files = ( 04C6EADD2EAF8CEB0089C901 /* KBToolBar.m in Sources */, 04C6EAD82EAF870B0089C901 /* KeyboardViewController.m in Sources */, + 04FC956A2EB05497007BD342 /* KBKeyButton.m in Sources */, 04FC95582EAFAF51007BD342 /* MASConstraintMaker.m in Sources */, 04FC95592EAFAF51007BD342 /* MASViewConstraint.m in Sources */, 04FC955A2EAFAF51007BD342 /* MASViewAttribute.m in Sources */, 04FC955B2EAFAF51007BD342 /* NSArray+MASAdditions.m in Sources */, 04FC955C2EAFAF51007BD342 /* View+MASAdditions.m in Sources */, 04FC955D2EAFAF51007BD342 /* MASCompositeConstraint.m in Sources */, + 04FC956D2EB054B7007BD342 /* KBKeyboardView.m in Sources */, + 04FC95672EB0546C007BD342 /* KBKey.m in Sources */, 04FC955E2EAFAF51007BD342 /* MASConstraint.m in Sources */, 04FC955F2EAFAF51007BD342 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, 04FC95602EAFAF51007BD342 /* MASLayoutConstraint.m in Sources */,