Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Foundation
- import UIKit
- fileprivate class LazyStyleMeta: NSObject {
- public var fontName: String! = UIFont.systemFont(ofSize: UIFont.systemFontSize).fontName
- public var fontSize: CGFloat = UIFont.systemFontSize
- public var colorHexString: String! = "000000"
- public var colorAlpha: CGFloat = 1
- // Font from attributes
- public var font: UIFont? {
- return UIFont(name: fontName, size: fontSize)
- }
- // Color from attributes
- public var color: UIColor? {
- let scanner = Scanner(string: colorHexString)
- var hexInt: UInt64 = 0;
- if scanner.scanHexInt64(&hexInt) {
- return UIColor(hex: hexInt, alpha: colorAlpha)
- }
- return nil
- }
- }
- /**
- Mapping of text styles
- */
- open class LazyStyleManager: NSObject {
- private let BASE_LANGUAGE = "base"
- private var styleDictForLanguage: [String : [String : LazyStyleMeta]] = [:]
- private var fontNameForKey: [String : String] = [:]
- private var fontRatioForContentSizeCategory: [UIContentSizeCategory : CGFloat] = [:]
- private var defaultStyleMeta = LazyStyleMeta()
- // Shared instance
- static var shared = LazyStyleManager()
- public override init() {
- super.init()
- defaultStyleMeta.fontSize = UIFont.systemFontSize
- defaultStyleMeta.fontName = UIFont.systemFont(ofSize: UIFont.systemFontSize).fontName
- defaultStyleMeta.colorHexString = "000000"
- defaultStyleMeta.colorAlpha = 1
- fontRatioForContentSizeCategory = [
- .extraSmall: 1,
- .small: 1,
- .medium: 1,
- .large: 1.33,
- .extraLarge: 1.66,
- .extraExtraLarge: 2,
- .extraExtraExtraLarge: 2.5,
- ]
- _add(fontName: "HelveticaNeue", forKey: "n")
- _add(fontName: "HelveticaNeue-Medium", forKey: "m")
- _add(fontName: "HelveticaNeue-Light", forKey: "l")
- _add(fontName: "HelveticaNeue-Bold", forKey: "b")
- _add(fontName: "HelveticaNeue", forKey: "n01")
- _add(fontName: "HelveticaNeue-Medium", forKey: "m01")
- _add(fontName: "HelveticaNeue-Light", forKey: "l01")
- _add(fontName: "HelveticaNeue-Bold", forKey: "b01")
- _ = add(styleFromString:"t01 f0d2b8 15 n cn")
- _ = add(styleFromString:"t01 f0d2b8 17 m en")
- _ = add(styleFromString:"t03 f0d2b8 18 n cn")
- _ = add(styleFromString:"t03 f0d2b8 21 m en")
- _ = add(styleFromString:"t04 a59c8c 19")
- _ = add(styleFromString:"t05 141c24 19")
- _ = add(styleFromString:"t06 0b59ad 25")
- _ = add(styleFromString:"t07 141c24 25 n cn")
- _ = add(styleFromString:"t07 141c24 20 n en")
- _ = add(styleFromString:"t08 141c24 16")
- _ = add(styleFromString:"t09 808d98 14 l")
- _ = add(styleFromString:"t10 495b6b 18 n cn")
- _ = add(styleFromString:"t10 495b6b 18 m en")
- _ = add(styleFromString:"t11 808d98 18 m")
- _ = add(styleFromString:"t12 000000 18 n cn")
- _ = add(styleFromString:"t12 000000 19 m en")
- _ = add(styleFromString:"t13 495b6b 10")
- _ = add(styleFromString:"t14 141c24 25")
- _ = add(styleFromString:"t15 f0d2b8 23")
- _ = add(styleFromString:"t16 f0d2b8 13")
- _ = add(styleFromString:"t17 f0d2b8 13 l")
- _ = add(styleFromString:"t18 808d98 25 n cn")
- _ = add(styleFromString:"t18 808d98 20 n en")
- _ = add(styleFromString:"t19 ffffff 19")
- _ = add(styleFromString:"t20 ffffff 15")
- _ = add(styleFromString:"s01 f0d2b8 11 l")
- _ = add(styleFromString:"s02 808d98 14")
- _ = add(styleFromString:"s03 495b6b 18")
- _ = add(styleFromString:"s04 ffffff 21")
- _ = add(styleFromString:"s05 ffffff 23")
- _ = add(styleFromString:"s06 f0d2b8 23")
- _ = add(styleFromString:"s07 ffffff 23")
- _ = add(styleFromString:"s08 ffffff 18")
- _ = add(styleFromString:"s09 f0d2b8 18")
- _ = add(styleFromString:"s10 141c24 14")
- _ = add(styleFromString:"s11 f0d2b8 24 n cn")
- _ = add(styleFromString:"s11 f0d2b8 19 n en")
- _ = add(styleFromString:"s12 ffffff 24 n cn")
- _ = add(styleFromString:"s12 ffffff 19 n en")
- _ = add(styleFromString:"s13 f0d2b8 20 n cn")
- _ = add(styleFromString:"s13 f0d2b8 17 n en")
- _ = add(styleFromString:"s14 ffffff 20 n cn")
- _ = add(styleFromString:"s14 ffffff 17 n en")
- _ = add(styleFromString:"f01 808d98 18")
- _ = add(styleFromString:"f02 ffffff 18")
- _ = add(styleFromString:"f03 222222 18 n cn")
- _ = add(styleFromString:"f03 222222 15 n en")
- _ = add(styleFromString:"f04 808d98 14")
- _ = add(styleFromString:"f05 1c57ff 21")
- _ = add(styleFromString:"f06 808d98 21")
- _ = add(styleFromString:"f07 141c24 21")
- _ = add(styleFromString:"f08 1c57ff 18")
- _ = add(styleFromString:"f09 8f9ba4 22 n cn")
- _ = add(styleFromString:"f09 8f9ba4 19 n en")
- _ = add(styleFromString:"f10 383c3f 22 n cn")
- _ = add(styleFromString:"f10 383c3f 19 n en")
- _ = add(styleFromString:"f11 383c3f 22 n cn")
- _ = add(styleFromString:"f11 383c3f 19 n en")
- _ = add(styleFromString:"f12 ffffff 22 n cn")
- _ = add(styleFromString:"f12 ffffff 19 n en")
- _ = add(styleFromString:"f13 898c8e 15")
- _ = add(styleFromString:"f14 898c8e 15")
- _ = add(styleFromString:"f15 dbdee1 22 n cn")
- _ = add(styleFromString:"f15 dbdee1 19 n en")
- _ = add(styleFromString:"f16 383c3f 22 n cn")
- _ = add(styleFromString:"f16 383c3f 19 n en")
- _ = add(styleFromString:"f17 ffffff 18 l cn")
- _ = add(styleFromString:"f17 ffffff 15 l en")
- _ = add(styleFromString:"d01 808d98 10 l")
- _ = add(styleFromString:"d02 0b59ad 13 l")
- _ = add(styleFromString:"d03 a59c8c 13")
- _ = add(styleFromString:"d04 495b6b 16")
- _ = add(styleFromString:"d05 343434 23 n cn")
- _ = add(styleFromString:"d05 343434 19 n en")
- _ = add(styleFromString:"d06 343434 18 n cn")
- _ = add(styleFromString:"d06 343434 16 n cn")
- _ = add(styleFromString:"d07 141c24 15")
- _ = add(styleFromString:"d08 808d98 18")
- _ = add(styleFromString:"d09 343434 23 n cn")
- _ = add(styleFromString:"d09 343434 17 n en")
- _ = add(styleFromString:"n01 f0d2b8 60 n02")
- _ = add(styleFromString:"n02 a59c8c 40 n02")
- _ = add(styleFromString:"n03 f0d2b8 25 n02")
- _ = add(styleFromString:"n04 e2183e 40 n02")
- _ = add(styleFromString:"n05 4878c0 40 n02")
- _ = add(styleFromString:"n06 3ea3ab 40 n02")
- _ = add(styleFromString:"n07 8941af 40 n02")
- _ = add(styleFromString:"n08 141c24 40 n02")
- _ = add(styleFromString:"n09 e4b04a 40 n02")
- _ = add(styleFromString:"n10 ff787f 40 n02")
- _ = add(styleFromString:"n11 f26522 40 n02")
- _ = add(styleFromString:"n12 807d6e 40 n02")
- _ = add(styleFromString:"n13 f0d2b8 30 l02")
- _ = add(styleFromString:"n14 a59c8c 60 n02")
- _ = add(styleFromString:"n24 a59c8c 30 n02")
- _ = add(styleFromString:"n25 e42a4d 25 n02")
- _ = add(styleFromString:"n26 a59c8c 37.5 n02")
- _ = add(styleFromString:"n27 e42a4d 37.5 n02")
- _ = add(styleFromString:"n28 a59c8c 18 m")
- _ = add(styleFromString:"n29 ffffff 20")
- _ = add(styleFromString:"n30 ffffff 15")
- _ = add(styleFromString:"n31 b51332 12")
- _ = add(styleFromString:"n32 ffffff 33")
- _ = add(styleFromString:"n33 3f4449 30")
- _ = add(styleFromString:"n34 000000 24")
- _ = add(styleFromString:"st01 808d98 15 n cn")
- _ = add(styleFromString:"st01 808d98 15 m en")
- _ = add(styleFromString:"st02 495b6b 15 l")
- _ = add(styleFromString:"st03 a59c8c 16")
- _ = add(styleFromString:"st04 000000 30")
- _ = add(styleFromString:"st05 3586b0 18 n cn")
- _ = add(styleFromString:"st05 3586b0 15 m en")
- _ = add(styleFromString:"st06 495b6b 18 m")
- _ = add(styleFromString:"st07 495b6b 14")
- _ = add(styleFromString:"st08 495b6b 14 m")
- _ = add(styleFromString:"st09 f0d2b8 16")
- _ = add(styleFromString:"st10 f0d2b8 20 l")
- _ = add(styleFromString:"st11 f0d2b8 18 l")
- _ = add(styleFromString:"st12 141c24 21 n cn")
- _ = add(styleFromString:"st12 141c24 16 m en")
- _ = add(styleFromString:"st13 a59c8c 20 l")
- _ = add(styleFromString:"st14 141c24 18 n cn")
- _ = add(styleFromString:"st14 141c24 18 m en")
- _ = add(styleFromString:"st15 141c24 18 m")
- _ = add(styleFromString:"st16 141c24 18 l cn")
- _ = add(styleFromString:"st16 141c24 14 m en")
- _ = add(styleFromString:"st17 141c24 21")
- _ = add(styleFromString:"st18 c6cbcf 23 n cn")
- _ = add(styleFromString:"st18 c6cbcf 17 n en")
- _ = add(styleFromString:"st19 999999 17 n cn")
- _ = add(styleFromString:"st19 999999 17 n en")
- _ = add(styleFromString:"st20 343434 19 n cn")
- _ = add(styleFromString:"st20 343434 16 n en")
- _ = add(styleFromString:"st21 808d98 14")
- _ = add(styleFromString:"st22 cacfd3 14")
- _ = add(styleFromString:"st23 1c57ff 14")
- _ = add(styleFromString:"st24 000000 19")
- _ = add(styleFromString:"b01 a59c8c 16 m")
- _ = add(styleFromString:"b02 ffffff 18")
- _ = add(styleFromString:"b03 ffffff 18 n cn")
- _ = add(styleFromString:"b03 ffffff 21 n en")
- _ = add(styleFromString:"b04 7e8e9a 15 n cn")
- _ = add(styleFromString:"b04 7e8e9a 15 m en")
- _ = add(styleFromString:"b05 a59c8c 16")
- _ = add(styleFromString:"b06 8d7f4d 15 n cn")
- _ = add(styleFromString:"b06 8d7f4d 15 m en")
- _ = add(styleFromString:"b07 ffffff 16")
- _ = add(styleFromString:"b08 1c57ff 18")
- _ = add(styleFromString:"b09 808d98 18")
- _ = add(styleFromString:"b10 e6e8ea 18")
- _ = add(styleFromString:"b11 141c24 18")
- _ = add(styleFromString:"b12 808d98 13")
- _ = add(styleFromString:"b13 ffffff 21 n cn")
- _ = add(styleFromString:"b13 ffffff 19 n en")
- _ = add(styleFromString:"b14 f0d2b8 19 n cn")
- _ = add(styleFromString:"b14 f0d2b8 17 l en")
- _ = add(styleFromString:"b15 f0d2b8 15")
- _ = add(styleFromString:"b16 a9b0b7 17 n cn")
- _ = add(styleFromString:"b16 a9b0b7 17 m en")
- _ = add(styleFromString:"b17 1c57ff 17 n cn")
- _ = add(styleFromString:"b17 1c57ff 17 m en")
- _ = add(styleFromString:"b18 e2183e 17 n cn")
- _ = add(styleFromString:"b18 e2183e 17 m en")
- _ = add(styleFromString:"b19 2762f5 14 l cn")
- _ = add(styleFromString:"b19 2762f5 14 n02 en")
- _ = add(styleFromString:"b20 d01639 14 l cn")
- _ = add(styleFromString:"b20 d01639 14 n02 en")
- _ = add(styleFromString:"b21 8d7f4d 14 l cn")
- _ = add(styleFromString:"b21 8d7f4d 14 n en")
- _ = add(styleFromString:"b22 FFFFFF 14 l cn")
- _ = add(styleFromString:"b22 FFFFFF 14 n02 en")
- _ = add(styleFromString:"b23 141c24 15 n cn")
- _ = add(styleFromString:"b23 141c24 15 m en")
- _ = add(styleFromString:"b24 FFFFFF 16")
- _ = add(styleFromString:"b25 FFFFFF 14 l")
- _ = add(styleFromString:"b26 2762f5 21")
- _ = add(styleFromString:"b27 141c24 21")
- _ = add(styleFromString:"b28 495b6b 14 n cn")
- _ = add(styleFromString:"b28 495b6b 14 l en")
- _ = add(styleFromString:"b29 f2bbc1 16 n cn")
- _ = add(styleFromString:"b29 f2bbc1 16 m en")
- _ = add(styleFromString:"b30 ffffff 16 n cn")
- _ = add(styleFromString:"b30 ffffff 16 m en")
- _ = add(styleFromString:"b31 c2c7cb 15 n cn")
- _ = add(styleFromString:"b31 c2c7cb 15 m en")
- _ = add(styleFromString:"b32 1c57ff 15 n cn")
- _ = add(styleFromString:"b32 1c57ff 15 m en")
- _ = add(styleFromString:"b33 8d7f4d 15 n cn")
- _ = add(styleFromString:"b33 8d7f4d 15 m en")
- _ = add(styleFromString:"b34 ffffff 18 n cn 0.6")
- _ = add(styleFromString:"b34 ffffff 18 n en 0.6")
- _ = add(styleFromString:"b35 ffffff 12")
- _ = add(styleFromString:"b36 eddbcb 19 l")
- _ = add(styleFromString:"b37 d64063 19 l")
- _ = add(styleFromString:"b38 495b6b 21")
- _ = add(styleFromString:"b39 495b6b 16")
- _ = add(styleFromString:"m01 ffffff 12")
- _ = add(styleFromString:"m02 ffffff 14")
- _ = add(styleFromString:"m03 424343 12")
- _ = add(styleFromString:"m04 000000 17")
- _ = add(styleFromString:"m05 adb3ba 14")
- _ = add(styleFromString:"m06 3f4449 20 n cn")
- _ = add(styleFromString:"m06 3f4449 18 n en")
- _ = add(styleFromString:"m07 a59c8c 24")
- _ = add(styleFromString:"m08 141c24 24")
- _ = add(styleFromString:"m09 495b6b 30")
- _ = add(styleFromString:"m10 ffffff 17 m")
- _ = add(styleFromString:"m11 a59c8c 18")
- _ = add(styleFromString:"m12 141c24 16 n cn")
- _ = add(styleFromString:"m12 141c24 14 m en")
- _ = add(styleFromString:"m13 343434 13 n cn")
- _ = add(styleFromString:"m13 343434 11 n en")
- _ = add(styleFromString:"m14 141c24 19 m")
- _ = add(styleFromString:"m15 141c24 25 n cn")
- _ = add(styleFromString:"m15 141c24 25 l en")
- _ = add(styleFromString:"m16 79682e 12 n cn")
- _ = add(styleFromString:"m16 79682e 11 l en")
- _ = add(styleFromString:"m17 ffffff 24")
- _ = add(styleFromString:"ld01 808d98 13")
- _ = add(styleFromString:"ld02 808d98 13 l cn")
- _ = add(styleFromString:"ld02 808d98 11 l en")
- _ = add(styleFromString:"ld03 495b6b 13 m02")
- _ = add(styleFromString:"ld04 495b6b 16 m02")
- _ = add(styleFromString:"ld05 a59c8c 16 m02")
- _ = add(styleFromString:"ld06 a59c8c 16 m02")
- _ = add(styleFromString:"ld07 808d98 15")
- _ = add(styleFromString:"ld08 808d98 11")
- _ = add(styleFromString:"ld09 2762f5 16 n cn")
- _ = add(styleFromString:"ld09 2762f5 16 m en")
- _ = add(styleFromString:"ld10 141c24 17")
- _ = add(styleFromString:"ld11 7e8e9a 13")
- _ = add(styleFromString:"ld12 0b59ad 18")
- _ = add(styleFromString:"ld13 cacfd3 18 n cn")
- _ = add(styleFromString:"ld13 cacfd3 18 m en")
- _ = add(styleFromString:"ld14 141c24 13 l")
- _ = add(styleFromString:"ld15 3586b0 13 m cn")
- _ = add(styleFromString:"ld15 3586b0 12.5 m cn")
- _ = add(styleFromString:"ld16 0b59ad 15")
- _ = add(styleFromString:"ld17 FFFFFF 12")
- _ = add(styleFromString:"ld18 777777 12")
- _ = add(styleFromString:"ld19 555555 11")
- _ = add(styleFromString:"ld20 ffffff 20")
- _ = add(styleFromString:"ld21 f62a51 17")
- _ = add(styleFromString:"ld22 ffffff 17")
- _ = add(styleFromString:"ld23 cacfd3 17")
- _ = add(styleFromString:"ld24 f62a51 14")
- _ = add(styleFromString:"ld25 8d7f4d 15")
- _ = add(styleFromString:"ld26 ffffff 9")
- _ = add(styleFromString:"ld27 ffffff 14 n cn")
- _ = add(styleFromString:"ld27 ffffff 14 m en")
- _ = add(styleFromString:"ld28 00a651 13")
- _ = add(styleFromString:"ld29 3f4449 14")
- _ = add(styleFromString:"h01 ffffff 17")
- _ = add(styleFromString:"h02 ffffff 15")
- _ = add(styleFromString:"c01 000000 18")
- _ = add(styleFromString:"c02 adb3ba 10")
- _ = add(styleFromString:"c03 adb3ba 12")
- _ = add(styleFromString:"c04 e2183e 17")
- _ = add(styleFromString:"cl ffffff 15")
- _ = add(styleFromString:"cl02 000000 18")
- _ = add(styleFromString:"cl03 adb3ba 10 b")
- _ = add(styleFromString:"cl04 000000 18")
- _ = add(styleFromString:"cl05 adb3ba 12")
- _ = add(styleFromString:"cl06 adb3ba 12")
- _ = add(styleFromString:"cl07 000000 14")
- _ = add(styleFromString:"cl08 adb3ba 10 b")
- _ = add(styleFromString:"cl09 000000 14")
- _ = add(styleFromString:"cl10 e2183e 10 b")
- _ = add(styleFromString:"cl11 4986c5 12 l")
- _ = add(styleFromString:"cl12 e2183e 14")
- _ = add(styleFromString:"cl13 e2183e 10 b")
- _ = add(styleFromString:"pu01 000000 18")
- _ = add(styleFromString:"pu02 adb3ba 17 l")
- _ = add(styleFromString:"pu03 adb3ba 14")
- _ = add(styleFromString:"pu04 000000 14")
- _ = add(styleFromString:"pu05 000000 17")
- _ = add(styleFromString:"pu06 1aad19 17")
- _ = add(styleFromString:"pu07 ffffff 12")
- _ = add(styleFromString:"pu08 e2183e 20")
- _ = add(styleFromString:"pu09 000000 20")
- _ = add(styleFromString:"se01 adb3ba 14")
- _ = add(styleFromString:"se02 000000 14")
- _ = add(styleFromString:"se03 adb3ba 18")
- _ = add(styleFromString:"ep01 ffffff 12")
- _ = add(styleFromString:"ep02 000000 17")
- _ = add(styleFromString:"ep03 ffffff 18")
- }
- // MARK: - Getter
- // Get a style
- private func _getStyle(forName name: String, inLanguage language: String?) -> LazyStyleMeta? {
- let lang = language?.lowercased() ?? BASE_LANGUAGE
- // Return nothing if language dict not found
- guard let dict = styleDictForLanguage[lang] else {
- return nil
- }
- // Return nothing if meta not found
- guard let style = dict[name.lowercased()] else {
- return nil
- }
- return style
- }
- /**
- Try getting a style from desired language pack, else try from base language pack
- */
- private func _getStyleWithFallback(forName name: String, inLanguage language: String?) -> LazyStyleMeta? {
- if let style = _getStyle(forName: name, inLanguage: language) {
- return style
- }
- return _getStyle(forName: name, inLanguage: BASE_LANGUAGE)
- }
- /**
- Font for certain style
- */
- open func getFont(forStyleName name: String, inLanguage language: String?) -> UIFont {
- guard let style = _getStyleWithFallback(forName: name, inLanguage: language) else {
- return defaultStyleMeta.font!
- }
- let fontRatio = fontRatioForContentSizeCategory[UIApplication.shared.preferredContentSizeCategory] ?? 1
- let fontSize = style.fontSize * fontRatio
- guard let font = UIFont(name: style.fontName, size: fontSize) else {
- return defaultStyleMeta.font!
- }
- return font
- }
- /**
- Text color for certain style
- */
- open func getColor(forStyleName name: String, inLanguage language: String?) -> UIColor {
- guard let style = _getStyleWithFallback(forName: name, inLanguage: language) else {
- return defaultStyleMeta.color!
- }
- guard let color = style.color else {
- return defaultStyleMeta.color!
- }
- return color
- }
- /**
- Text attribute for certain style
- */
- open func getAttributes(forStyleName name: String, inLanguage language: String?) -> [String : Any] {
- var attributes: [String : Any] = [:]
- guard let style = _getStyleWithFallback(forName: name, inLanguage: language) else {
- return attributes
- }
- attributes[NSForegroundColorAttributeName] = style.color
- attributes[NSFontAttributeName] = style.font
- return attributes
- }
- // MARK: - Helper
- // Add a language set
- private func add(language: String) -> [String : LazyStyleMeta] {
- styleDictForLanguage[language.lowercased()] = [:]
- return styleDictForLanguage[language.lowercased()]!
- }
- // Add shortcut key for font name
- private func _add(fontName: String, forKey key: String) -> Void {
- fontNameForKey[key.lowercased()] = fontName
- }
- // Add a language style of certain name to a language set
- private func _add(style: LazyStyleMeta, forName name: String, inLanguage language: String?) -> Void {
- let lang = language?.lowercased() ?? BASE_LANGUAGE
- // Ensure style dict for certain language exist
- if styleDictForLanguage[lang] == nil {
- styleDictForLanguage[lang] = [:]
- }
- styleDictForLanguage[lang]![name.lowercased()] = style;
- }
- /**
- Add a language style from string
- Format: "{class name: string} #{color: hex * 6} {font size: int} {font name: string} (language: en/cn)"
- */
- open func add(styleFromString styleString: String) -> Bool {
- let components = styleString.components(separatedBy: " ")
- guard components.count > 0 else {
- print("Invalid style from \(styleString)")
- return false
- }
- let name = components[0]
- var language: String?
- let style = LazyStyleMeta()
- // Set color hex
- if components.count > 1 {
- style.colorHexString = components[1]
- }
- // Set font size
- if components.count > 2 {
- if let number = NumberFormatter().number(from: components[2]) {
- style.fontSize = CGFloat(number.doubleValue)
- } else {
- print("Invalid font size from \(styleString)")
- }
- }
- // Set font name
- if components.count > 3 {
- if let name = fontNameForKey[components[3]] {
- style.fontName = name
- } else {
- style.fontName = components[3];
- }
- }
- // Set language
- if components.count > 4 {
- language = components[4]
- }
- // Set color alpha
- if components.count > 5 {
- if let number = NumberFormatter().number(from: components[5]) {
- style.colorAlpha = CGFloat(number.doubleValue)
- } else {
- print("Invalid color alpha from \(styleString)")
- }
- }
- _add(style: style, forName: name, inLanguage: language)
- return true
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement