Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // ViewController.swift
- // test
- //
- // Created by Frentescu Stefan on 21/06/2018.
- // Copyright © 2018 Frentescu Stefan. All rights reserved.
- //
- import Foundation
- import Cocoa
- import CoreImage
- @_exported import AppKit
- extension NSImage {
- // func imageWithTintColor(tintColor: NSColor) -> NSImage {
- // if self.isTemplate == false {
- // return self
- // }
- //
- // let image = self.copy() as! NSImage
- // image.lockFocus()
- //
- // tintColor.set()
- // __NSRectFillUsingOperation(NSMakeRect(0, 0, image.size.width, image.size.height), NSCompositingOperation.sourceAtop)
- // // NSRect.CompositeSourceAtop
- // // var a = NSColor.setFill(tintColor)// NSRect.fill(NSMakeRect(0, 0, image.size.width, image.size.height))
- // //image.backgroundColor = NSColor.green
- // //print(type(of:a))
- //
- // image.unlockFocus()
- // image.isTemplate = false
- // return image
- // }
- func imageWithTintColor(tintColor: NSColor) -> NSImage {
- if self.isTemplate == false {
- return self
- }
- let image = self.copy() as! NSImage
- image.lockFocus()
- tintColor.set()
- __NSRectFillUsingOperation(NSMakeRect(0, 0, image.size.width, image.size.height), NSCompositingOperation.sourceAtop)
- image.unlockFocus()
- image.isTemplate = false
- return image
- }
- func tinting(with tintColor: NSColor) -> NSImage {
- guard let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return self }
- return NSImage(size: size, flipped: false) { bounds in
- guard let context = NSGraphicsContext.current?.cgContext else { return false }
- tintColor.set()
- context.clip(to: bounds, mask: cgImage)
- context.fill(bounds)
- return true
- }
- }
- func tintedImage(_ image: NSImage, tint: NSColor) -> NSImage {
- guard let tinted = image.copy() as? NSImage else { return image }
- tinted.lockFocus()
- tint.set()
- let imageRect = NSRect(origin: NSZeroPoint, size: image.size)
- __NSRectFillUsingOperation(imageRect, .sourceAtop)
- tinted.unlockFocus()
- return tinted
- }
- }
- extension NSRect {
- /// Fills this rect in the current NSGraphicsContext in the context's fill
- /// color.
- /// The compositing operation of the fill defaults to the context's
- /// compositing operation, not necessarily using `.copy` like `NSRectFill()`.
- /// - precondition: There must be a set current NSGraphicsContext.
- @available(swift 4)
- public func fill(using operation: NSCompositingOperation =
- NSGraphicsContext.current?.compositingOperation ?? .sourceOver) {
- precondition(NSGraphicsContext.current != nil,
- "There must be a set current NSGraphicsContext")
- __NSRectFillUsingOperation(self, operation)
- }
- }
- class StatusIconImage{
- var item:NSStatusItem?
- var image = NSImage()
- func initFunc(){
- let resizeImg:NSImage = image.copy() as! NSImage
- resizeImg.size.width = 16
- resizeImg.size.height = 16
- item = NSStatusBar.system.statusItem(withLength: 30)
- item?.image = resizeImg
- }
- }
- class ExportImage{
- var image:NSImage?
- var url:URL?
- func url(url:String){
- self.url = URL(fileURLWithPath: url)
- }
- func resize(sizeImage:Int){
- let resizedImage = image?.resize(image: image!, w: sizeImage, h: sizeImage)
- image = resizedImage
- }
- func export() {
- image?.writePNG(toURL: url!)
- }
- }
- class ColorPanel {
- var panel = NSColorPanel.shared
- func initFunc() {
- panel.setTarget(self)
- panel.makeKeyAndOrderFront(self)
- panel.isContinuous = true
- }
- func changeColor(image:NSImage) -> NSImage{
- return image.tintedImage(image, tint: panel.color)
- }
- }
- class ViewController: NSViewController {
- @IBOutlet weak var imageDockController: NSImageView!
- @IBOutlet weak var imageStatusController: NSImageView!
- @IBOutlet weak var sliderDockController: NSSlider!
- @IBOutlet weak var sliderStatusController: NSSlider!
- @IBOutlet weak var BlackButton: NSButton!
- @IBOutlet weak var disclosureController: NSButton!
- @IBOutlet weak var LabelTextStatus1: NSTextField!
- @IBOutlet weak var labelTextStatus2: NSTextField!
- @IBOutlet weak var labelTextStatus3: NSTextField!
- @IBOutlet weak var labelTextDock1: NSTextField!
- @IBOutlet weak var labelTextDock2: NSTextField!
- @IBOutlet weak var labelTextDock3: NSTextField!
- @IBOutlet weak var colorPickIconDock: NSButton!
- @IBOutlet weak var colorPickIconStatus: NSButton!
- @IBOutlet weak var exportButtonStatus: NSButton!
- @IBOutlet weak var exportButtonDock: NSButton!
- @IBOutlet weak var exportButtonStatusICNS: NSButton!
- @IBOutlet weak var exportButtonDockICNS: NSButton!
- @IBOutlet var backgroundView: CustomView!
- var copyImageDockController: NSImage!
- var copyImageStatusController: NSImage!
- var statusController = StatusIconImage()
- var statusImg:StatusIconImage?
- var colorPick = ColorPanel()
- var enabled = true
- override func viewDidLoad() {
- super.viewDidLoad()
- BlackButton.title = "Black"
- viewController.sliderDockController = sliderDockController
- imageStatusController.image = #imageLiteral(resourceName: "uploadDrag'n'Drop")
- imageDockController.image = #imageLiteral(resourceName: "uploadDrag'n'Drop")
- copyImageDockController = #imageLiteral(resourceName: "uploadDrag'n'Drop")
- copyImageStatusController = #imageLiteral(resourceName: "uploadDrag'n'Drop")
- BlackButton.attributedTitle = NSMutableAttributedString(string: "Black",attributes:[NSAttributedStringKey.foregroundColor: NSColor.darkGray])
- // Do any additional setup after loading the view.
- }
- override func changeColor(_ sender: Any?) {
- if pozaTestIcon.state == NSControl.StateValue.on {
- poza1.image = colorPick.changeColor(image: poza1.image!)
- pozaTestICon2.state = NSControl.StateValue.off
- // iOSBackgroundLogo = imageDockController.image
- iOSBackgroundLogo = poza1.image
- } else if pozaTestICon2.state == NSControl.StateValue.on {
- poza2.image = colorPick.changeColor(image: poza2.image!)
- pozaTestIcon.state = NSControl.StateValue.off
- iOSLogoIcon = poza2.image
- }
- if colorPickIconDock.state == NSControl.StateValue.on {
- imageDockController.image = colorPick.changeColor(image: imageDockController.image!)
- copyImageDockController = imageDockController.image
- sliderDockController.doubleValue = 100
- colorPickIconStatus.state = NSControl.StateValue.off
- // colorPickIconDock.state = NSControl.StateValue.off
- } else if colorPickIconStatus.state == NSControl.StateValue.on {
- imageStatusController.image = colorPick.changeColor(image: imageStatusController.image!)
- iOSLogoIcon = imageStatusController.image
- copyImageStatusController = imageStatusController.image
- sliderStatusController.doubleValue = 100
- colorPickIconDock.state = NSControl.StateValue.off
- //colorPickIconStatus.state = NSControl.StateValue.off
- }
- }
- override var representedObject: Any? {
- didSet {
- // print("test")
- // Update the view, if already loaded.
- }
- }
- override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
- disclosureController.state = NSControl.StateValue(0)
- iOSBackgroundLogo = poza1.image
- iOSLogoIcon = poza2.image
- }
- //override func segue
- override func cursorUpdate(with event: NSEvent) {
- print("test")
- }
- // @IBAction func menuSelectController(_ sender: NSPopUpButton) {
- // func exportButtonTrueOrFalse(_ True:Bool) {
- //
- // exportButtonDock.isHidden = !True
- // exportButtonStatus.isHidden = True
- // labelTextController1.isHidden = !True
- // labelTextController2.isHidden = True
- // imageDockController.isHidden = !True
- // imageStatusController.isHidden = True
- // sliderDockController.isHidden = !True
- // sliderStatusController.isHidden = True
- // exportButtonDockICNS.isHidden = !True
- // exportButtonStatusICNS.isHidden = True
- // sender.preferredEdge = NSRectEdge.init(rawValue: 1)!
- // }
- // if sender.indexOfSelectedItem == 0 {
- // exportButtonTrueOrFalse(true)
- // }
- // if sender.indexOfSelectedItem == 1 {
- // exportButtonTrueOrFalse(false)
- // }
- // }
- @IBAction func grayScaleImage(_ sender: NSSlider) {
- if sender == sliderDockController {
- let level = NSImage.imageBlackAndWhite(copyImageDockController)
- imageDockController.image = (copyImageDockController.copy() as! NSImage)
- imageDockController.image = level(sender.doubleValue/100)
- changeDockImage()
- } else {
- let level = NSImage.imageBlackAndWhite(copyImageStatusController)
- imageStatusController.image = (copyImageStatusController.copy() as! NSImage)
- imageStatusController.image = level(sender.doubleValue/100)
- changeStatusIconImage()
- }
- }
- @IBAction func exportImage(_ sender: NSButton) {
- if sender == exportButtonDock {
- let manager = FileManager.default
- if let tempURLDirectory:URL = URL(fileURLWithPath: NSHomeDirectory() + "/Desktop/IconsDock") {
- do {
- try manager.createDirectory(at: tempURLDirectory, withIntermediateDirectories: true)
- }catch _ {
- print("The directory couldn't be created at \(tempURLDirectory) ")
- }
- }
- let sizesArray = [16:"16.png",32:"32.png",64:"64.png",128:"128.png",256:"256.png",512:"512.png",1024:"1024.png"]
- let iconExport = ExportImage()
- let iconDirectoryURL = NSHomeDirectory() + "/Desktop/IconsDock/"
- for (itemInt,itemString) in sizesArray {
- iconExport.url(url: iconDirectoryURL + "IconDock" + itemString)
- iconExport.image = imageDockController.image
- iconExport.resize(sizeImage: itemInt)
- iconExport.export()
- }
- } else if sender == exportButtonStatus{
- let manager = FileManager.default
- if let tempURLDirectory:URL = URL(fileURLWithPath: NSHomeDirectory() + "/Desktop/IconsStatus") {
- do {
- try manager.createDirectory(at: tempURLDirectory, withIntermediateDirectories: true)
- }catch _ {
- print("The directory couldn't be created at \(tempURLDirectory) ")
- }
- }
- // var testIconSet = Iconset()
- let sizesArray = [16:"16.png",32:"32.png",128:"128.png",256:"256.png",512:"512.png",1024:"1024.png"]
- let iconExport = ExportImage()
- let iconDirectoryURL = NSHomeDirectory() + "/Desktop/IconsStatus/"
- for (itemInt,itemString) in sizesArray {
- iconExport.url(url: iconDirectoryURL + "IconStatus" + itemString)
- iconExport.image = imageStatusController.image
- iconExport.resize(sizeImage: itemInt)
- iconExport.export()
- }
- }
- }
- @IBAction func exportICNS(_ sender: NSButton) {
- // if sender == exportButtonDockICNS {
- // print("yes")
- // }
- // if sender == exportButtonStatusICNS {
- // print("no")
- // }
- // var testIconSet = Iconset()
- // let iconExportICNS = ExportImage()
- // var iconDirectoryURL = String()
- // if sender == exportButtonStatusICNS {
- // iconDirectoryURL = NSHomeDirectory() + "/Desktop/IconStatus/"
- // } else {
- // iconDirectoryURL = NSHomeDirectory() + "/Desktop/IconDock/"
- // }
- // let sizesArrayICNS = [32:"32.png",64:"64.png",128:"128.png",256:"256.png",512:"512.png",1024:"1024.png"]
- // for(itemInt,_) in sizesArrayICNS {
- // if sender == exportButtonStatusICNS {
- // iconExportICNS.image = imageStatusController.image
- // } else if sender == exportButtonDockICNS {
- // iconExportICNS.image = imageDockController.image
- // }
- // iconExportICNS.resize(sizeImage: itemInt/2)
- // let iconImage = IconImage.init(iconExportICNS.image, withSize: NSSize(width: itemInt/2, height: itemInt/2), andScale: .scale1x)
- // if sender == exportButtonStatusICNS {
- // iconExportICNS.image = imageStatusController.image
- // } else if sender == exportButtonDockICNS {
- // iconExportICNS.image = imageDockController.image
- // }
- // iconExportICNS.resize(sizeImage: itemInt)
- // let iconImage2x = IconImage.init(iconExportICNS.image, withSize: NSSize(width: itemInt, height: itemInt), andScale: .scale2x)
- // let filename1x = iconImage!.filename
- // let filename2x = iconImage2x!.filename
- //
- //
- // testIconSet[filename1x] = iconImage
- // testIconSet[filename2x] = iconImage2x
- // }
- // do {
- // try testIconSet.writeToURL(URL(fileURLWithPath: iconDirectoryURL) )
- // }catch _ {
- // print("The operation couldn't be executed")
- // }
- var icon = ""
- var url = ""
- if sender == exportButtonDockICNS {
- let manager = FileManager.default
- url = NSHomeDirectory() + "/Desktop/IconDockLogo.appiconset/"
- do {
- try manager.createDirectory(at: URL(fileURLWithPath: url), withIntermediateDirectories: true)
- }catch _ {
- print("The directory couldn't be created at \(url) ")
- }
- icon = "IconDock"
- // let manager = FileManager.default
- // if let tempURLDirectory:URL = URL(fileURLWithPath: NSHomeDirectory() + "/Desktop/IconsDock") {
- do {
- try manager.createDirectory(at: URL(fileURLWithPath: "url"), withIntermediateDirectories: true)
- }catch _ {
- print("The directory couldn't be created at \(url) ")
- }
- let sizesArray = [16:"16.png",32:"32.png",64:"64.png",128:"128.png",256:"256.png",512:"512.png",1024:"1024.png"]
- let iconExport = ExportImage()
- // let iconDirectoryURL = NSHomeDirectory() + "/Desktop/IconsDock/"
- for (itemInt,itemString) in sizesArray {
- iconExport.url(url: url + "IconDock" + itemString)
- iconExport.image = imageDockController.image
- iconExport.resize(sizeImage: itemInt)
- iconExport.export()
- }
- } else {
- let manager = FileManager.default
- url = NSHomeDirectory() + "/Desktop/IconStatusLogo.appiconset/"
- do {
- try manager.createDirectory(at: URL(fileURLWithPath: url), withIntermediateDirectories: true)
- }catch _ {
- print("The directory couldn't be created at \(url) ")
- }
- icon = "IconStatus"
- // let manager = FileManager.default
- // if let tempURLDirectory:URL = URL(fileURLWithPath: NSHomeDirectory() + "/Desktop/IconsDock") {
- do {
- try manager.createDirectory(at: URL(fileURLWithPath: "url"), withIntermediateDirectories: true)
- }catch _ {
- print("The directory couldn't be created at \(url) ")
- }
- let sizesArray = [16:"16.png",32:"32.png",64:"64.png",128:"128.png",256:"256.png",512:"512.png",1024:"1024.png"]
- let iconExport = ExportImage()
- // let iconDirectoryURL = NSHomeDirectory() + "/Desktop/IconsDock/"
- for (itemInt,itemString) in sizesArray {
- iconExport.url(url: url + "IconStatus" + itemString)
- iconExport.image = imageDockController.image
- iconExport.resize(sizeImage: itemInt)
- iconExport.export()
- }
- }
- let str = """
- {
- "images" : [
- {
- "idiom" : "mac",
- "size" : "16x16",
- "filename" : "\(icon)16.png",
- "scale" : "1x"
- },
- {
- "idiom" : "mac",
- "size" : "16x16",
- "filename" : "\(icon)32.png",
- "scale" : "2x"
- },
- {
- "idiom" : "mac",
- "size" : "32x32",
- "filename" : "\(icon)32.png",
- "scale" : "1x"
- },
- {
- "idiom" : "mac",
- "size" : "32x32",
- "filename" : "\(icon)64.png",
- "scale" : "2x"
- },
- {
- "idiom" : "mac",
- "size" : "128x128",
- "filename" : "\(icon)128.png",
- "scale" : "1x"
- },
- {
- "idiom" : "mac",
- "size" : "128x128",
- "filename" : "\(icon)256.png",
- "scale" : "2x"
- },
- {
- "size" : "256x256",
- "idiom" : "mac",
- "filename" : "\(icon)256.png",
- "scale" : "1x"
- },
- {
- "idiom" : "mac",
- "size" : "256x256",
- "filename" : "\(icon)512.png",
- "scale" : "2x"
- },
- {
- "idiom" : "mac",
- "size" : "512x512",
- "filename" : "\(icon)512.png",
- "scale" : "1x"
- },
- {
- "idiom" : "mac",
- "size" : "512x512",
- "filename" : "\(icon)1024.png",
- "scale" : "2x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
- }
- """
- let filename = URL(fileURLWithPath: "\(String(describing: url))/Contents.json")
- do {
- try str.write(to: filename, atomically: true, encoding: String.Encoding.utf8)
- } catch {
- print("Failed to write the file at \(filename)")
- }
- }
- @IBAction func whiteAndBlackBackground(_ sender: NSButton) {
- if sender.state == NSButton.StateValue.off{
- // backgroundView.bgColor = NSColor.init(white: CGFloat.init(1), alpha: CGFloat.init(0))
- // backgroundView.
- LabelTextStatus1.textColor = NSColor.black
- labelTextStatus2.textColor = NSColor.black
- labelTextStatus3.textColor = NSColor.black
- labelTextDock1.textColor = NSColor.black
- labelTextDock2.textColor = NSColor.black
- labelTextDock3.textColor = NSColor.black
- var tempIcon = colorPickIconDock.image
- tempIcon = tempIcon?.tintedImage(tempIcon!, tint: NSColor.black)
- colorPickIconDock.image = tempIcon
- colorPickIconStatus.image = tempIcon
- sender.attributedTitle = NSMutableAttributedString(string: "Black",attributes: [NSAttributedStringKey.foregroundColor: NSColor.black])
- butonel.state = NSControl.StateValue.on
- }else {
- // backgroundView.bgColor = NSColor.darkGray
- LabelTextStatus1.textColor = NSColor.lightGray
- labelTextStatus2.textColor = NSColor.lightGray
- labelTextStatus3.textColor = NSColor.lightGray
- labelTextDock1.textColor = NSColor.lightGray
- labelTextDock2.textColor = NSColor.lightGray
- labelTextDock3.textColor = NSColor.lightGray
- var tempIcon = colorPickIconDock.image
- tempIcon = tempIcon?.tintedImage(tempIcon!, tint: NSColor.lightGray)
- colorPickIconDock.image = tempIcon
- colorPickIconStatus.image = tempIcon
- butonel.state = NSControl.StateValue.off
- //
- // sender.attributedTitle = NSMutableAttributedString(string: "Black",attributes: [NSAttributedStringKey.foregroundColor: NSColor.lightGray])
- }
- }
- func changeDockImage(){
- var dockIcon:NSImage = imageDockController.image!.copy() as! NSImage
- dockIcon = dockIcon.resize(image: dockIcon, w: 256, h: 256)
- // dockIcon.size.height = 256
- // dockIcon.size.width = 256
- NSApp.applicationIconImage = dockIcon
- }
- func changeStatusIconImage(){
- let statusIconImage:NSImage = imageStatusController.image!.copy() as! NSImage
- statusIconImage.size.width = 32
- statusIconImage.size.height = 32
- statusController.image = statusIconImage
- statusController.initFunc()
- statusController.image = statusIconImage
- }
- @IBAction func getInfoImage(_ sender: NSImageView) {
- if sender == imageDockController {
- sliderDockController.doubleValue = 100
- sliderDockController.isHidden = false
- copyImageDockController = sender.image
- changeDockImage()
- iOSBackgroundLogo = imageDockController.image
- }else {
- // LabelTextStatus1.isHidden = true
- sliderStatusController.doubleValue = 100
- sliderStatusController.isHidden = false
- copyImageStatusController = sender.image
- changeStatusIconImage()
- iOSLogoIcon = imageStatusController.image
- }
- }
- func convertCIImageToNSImage(image: CIImage) -> NSImage {
- // let rep = NSCIImageRep(CIImage: image)
- let rep = NSCIImageRep(ciImage: image)
- let nsImage = NSImage(size: image.extent.size)
- nsImage.addRepresentation(rep)
- return nsImage
- }
- func convertNSimageToCIImage(image: NSImage) -> CIImage {
- // let monalisa = NSImage(named: NSImage.Name(rawValue: "monalisa.jpg"))!
- let tiffData = image.tiffRepresentation!
- let bitmap = NSBitmapImageRep(data: tiffData)
- return CIImage(bitmapImageRep: bitmap!)!
- }
- func filter(name: String, inputImage: CIImage) -> CIImage {
- let filter = CIFilter(name: name)
- filter?.setDefaults()
- filter?.setValue(inputImage, forKey: kCIInputImageKey)
- // configure(filter!)
- return filter!.outputImage!
- }
- @IBAction func colorPickInit(_ sender: NSButton) {
- colorPick.initFunc()
- if sender == colorPickIconDock {
- colorPickIconDock.state = NSControl.StateValue.on
- colorPickIconStatus.state = NSControl.StateValue.off
- } else {
- colorPickIconStatus.state = NSControl.StateValue.on
- colorPickIconDock.state = NSControl.StateValue.off
- }
- test()
- let dataOfView = view.dataWithPDF(inside: view.bounds)
- let imageOfView = NSImage(data: dataOfView)
- imageOfView?.writePNG(toURL: URL(fileURLWithPath: NSHomeDirectory() + "/Desktop/testingView.png"))
- }
- func test () {
- // NSGraphicsContext.current.
- // imageDockController.image?.draw(in: imageStatusController.bounds)
- // NSGraphicsContext.current
- NSGraphicsContext.initialize()
- NSGraphicsContext.init()
- if NSGraphicsContext.currentContextDrawingToScreen() {
- print("yes")
- } else {
- print("no")
- }
- var test = copyImageDockController.representations
- print(type(of:test))
- var integer = 0
- for _ in test {
- integer += 1
- // print(index)
- }
- print(integer)
- imageDockController.image?.drawRepresentation(test[0], in: imageDockController.bounds)
- // NSDrawDarkBezel(NSRect.init(x: 0, y: 0, width: 100, height: 100), NSZeroRect)
- // imageDockController.image?.draw(at: NSPoint.init(x: 100, y: 100), from: NSZeroRect, operation: NSCompositingOperation.sourceAtop, fraction: CGFloat.init(1))
- // changeDockImage()
- changeStatusIconImage()
- }
- @IBAction func combineImage(_ sender: NSButton) {
- let img1 = convertNSimageToCIImage(image: imageDockController.image!)
- let img2 = convertNSimageToCIImage(image: imageStatusController.image!)
- let filter = CIFilter(name: "CIAdditionCompositing")!
- filter.setDefaults()
- // filter.setValue(img1, forKey: "inputImage")
- filter.setValuesForKeys(["inputImage":img1])//,kCIInputWidthKey:img1])
- filter.setValue(img2, forKey: "inputBackgroundImage")
- let resultImage = filter.outputImage
- let rep = NSCIImageRep(ciImage: resultImage!)
- let finalResult = NSImage(size: rep.size)
- finalResult.addRepresentation(rep)
- finalResult.writePNG(toURL: URL(fileURLWithPath: NSHomeDirectory() + "/Desktop/combined.png"))
- }
- @IBOutlet weak var poza1: NSImageView!
- @IBOutlet weak var poza2: NSImageView!
- @IBOutlet weak var pozaTestIcon: NSButton!
- @IBOutlet weak var pozaTestICon2: NSButton!
- @IBAction func pozaTestIcon(_ sender: NSButton) {
- colorPick.initFunc()
- colorPick.initFunc()
- if sender == pozaTestIcon {
- pozaTestIcon.state = NSControl.StateValue.on
- pozaTestICon2.state = NSControl.StateValue.off
- } else {
- pozaTestICon2.state = NSControl.StateValue.on
- pozaTestIcon.state = NSControl.StateValue.off
- }
- }
- }
- // sender.attributedTitle = NSMutableAttributedString(string: "Hello World", attributes: [NSAttributedStringKey.foregroundColor: NSColor.black, NSAttributedStringKey.paragraphStyle: NSParagraphStyle.default, NSAttributedStringKey.font: NSFont.systemFont(ofSize: 18)])d
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement