From 0a3a73c1a5890cf7f3b21cdf688fda4336132cc9 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Sat, 10 May 2025 12:13:46 +0200 Subject: [PATCH 01/42] updated --- .../Example/TableSidebarViewController.swift | 2 +- .../NSCollectionView+DragSessionMove.swift | 19 ++++++++----------- .../NSTableView+DragSessionMove.swift | 15 ++++++++------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/Example/Example/TableSidebarViewController.swift b/Example/Example/TableSidebarViewController.swift index 9edfdcfb..a0c1c8d2 100644 --- a/Example/Example/TableSidebarViewController.swift +++ b/Example/Example/TableSidebarViewController.swift @@ -16,7 +16,7 @@ class TableSidebarViewController: NSViewController { @IBOutlet var tableView: NSTableView! lazy var dataSource = DataSource(tableView: tableView, cellRegistration: cellRegistration) - + let cellRegistration = CellRegistration { tableCell, _, _, sidebarItem in /// `defaultContentConfiguration` returns a table cell content configuration with default styling based on the table view it's displayed at (in this case a sidebar table). var configuration = tableCell.defaultContentConfiguration() diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+DragSessionMove.swift b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+DragSessionMove.swift index 35a56b6b..bd6e981c 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+DragSessionMove.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+DragSessionMove.swift @@ -15,22 +15,19 @@ extension NSCollectionView { setAssociatedValue(newValue, key: "draggingSessionMoveHandler") let selector = #selector(NSCollectionView.draggingSession(_:movedTo:)) if newValue != nil { - guard !isMethodReplaced(selector) else { return } + guard !isMethodHooked(selector) else { return } do { - try replaceMethod( - selector, - methodSignature: (@convention(c) (AnyObject, Selector, NSDraggingSession, CGPoint) -> ()).self, - hookSignature: (@convention(block) (AnyObject, NSDraggingSession, CGPoint) -> ()).self) { store in { - object, session, point in - (object as? NSCollectionView)?.draggingSessionMoveHandler?(session, point) - store.original(object, selector, session, point) - } - } + try hook(selector, closure: { original, object, sel, session, point in + (object as? NSCollectionView)?.draggingSessionMoveHandler?(session, point) + original(object, sel, session, point) + } as @convention(block) ( + (AnyObject, Selector, NSDraggingSession, CGPoint) -> Void, + AnyObject, Selector, NSDraggingSession, CGPoint) -> Void) } catch { debugPrint(error) } } else { - resetMethod(selector) + revertHooks(for: selector) } } } diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+DragSessionMove.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+DragSessionMove.swift index 76131f61..6e6948b3 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+DragSessionMove.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+DragSessionMove.swift @@ -14,15 +14,15 @@ extension NSTableView { set { setAssociatedValue(newValue, key: "draggingSessionMoveHandler") let selector = #selector(NSTableView.draggingSession(_:movedTo:)) - if newValue != nil, !isMethodReplaced(selector) { + if newValue != nil, !isMethodReplaced(selector), !isMethodHooked(selector) { do { if responds(to: selector) { - try replaceMethod(selector, - methodSignature: (@convention(c) (AnyObject, Selector, NSDraggingSession, CGPoint) -> ()).self, - hookSignature: (@convention(block) (AnyObject, NSDraggingSession, CGPoint) -> ()).self) { store in { object, session, point in - (object as? NSTableView)?.draggingSessionMovedHandler?(session, point) - store.original(object, selector, session, point) - } } + try hook(selector, closure: { original, object, sel, session, point in + (object as? NSTableView)?.draggingSessionMovedHandler?(session, point) + original(object, sel, session, point) + } as @convention(block) ( + (AnyObject, Selector, NSDraggingSession, CGPoint) -> Void, + AnyObject, Selector, NSDraggingSession, CGPoint) -> Void) } else { try addMethod(selector, methodSignature: (@convention(block) (AnyObject, NSDraggingSession, CGPoint) -> ()).self) { object, session, point in @@ -34,6 +34,7 @@ extension NSTableView { } } else if newValue == nil { resetMethod(selector) + revertHooks(for: selector) } } } From 5e2869feff365ff97aa1211b49508a5ee15709e4 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Sat, 10 May 2025 16:20:43 +0200 Subject: [PATCH 02/42] Update NSTableView+DragSessionMove.swift --- .../Extensions/NSTableView/NSTableView+DragSessionMove.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+DragSessionMove.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+DragSessionMove.swift index 6e6948b3..b102d0ad 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+DragSessionMove.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+DragSessionMove.swift @@ -8,6 +8,7 @@ import AppKit import FZSwiftUtils +/* extension NSTableView { var draggingSessionMovedHandler: ((NSDraggingSession, CGPoint)->())? { get { getAssociatedValue("draggingSessionMoveHandler") } @@ -39,3 +40,4 @@ extension NSTableView { } } } +*/ From f85b1c2ccc921dab26d278ccb8e0336fa0e98c09 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Sun, 1 Jun 2025 01:38:30 +0200 Subject: [PATCH 03/42] updated --- .../CollectionViewDiffableDataSource.swift | 25 +++++++++++++++++++ .../OutlineViewDiffableDataSource.swift | 21 ++++++++++++++++ .../TableViewDiffableDataSource.swift | 21 ++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift index c321afe4..4dfed5c1 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift @@ -129,6 +129,31 @@ open class CollectionViewDiffableDataSource())? { + didSet { + if doubleClickGesture != nil, doubleClickGesture == nil { + doubleClickGesture = .init(target: self, action: #selector(didDoubleClick(_:))) + doubleClickGesture?.numberOfClicksRequired = 2 + collectionView?.addGestureRecognizer(doubleClickGesture!) + } else if doubleClickGesture == nil, let gesture = doubleClickGesture { + collectionView?.removeGestureRecognizer(gesture) + doubleClickGesture = nil + } + } + } + + var doubleClickGesture: NSClickGestureRecognizer? + + @objc func didDoubleClick(_ gesture: NSClickGestureRecognizer) { + guard let collectionView = collectionView else { return } + if let indexPath = collectionView.indexPathForItem(at: gesture.location(in: collectionView)) { + doubleClickHandler?(element(for: indexPath)) + } else { + doubleClickHandler?(nil) + } + } + func item(for element: Element) -> NSCollectionViewItem? { guard let indexPath = indexPath(for: element) else { return nil } return collectionView.item(at: indexPath) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift index 1c789c3e..923cb670 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift @@ -177,6 +177,27 @@ public class OutlineViewDiffableDataSource: NSObje } } + /// The handler that gets called when the table view gets double clicked. + open var doubleClickHandler: ((_ item: ItemIdentifierType?)->())? { + didSet { + if doubleClickGesture != nil, doubleClickGesture == nil { + doubleClickGesture = .init(target: self, action: #selector(didDoubleClick(_:))) + doubleClickGesture?.numberOfClicksRequired = 2 + outlineView?.addGestureRecognizer(doubleClickGesture!) + } else if doubleClickGesture == nil, let gesture = doubleClickGesture { + outlineView?.removeGestureRecognizer(gesture) + doubleClickGesture = nil + } + } + } + + var doubleClickGesture: NSClickGestureRecognizer? + + @objc func didDoubleClick(_ gesture: NSClickGestureRecognizer) { + guard let outlineView = outlineView else { return } + doubleClickHandler?(item(forRow: outlineView.selectedRow)) + } + /// The handlers for selecting items. open var selectionHandlers = SelectionHandlers() diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 74e71783..5e98d71b 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -211,6 +211,27 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData /// Provides an array of row actions to be attached to the specified edge of a table row and displayed when the user swipes horizontally across the row. open var rowActionProvider: ((_ item: Item, _ edge: NSTableView.RowActionEdge) -> [NSTableViewRowAction])? = nil + /// The handler that gets called when the table view gets double clicked. + open var doubleClickHandler: ((_ item: Item?)->())? { + didSet { + if doubleClickGesture != nil, doubleClickGesture == nil { + doubleClickGesture = .init(target: self, action: #selector(didDoubleClick(_:))) + doubleClickGesture?.numberOfClicksRequired = 2 + tableView?.addGestureRecognizer(doubleClickGesture!) + } else if doubleClickGesture == nil, let gesture = doubleClickGesture { + tableView?.removeGestureRecognizer(gesture) + doubleClickGesture = nil + } + } + } + + var doubleClickGesture: NSClickGestureRecognizer? + + @objc func didDoubleClick(_ gesture: NSClickGestureRecognizer) { + guard let tableView = tableView else { return } + doubleClickHandler?(item(forRow: tableView.selectedRow)) + } + /** The default animation the UI uses to show differences between rows. From ddbc1c9ed19a09cc0a289594744732f753ae4fef Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Sun, 1 Jun 2025 04:22:30 +0200 Subject: [PATCH 04/42] Update EmptyView.swift --- .../DiffableDataSource/Shared/EmptyView.swift | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift index 44b7761f..f4879f1b 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift @@ -11,47 +11,40 @@ import FZUIKit /// View that is displayed if a table or collection view is empty. class EmptyView: NSView { - var contentView: (NSView & NSContentView)? var view: NSView? { didSet { guard oldValue != view else { return } + oldValue?.removeFromSuperview() if let view = view { - contentView?.removeFromSuperview() - contentView = nil view.frame.size = bounds.size addSubview(view) } } } - public var configuration: NSContentConfiguration? { - get { contentView?.configuration } + var configuration: NSContentConfiguration? { + get { (view as? NSContentView)?.configuration } set { if let newValue = newValue { - view?.removeFromSuperview() - view = nil - if contentView?.supports(newValue) == true { - contentView?.configuration = newValue + if let view = view as? NSContentView, view.supports(newValue) { + view.configuration = newValue } else { - contentView?.removeFromSuperview() - contentView = newValue.makeContentView() - contentView?.frame.size = bounds.size - addSubview(contentView!) + view = newValue.makeContentView() } + } else { + view = nil } } } public init(view: NSView) { - self.view = view super.init(frame: .zero) - addSubview(view) + defer { self.view = view } } public init(configuration: NSContentConfiguration) { - self.contentView = configuration.makeContentView() super.init(frame: .zero) - addSubview(contentView!) + defer { self.configuration = configuration } } required init?(coder: NSCoder) { @@ -60,7 +53,6 @@ class EmptyView: NSView { override func layout() { super.layout() - contentView?.frame.size = bounds.size view?.frame.size = bounds.size } } From 8e2ce93f559895e367378eaeb4ebb15b456c1cde Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Sun, 1 Jun 2025 10:23:58 +0200 Subject: [PATCH 05/42] Update TableViewDiffableDataSource.swift --- .../NSTableView/TableViewDiffableDataSource.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 5e98d71b..36b589e1 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -217,6 +217,8 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData if doubleClickGesture != nil, doubleClickGesture == nil { doubleClickGesture = .init(target: self, action: #selector(didDoubleClick(_:))) doubleClickGesture?.numberOfClicksRequired = 2 + doubleClickGesture?.delaysPrimaryMouseButtonEvents = false + doubleClickGesture?.delaysSecondaryMouseButtonEvents = false tableView?.addGestureRecognizer(doubleClickGesture!) } else if doubleClickGesture == nil, let gesture = doubleClickGesture { tableView?.removeGestureRecognizer(gesture) From 5eb6321b49fd4791676918b3802420688b3f10ad Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Sun, 1 Jun 2025 10:57:28 +0200 Subject: [PATCH 06/42] updated --- .../CollectionViewDiffableDataSource.swift | 28 ++++++++----------- .../OutlineViewDiffableDataSource.swift | 20 ++++++------- .../TableViewDiffableDataSource.swift | 22 ++++++--------- 3 files changed, 28 insertions(+), 42 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift index 4dfed5c1..453fc2ac 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift @@ -132,27 +132,23 @@ open class CollectionViewDiffableDataSource())? { didSet { - if doubleClickGesture != nil, doubleClickGesture == nil { - doubleClickGesture = .init(target: self, action: #selector(didDoubleClick(_:))) - doubleClickGesture?.numberOfClicksRequired = 2 + doubleClickGesture?.removeFromView() + doubleClickGesture = nil + if let handler = doubleClickHandler { + doubleClickGesture = .init { [weak self] gesture in + guard let self = self, let collectionView = self.collectionView else { return } + if let indexPath = collectionView.indexPathForItem(at: gesture.location(in: collectionView)) { + handler(element(for: indexPath)) + } else { + handler(nil) + } + } collectionView?.addGestureRecognizer(doubleClickGesture!) - } else if doubleClickGesture == nil, let gesture = doubleClickGesture { - collectionView?.removeGestureRecognizer(gesture) - doubleClickGesture = nil } } } - var doubleClickGesture: NSClickGestureRecognizer? - - @objc func didDoubleClick(_ gesture: NSClickGestureRecognizer) { - guard let collectionView = collectionView else { return } - if let indexPath = collectionView.indexPathForItem(at: gesture.location(in: collectionView)) { - doubleClickHandler?(element(for: indexPath)) - } else { - doubleClickHandler?(nil) - } - } + var doubleClickGesture: DoubleClickGestureRecognizer? func item(for element: Element) -> NSCollectionViewItem? { guard let indexPath = indexPath(for: element) else { return nil } diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift index 923cb670..a47d75e4 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift @@ -180,23 +180,19 @@ public class OutlineViewDiffableDataSource: NSObje /// The handler that gets called when the table view gets double clicked. open var doubleClickHandler: ((_ item: ItemIdentifierType?)->())? { didSet { - if doubleClickGesture != nil, doubleClickGesture == nil { - doubleClickGesture = .init(target: self, action: #selector(didDoubleClick(_:))) - doubleClickGesture?.numberOfClicksRequired = 2 + doubleClickGesture?.removeFromView() + doubleClickGesture = nil + if let handler = doubleClickHandler { + doubleClickGesture = .init { [weak self] gesture in + guard let self = self, let outlineView = self.outlineView else { return } + handler(self.item(forRow: outlineView.selectedRow)) + } outlineView?.addGestureRecognizer(doubleClickGesture!) - } else if doubleClickGesture == nil, let gesture = doubleClickGesture { - outlineView?.removeGestureRecognizer(gesture) - doubleClickGesture = nil } } } - var doubleClickGesture: NSClickGestureRecognizer? - - @objc func didDoubleClick(_ gesture: NSClickGestureRecognizer) { - guard let outlineView = outlineView else { return } - doubleClickHandler?(item(forRow: outlineView.selectedRow)) - } + var doubleClickGesture: DoubleClickGestureRecognizer? /// The handlers for selecting items. open var selectionHandlers = SelectionHandlers() diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 36b589e1..5caaed4e 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -214,25 +214,19 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData /// The handler that gets called when the table view gets double clicked. open var doubleClickHandler: ((_ item: Item?)->())? { didSet { - if doubleClickGesture != nil, doubleClickGesture == nil { - doubleClickGesture = .init(target: self, action: #selector(didDoubleClick(_:))) - doubleClickGesture?.numberOfClicksRequired = 2 - doubleClickGesture?.delaysPrimaryMouseButtonEvents = false - doubleClickGesture?.delaysSecondaryMouseButtonEvents = false + doubleClickGesture?.removeFromView() + doubleClickGesture = nil + if let handler = doubleClickHandler { + doubleClickGesture = .init { [weak self] gesture in + guard let self = self, let tableView = self.tableView else { return } + handler(self.item(forRow: tableView.selectedRow)) + } tableView?.addGestureRecognizer(doubleClickGesture!) - } else if doubleClickGesture == nil, let gesture = doubleClickGesture { - tableView?.removeGestureRecognizer(gesture) - doubleClickGesture = nil } } } - var doubleClickGesture: NSClickGestureRecognizer? - - @objc func didDoubleClick(_ gesture: NSClickGestureRecognizer) { - guard let tableView = tableView else { return } - doubleClickHandler?(item(forRow: tableView.selectedRow)) - } + var doubleClickGesture: DoubleClickGestureRecognizer? /** The default animation the UI uses to show differences between rows. From d603a0d007bd2e5c31e7aa27ae47ee7e8699a7c8 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Mon, 2 Jun 2025 03:14:37 +0200 Subject: [PATCH 07/42] Update OutlineViewDiffableDataSource.swift --- .../NSOutlineView/OutlineViewDiffableDataSource.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift index a47d75e4..f4b2a944 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift @@ -177,7 +177,7 @@ public class OutlineViewDiffableDataSource: NSObje } } - /// The handler that gets called when the table view gets double clicked. + /// The handler that gets called when the outline view gets double clicked. open var doubleClickHandler: ((_ item: ItemIdentifierType?)->())? { didSet { doubleClickGesture?.removeFromView() From 0f430e16746853a221b3c66e7d929e6ee1eeec6e Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Mon, 2 Jun 2025 10:26:53 +0200 Subject: [PATCH 08/42] updated --- .../xcshareddata/swiftpm/Package.resolved | 6 +- .../OutlineSidebarViewController.swift | 4 - ...tlineViewDiffableDataSource+Delegate.swift | 26 +-- .../OutlineViewDiffableDataSource.swift | 213 ++++++++++-------- .../Snapshot/OutlineChangeInstruction.swift | 4 +- ...eViewDiffableDataSourceSnapshot+Node.swift | 26 +-- ...utlineViewDiffableDataSourceSnapshot.swift | 116 +++++----- ...ineViewDiffableDataSourceTransaction.swift | 10 +- .../Extensions/Shared/NSView+Transform.swift | 4 +- 9 files changed, 211 insertions(+), 198 deletions(-) diff --git a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8dd12466..8a9aa3f1 100644 --- a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -7,7 +7,7 @@ "location" : "https://github.com/flocked/FZQuicklook.git", "state" : { "branch" : "main", - "revision" : "3396e2ab349a7ec8e7e8067e476473db5bb235ff" + "revision" : "835a344797c7b7bf4dbf98d77dd60a7cb6d4c7cf" } }, { @@ -16,7 +16,7 @@ "location" : "https://github.com/flocked/FZSwiftUtils.git", "state" : { "branch" : "main", - "revision" : "d062df0a7350c11d4f610a979f060612dc2966f5" + "revision" : "5af861b31f0128f4edf2bb4ae5e8868345631f71" } }, { @@ -25,7 +25,7 @@ "location" : "https://github.com/flocked/FZUIKit.git", "state" : { "branch" : "main", - "revision" : "b7587758799644fec18437527526b5f964a8900e" + "revision" : "2524cf36f5a2174a3ae51ce413b940a7d040961c" } } ], diff --git a/Example/Example/OutlineSidebarViewController.swift b/Example/Example/OutlineSidebarViewController.swift index fd098325..a98f9d97 100644 --- a/Example/Example/OutlineSidebarViewController.swift +++ b/Example/Example/OutlineSidebarViewController.swift @@ -51,10 +51,6 @@ class OutlineSidebarViewController: NSViewController { } dataSource.apply(snapshot, .withoutAnimation) dataSource.expand(rootItems) - - snapshot.nonCollapsableItems = [rootItems[0], rootItems[1]] - snapshot.nonCollapsableItems = [rootItems[2]] - Swift.print(snapshot.nonCollapsableItems.count, snapshot.nonCollapsableItems) } @IBAction func segmentedPressed(_ segmentedControl: NSSegmentedControl) { diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource+Delegate.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource+Delegate.swift index 4b55c72c..54030e87 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource+Delegate.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource+Delegate.swift @@ -12,19 +12,19 @@ import FZSwiftUtils extension OutlineViewDiffableDataSource { class Delegate: NSObject, NSOutlineViewDelegate { weak var dataSource: OutlineViewDiffableDataSource! - var previousSelectedItems: [ItemIdentifierType] = [] + var previousSelectedItems: [Item] = [] func outlineView(_ outlineView: NSOutlineView, selectionIndexesForProposedSelection proposedSelectionIndexes: IndexSet) -> IndexSet { - previousSelectedItems = outlineView.selectedRowIndexes.compactMap({ outlineView.item(atRow: $0) as? ItemIdentifierType }) + previousSelectedItems = outlineView.selectedRowIndexes.compactMap({ outlineView.item(atRow: $0) as? Item }) let diff = outlineView.selectedRowIndexes.difference(to: proposedSelectionIndexes) - var selected = diff.added.compactMap({ outlineView.item(atRow: $0) as? ItemIdentifierType }) + var selected = diff.added.compactMap({ outlineView.item(atRow: $0) as? Item }) selected = selected.filter({ !self.outlineView(outlineView, isGroupItem: $0) }) if !selected.isEmpty { selected = dataSource.selectionHandlers.shouldSelect?(selected) ?? selected } - var deselected = diff.removed.compactMap({ outlineView.item(atRow: $0) as? ItemIdentifierType }) + var deselected = diff.removed.compactMap({ outlineView.item(atRow: $0) as? Item }) if !deselected.isEmpty { let should = dataSource.selectionHandlers.shouldDeselect?(deselected) ?? deselected selected += deselected.filter({ !should.contains($0) }) @@ -59,7 +59,7 @@ extension OutlineViewDiffableDataSource { let rowView = outlineView.makeView(withIdentifier: "_GroupRowView", owner: self) as? NSTableRowView ?? NSTableRowView() rowView.identifier = "_GroupRowView" return rowView - } else if let view = dataSource.rowViewProvider?(outlineView, dataSource.row(for: item as! ItemIdentifierType)!, item as! ItemIdentifierType) { + } else if let view = dataSource.rowViewProvider?(outlineView, dataSource.row(for: item as! Item)!, item as! Item) { return view } else { let rowView = outlineView.makeView(withIdentifier: "_RowView", owner: self) as? NSTableRowView ?? NSTableRowView() @@ -70,22 +70,22 @@ extension OutlineViewDiffableDataSource { func outlineView(_ outlineView: NSOutlineView, shouldExpandItem item: Any) -> Bool { guard !dataSource.isApplyingSnapshot else { return true } - return dataSource.expanionHandlers.shouldExpand?(item as! ItemIdentifierType) ?? true + return dataSource.expanionHandlers.shouldExpand?(item as! Item) ?? true } func outlineView(_ outlineView: NSOutlineView, shouldCollapseItem item: Any) -> Bool { guard !dataSource.isApplyingSnapshot else { return true } - return dataSource.expanionHandlers.shouldCollapse?(item as! ItemIdentifierType) ?? true + return dataSource.expanionHandlers.shouldCollapse?(item as! Item) ?? true } func outlineViewItemDidExpand(_ notification: Notification) { - guard !dataSource.isApplyingSnapshot, let item = notification.userInfo?["NSObject"] as? ItemIdentifierType else { return } + guard !dataSource.isApplyingSnapshot, let item = notification.userInfo?["NSObject"] as? Item else { return } dataSource.expanionHandlers.didExpand?(item) dataSource.currentSnapshot.expand([item]) } func outlineViewItemDidCollapse(_ notification: Notification) { - guard !dataSource.isApplyingSnapshot, let item = notification.userInfo?["NSObject"] as? ItemIdentifierType else { return } + guard !dataSource.isApplyingSnapshot, let item = notification.userInfo?["NSObject"] as? Item else { return } dataSource.expanionHandlers.didCollapse?(item) dataSource.currentSnapshot.collapse([item]) } @@ -126,11 +126,11 @@ extension OutlineViewDiffableDataSource { let rowView = outlineView.makeView(withIdentifier: "_GroupCellRowView", owner: self) as? GroupItemCellRowView ?? GroupItemCellRowView() rowView.identifier = "_GroupCellRowView" NSAnimationContext.runNonAnimated { - rowView.view = groupItemCellProvider(outlineView, item as! ItemIdentifierType) + rowView.view = groupItemCellProvider(outlineView, item as! Item) } return rowView } else { - return dataSource.cellProvider(outlineView, tableColumn!, item as! ItemIdentifierType) + return dataSource.cellProvider(outlineView, tableColumn!, item as! Item) } } @@ -142,12 +142,12 @@ extension OutlineViewDiffableDataSource { } func outlineView(_ outlineView: NSOutlineView, isGroupItem item: Any) -> Bool { - guard let item = item as? ItemIdentifierType, dataSource.groupItemCellProvider != nil else { return false } + guard let item = item as? Item, dataSource.groupItemCellProvider != nil else { return false } return dataSource.currentSnapshot.rootItems.contains(item) } func outlineView(_ outlineView: NSOutlineView, tintConfigurationForItem item: Any) -> NSTintConfiguration? { - guard let item = item as? ItemIdentifierType else { return nil } + guard let item = item as? Item else { return nil } return dataSource.tintConfigurationProvider?(item) } diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift index f4b2a944..db467ae2 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift @@ -38,16 +38,16 @@ import FZSwiftUtils - Note: Each of your items must have unique identifiers. */ -public class OutlineViewDiffableDataSource: NSObject, NSOutlineViewDataSource { +public class OutlineViewDiffableDataSource: NSObject, NSOutlineViewDataSource { weak var outlineView: NSOutlineView! - var currentSnapshot = OutlineViewDiffableDataSourceSnapshot() + var currentSnapshot = OutlineViewDiffableDataSourceSnapshot() let cellProvider: CellProvider var keyDownMonitor: NSEvent.Monitor? var hoveredRowObserver: KeyValueObservation? var delegate: Delegate! - var draggedItems: [ItemIdentifierType] = [] - var draggedParent: ItemIdentifierType? + var draggedItems: [Item] = [] + var draggedParent: Item? var draggedIndexes: [Int] = [] var canDrop = false var isApplyingSnapshot = false @@ -66,10 +66,10 @@ public class OutlineViewDiffableDataSource: NSObje - Returns: A configured row view object. */ - public typealias RowViewProvider = (_ outlineView: NSOutlineView, _ row: Int, _ item: ItemIdentifierType) -> NSTableRowView + public typealias RowViewProvider = (_ outlineView: NSOutlineView, _ row: Int, _ item: Item) -> NSTableRowView /// Applies the specified row view registration to configure and return the outline view’s rows views. - open func applyRowViewRegistration(_ registration: NSTableView.RowRegistration) { + open func applyRowViewRegistration(_ registration: NSTableView.RowRegistration) { rowViewProvider = { tableView, row, item in registration.makeView(tableView, row, item) } @@ -89,7 +89,7 @@ public class OutlineViewDiffableDataSource: NSObje To use group items, enable group items in the snapshot you apply, by setting ``OutlineViewDiffableDataSourceSnapshot/groupItems`` `isEnabled` to `true`. */ - open func applyGroupItemCellRegistration(_ registration: NSTableView.CellRegistration) { + open func applyGroupItemCellRegistration(_ registration: NSTableView.CellRegistration) { groupItemCellProvider = { outlineView, item in outlineView.makeCellView(using:registration, forColumn: self.groupRowTableColumn, row: 0, item: item)! } @@ -118,7 +118,7 @@ public class OutlineViewDiffableDataSource: NSObje - Returns: A configured cell view object. */ - public typealias GroupItemCellProvider = (_ outlineView: NSOutlineView, _ identifier: ItemIdentifierType) -> NSView + public typealias GroupItemCellProvider = (_ outlineView: NSOutlineView, _ identifier: Item) -> NSView /** @@ -131,7 +131,7 @@ public class OutlineViewDiffableDataSource: NSObje - else if right-click on a **non-selected item**, that item, - else an empty array. */ - open var menuProvider: ((_ items: [ItemIdentifierType]) -> NSMenu?)? = nil { + open var menuProvider: ((_ items: [Item]) -> NSMenu?)? = nil { didSet { if menuProvider != nil { outlineView.menuProvider = { [weak self] location in @@ -149,7 +149,7 @@ public class OutlineViewDiffableDataSource: NSObje The provided tint configuration is used to customize an item’s tinting behavior. */ - open var tintConfigurationProvider: ((_ item: ItemIdentifierType) -> NSTintConfiguration?)? = nil { + open var tintConfigurationProvider: ((_ item: Item) -> NSTintConfiguration?)? = nil { didSet { guard (oldValue == nil && tintConfigurationProvider != nil) || (oldValue != nil && tintConfigurationProvider == nil) else { return } outlineView.reloadData() @@ -164,7 +164,7 @@ public class OutlineViewDiffableDataSource: NSObje - else if right-click on a **non-selected item**, that item, - else an empty array. */ - open var rightClickHandler: ((_ items: [ItemIdentifierType]) -> ())? = nil { + open var rightClickHandler: ((_ items: [Item]) -> ())? = nil { didSet { if rightClickHandler != nil { outlineView.mouseHandlers.rightDown = { [weak self] event in @@ -178,7 +178,7 @@ public class OutlineViewDiffableDataSource: NSObje } /// The handler that gets called when the outline view gets double clicked. - open var doubleClickHandler: ((_ item: ItemIdentifierType?)->())? { + open var doubleClickHandler: ((_ item: Item?)->())? { didSet { doubleClickGesture?.removeFromView() doubleClickGesture = nil @@ -373,11 +373,11 @@ public class OutlineViewDiffableDataSource: NSObje } /// All current items in the outline view. - open var items: [ItemIdentifierType] { currentSnapshot.items } + open var items: [Item] { currentSnapshot.items } /// The selected items. - open var selectedItems: [ItemIdentifierType] { - get { outlineView.selectedItems as! [ItemIdentifierType] } + open var selectedItems: [Item] { + get { outlineView.selectedItems as! [Item] } set { guard newValue != selectedItems else { return } selectItems(newValue) @@ -385,12 +385,12 @@ public class OutlineViewDiffableDataSource: NSObje } /// Returns the item at the specified row in the outline view. - open func item(forRow row: Int) -> ItemIdentifierType? { - outlineView.item(atRow: row) as? ItemIdentifierType + open func item(forRow row: Int) -> Item? { + outlineView.item(atRow: row) as? Item } /// Returns the row for the specified item. - open func row(for item: ItemIdentifierType) -> Int? { + open func row(for item: Item) -> Int? { outlineView.row(forItem: item) } @@ -400,7 +400,7 @@ public class OutlineViewDiffableDataSource: NSObje - Parameter point: The point in in the outline view. - Returns: The item at the point or `nil` if there isn't any item. */ - open func item(at point: CGPoint) -> ItemIdentifierType? { + open func item(at point: CGPoint) -> Item? { let row = outlineView.row(at: point) if row != -1 { return item(forRow: row) @@ -408,9 +408,9 @@ public class OutlineViewDiffableDataSource: NSObje return nil } - func items(for location: CGPoint) -> [ItemIdentifierType] { + func items(for location: CGPoint) -> [Item] { if let item = item(at: location) { - var items: [ItemIdentifierType] = [item] + var items: [Item] = [item] let selectedItems = selectedItems if selectedItems.contains(item) { items = selectedItems @@ -421,25 +421,25 @@ public class OutlineViewDiffableDataSource: NSObje } /// Selects all specified items. - open func selectItems(_ items: [ItemIdentifierType], byExtendingSelection: Bool = false) { + open func selectItems(_ items: [Item], byExtendingSelection: Bool = false) { let rows = IndexSet(items.compactMap{row(for: $0)}) outlineView.selectRowIndexes(rows, byExtendingSelection: byExtendingSelection) } /// Deselects all specified items. - open func deselectItems(_ items: [ItemIdentifierType]) { + open func deselectItems(_ items: [Item]) { items.compactMap{row(for: $0)}.forEach { outlineView.deselectRow($0) } } /// Scrolls the outline view to the specified item. - open func scrollToItem(_ item: ItemIdentifierType) { + open func scrollToItem(_ item: Item) { if let row = row(for: item) { outlineView.scrollRowToVisible(row) } } /// Reloads the outline view cells for the specified items. - open func reloadItems(_ items: [ItemIdentifierType], reloadChildren: Bool = false, animated: Bool = false) { + open func reloadItems(_ items: [Item], reloadChildren: Bool = false, animated: Bool = false) { if animated { NSView.animate { items.forEach({ self.outlineView.animator().reloadItem($0, reloadChildren: reloadChildren) }) @@ -450,13 +450,13 @@ public class OutlineViewDiffableDataSource: NSObje } /// Updates the data for the specified items, preserving the existing outline view cells for the items. - open func reconfigureItems(_ items: [ItemIdentifierType]) { + open func reconfigureItems(_ items: [Item]) { let rows = IndexSet(items.compactMap { row(for: $0) }) outlineView.reconfigureRows(at: rows) } /// The items that are visible. - open var visibleItems: [ItemIdentifierType] { + open var visibleItems: [Item] { outlineView.visibleRowIndexes().compactMap { item(forRow: $0) } } @@ -467,7 +467,7 @@ public class OutlineViewDiffableDataSource: NSObje - item: The items to expand. - expandChildren: If `true`, recursively expands item and its children. If `false`, expands item only. */ - open func expand(_ item: ItemIdentifierType, expandChildren: Bool = false) { + open func expand(_ item: Item, expandChildren: Bool = false) { expand([item], expandChildren: expandChildren) } @@ -478,7 +478,7 @@ public class OutlineViewDiffableDataSource: NSObje - items: The items to expand. - expandChildren: If `true`, recursively expands item and its children. If `false`, expands item only. */ - open func expand(_ items: [ItemIdentifierType], expandChildren: Bool = false) { + open func expand(_ items: [Item], expandChildren: Bool = false) { items.forEach({ outlineView.expandItem($0, expandChildren: expandChildren) }) } @@ -489,7 +489,7 @@ public class OutlineViewDiffableDataSource: NSObje - item: The item to expand. - collapseChildren: If `true`, recursively collapses item and its children. If `false`, collapses item only. */ - open func collapse(_ item: ItemIdentifierType, collapseChildren: Bool = false) { + open func collapse(_ item: Item, collapseChildren: Bool = false) { collapse([item], collapseChildren: collapseChildren) } @@ -500,11 +500,11 @@ public class OutlineViewDiffableDataSource: NSObje - items: The items to expand. - collapseChildren: If `true`, recursively collapses item and its children. If `false`, collapses item only. */ - open func collapse(_ items: [ItemIdentifierType], collapseChildren: Bool = false) { + open func collapse(_ items: [Item], collapseChildren: Bool = false) { items.forEach({ outlineView.collapseItem($0, collapseChildren: collapseChildren) }) } - func rowView(for item: ItemIdentifierType) -> NSTableRowView? { + func rowView(for item: Item) -> NSTableRowView? { if let row = row(for: item) { return outlineView.rowView(atRow: row, makeIfNecessary: false) } @@ -512,23 +512,23 @@ public class OutlineViewDiffableDataSource: NSObje } /// Returns a preview image of the table row for the specified items. - public func previewImage(for item: ItemIdentifierType) -> NSImage? { + public func previewImage(for item: Item) -> NSImage? { let columns = outlineView.tableColumns guard !columns.isEmpty else { return nil } return NSImage(combineHorizontal: columns.compactMap({ previewImage(for: item, tableColumn: $0, useColumnWidth: $0 !== columns.last!) }), alignment: .top) } /// Returns a preview image of the table cell for the specified item and table column. - public func previewImage(for item: ItemIdentifierType, tableColumn: NSTableColumn) -> NSImage? { + public func previewImage(for item: Item, tableColumn: NSTableColumn) -> NSImage? { previewImage(for: item, tableColumn: tableColumn, useColumnWidth: true) } /// Returns a preview image of the table row for the specified items. - public func previewImage(for items: [ItemIdentifierType]) -> NSImage? { + public func previewImage(for items: [Item]) -> NSImage? { NSImage(combineVertical: items.compactMap({ previewImage(for: $0)}).reversed(), alignment: .left) } - private func previewImage(for item: ItemIdentifierType, tableColumn: NSTableColumn, useColumnWidth: Bool) -> NSImage? { + private func previewImage(for item: Item, tableColumn: NSTableColumn, useColumnWidth: Bool) -> NSImage? { guard outlineView.tableColumns.contains(tableColumn) else { return nil } let view = cellProvider(outlineView, tableColumn, item) view.frame.size = view.systemLayoutSizeFitting(width: tableColumn.width) @@ -561,7 +561,7 @@ public class OutlineViewDiffableDataSource: NSObje outlineView.dataSource = self outlineView.delegate = delegate outlineView.registerForDraggedTypes([.itemID, .fileURL, .tiff, .png, .string]) - outlineView.isQuicklookPreviewable = ItemIdentifierType.self is QuicklookPreviewable.Type + outlineView.isQuicklookPreviewable = Item.self is QuicklookPreviewable.Type } @@ -575,7 +575,7 @@ public class OutlineViewDiffableDataSource: NSObje - Returns: A configured cell object. */ - public typealias CellProvider = (_ outlineView: NSOutlineView, _ tableColumn: NSTableColumn, _ identifier: ItemIdentifierType) -> NSView + public typealias CellProvider = (_ outlineView: NSOutlineView, _ tableColumn: NSTableColumn, _ identifier: Item) -> NSView /** Creates a diffable data source with the specified cell registration, and connects it to the specified outline view. @@ -590,7 +590,7 @@ public class OutlineViewDiffableDataSource: NSObje - outlineView: The initialized outline view object to connect to the diffable data source. - cellRegistration: A cell registration which returns each of the cells for the outline view from the data the diffable data source provides. */ - public convenience init(outlineView: NSOutlineView, cellRegistration: NSTableView.CellRegistration) { + public convenience init(outlineView: NSOutlineView, cellRegistration: NSTableView.CellRegistration) { self.init(outlineView: outlineView, cellProvider: { outlineView, column, item in outlineView.makeCellView(using: cellRegistration, forColumn: column, row: 0, item: item)! @@ -623,12 +623,12 @@ public class OutlineViewDiffableDataSource: NSObje } /// Returns a representation of the current state of the data in the outline view. - public func snapshot() -> OutlineViewDiffableDataSourceSnapshot { + public func snapshot() -> OutlineViewDiffableDataSourceSnapshot { currentSnapshot } /// Returns a representation of the current state of the data in the specified item of the collection view. - public func snapshot(for item: ItemIdentifierType) -> OutlineViewDiffableDataSourceSnapshot { + public func snapshot(for item: Item) -> OutlineViewDiffableDataSourceSnapshot { guard currentSnapshot.nodes[item] != nil else { return emptySnapshot() } let current = snapshot() var snapshot = emptySnapshot() @@ -640,7 +640,7 @@ public class OutlineViewDiffableDataSource: NSObje } /// Returns an empty snapshot. - public func emptySnapshot() -> OutlineViewDiffableDataSourceSnapshot { + public func emptySnapshot() -> OutlineViewDiffableDataSourceSnapshot { .init() } @@ -654,11 +654,11 @@ public class OutlineViewDiffableDataSource: NSObje - option: Option how to apply the snapshot to the outline view. The default value is `animated`. - completion: An optional completion handler which gets called after applying the snapshot. The system calls this closure from the main queue. */ - public func apply(_ snapshot: OutlineViewDiffableDataSourceSnapshot, _ option: NSDiffableDataSourceSnapshotApplyOption = .animated, completion: (() -> Void)? = nil) { + public func apply(_ snapshot: OutlineViewDiffableDataSourceSnapshot, _ option: NSDiffableDataSourceSnapshotApplyOption = .animated, completion: (() -> Void)? = nil) { _apply(snapshot, option, completion: completion) } - func _apply(_ snapshot: OutlineViewDiffableDataSourceSnapshot, _ option: NSDiffableDataSourceSnapshotApplyOption = .animated, completion: (() -> Void)? = nil, isReapplying: Bool = false) { + func _apply(_ snapshot: OutlineViewDiffableDataSourceSnapshot, _ option: NSDiffableDataSourceSnapshotApplyOption = .animated, completion: (() -> Void)? = nil, isReapplying: Bool = false) { var snapshot = snapshot snapshot.usesGroupItems = groupItemCellProvider != nil && !groupItemsAreCollapsable isApplyingSnapshot = true @@ -672,8 +672,9 @@ public class OutlineViewDiffableDataSource: NSObje } isApplyingSnapshot = false } + /* - func apply(_ snapshot: OutlineViewDiffableDataSourceSnapshot, option: NSDiffableDataSourceSnapshotApplyOption, currentSnapshot: OutlineViewDiffableDataSourceSnapshot, completion: (() -> Void)?) { + func apply(_ snapshot: OutlineViewDiffableDataSourceSnapshot, option: NSDiffableDataSourceSnapshotApplyOption, currentSnapshot: OutlineViewDiffableDataSourceSnapshot, completion: (() -> Void)?) { func applySnapshot() { outlineView.beginUpdates() for instruction in currentSnapshot.instructions(forMorphingTo: snapshot) { @@ -712,6 +713,7 @@ public class OutlineViewDiffableDataSource: NSObje } } } + */ func reapplySnapshot() { let currentSnapshot = currentSnapshot @@ -720,7 +722,7 @@ public class OutlineViewDiffableDataSource: NSObje } public func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any { - if let item = item as? ItemIdentifierType { + if let item = item as? Item { return currentSnapshot.children(of: item)[index] } return currentSnapshot.rootItems[index] @@ -728,20 +730,20 @@ public class OutlineViewDiffableDataSource: NSObje public func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int { if let item = item { - return currentSnapshot.children(of: item as! ItemIdentifierType).count + return currentSnapshot.children(of: item as! Item).count } return currentSnapshot.rootItems.count } public func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool { - !currentSnapshot.children(of: item as! ItemIdentifierType).isEmpty + !currentSnapshot.children(of: item as! Item).isEmpty } public func outlineView(_ outlineView: NSOutlineView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forItems draggedItems: [Any]) { - self.draggedItems = draggedItems.compactMap({$0 as? ItemIdentifierType}) + self.draggedItems = draggedItems.compactMap({$0 as? Item}) let parents = self.draggedItems.compactMap({ currentSnapshot.parent(of:$0) }).uniqued() - var children: [ItemIdentifierType] = [] + var children: [Item] = [] if parents.isEmpty { children = currentSnapshot.rootItems } else if parents.count == 1 { @@ -814,8 +816,8 @@ public class OutlineViewDiffableDataSource: NSObje } }) /* - var collapsing: [ItemIdentifierType] = [] - var expanding: [ItemIdentifierType] = [] + var collapsing: [Item] = [] + var expanding: [Item] = [] for item in currentSnapshot.rootItems { let isExpanded = outlineView.isItemExpanded(item) let isExpanded1 = currentSnapshot.nodes[item]?.isExpanded ?? false @@ -858,28 +860,28 @@ public class OutlineViewDiffableDataSource: NSObje public func outlineView(_ outlineView: NSOutlineView, validateDrop info: any NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation { canDrop = false if info.draggingSource as? NSOutlineView === outlineView { - if let item = item as? ItemIdentifierType, draggedItems.contains(item) { + if let item = item as? Item, draggedItems.contains(item) { return [] } - if draggedParent == item as? ItemIdentifierType, let last = draggedIndexes.last, (draggedIndexes + [last+1]).contains(index) { + if draggedParent == item as? Item, let last = draggedIndexes.last, (draggedIndexes + [last+1]).contains(index) { return [] } if index == -1, let item = item, delegate.outlineView(outlineView, isGroupItem: item) { return [] } - if let item = item as? ItemIdentifierType, draggedItems.contains(where: { currentSnapshot.isDescendant(item, of: $0) }) { + if let item = item as? Item, draggedItems.contains(where: { currentSnapshot.isDescendant(item, of: $0) }) { return [] } /* - if index == -1, !draggedIndexes.isEmpty, (draggedParent == item as? ItemIdentifierType) || (draggedParent == nil && item == nil) { + if index == -1, !draggedIndexes.isEmpty, (draggedParent == item as? Item) || (draggedParent == nil && item == nil) { return [] } */ - return reorderingHandlers.canReorder?(draggedItems, item as? ItemIdentifierType) ?? true == true ? .move : [] + return reorderingHandlers.canReorder?(draggedItems, item as? Item) ?? true == true ? .move : [] } if info.draggingSource as? NSTableView !== outlineView { if let canDrag = droppingHandlers.canDrop { - self.canDrop = canDrag(info.dropInfo(for: outlineView), item as? ItemIdentifierType) + self.canDrop = canDrag(info.dropInfo(for: outlineView), item as? Item) return self.canDrop ? .copy : [] } } @@ -891,16 +893,16 @@ public class OutlineViewDiffableDataSource: NSObje var snapshot = currentSnapshot var index = index if index == -1 { - if let item = item as? ItemIdentifierType { + if let item = item as? Item { index = snapshot.children(of: item).count } else { index = snapshot.rootItems.count } } - if index == 0, let item = item as? ItemIdentifierType, !snapshot.isExpanded(item) { + if index == 0, let item = item as? Item, !snapshot.isExpanded(item) { index = snapshot.children(of: item).count } - snapshot.move(draggedItems, toIndex: index, of: item as? ItemIdentifierType) + snapshot.move(draggedItems, toIndex: index, of: item as? Item) let transaction = OutlineViewDiffableDataSourceTransaction(initial: currentSnapshot, final: snapshot) reorderingHandlers.willReorder?(transaction) apply(snapshot, reorderingHandlers.animates ? .animated : .withoutAnimation) @@ -909,11 +911,11 @@ public class OutlineViewDiffableDataSource: NSObje } if info.draggingSource as? NSOutlineView !== outlineView, canDrop { let dropInfo = info.dropInfo(for: outlineView) - let item = item as? ItemIdentifierType + let item = item as? Item let items = droppingHandlers.items?(dropInfo) ?? [] var snapshot = snapshot() snapshot.insert(items, atIndex: index, of: item) - let transaction = OutlineViewDiffableDataSourceTransaction.init(initial: currentSnapshot, final: snapshot) + let transaction = OutlineViewDiffableDataSourceTransaction.init(initial: currentSnapshot, final: snapshot) droppingHandlers.willDrop?(dropInfo, item, transaction) apply(transaction.finalSnapshot, droppingHandlers.animates ? .animated : .withoutAnimation) droppingHandlers.didDrop?(dropInfo, item, transaction) @@ -923,7 +925,7 @@ public class OutlineViewDiffableDataSource: NSObje } public func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> (any NSPasteboardWriting)? { - guard let item = item as? ItemIdentifierType else { return nil } + guard let item = item as? Item else { return nil } return NSPasteboardItem(forItem: item) } @@ -936,31 +938,31 @@ public class OutlineViewDiffableDataSource: NSObje /// Handlers for selecting items. public struct ExpanionHandlers { /// The handler that determines if an item should expand. The default value is `nil` which indicates that all items should expand. - public var shouldExpand: ((ItemIdentifierType) -> Bool)? + public var shouldExpand: ((Item) -> Bool)? /// The handler that gets called whenever an item expands. - public var didExpand: ((ItemIdentifierType) -> Void)? + public var didExpand: ((Item) -> Void)? /// The handler that determines if an item should collapse. The default value is `nil` which indicates that all items should collapse. - public var shouldCollapse: ((ItemIdentifierType) -> Bool)? + public var shouldCollapse: ((Item) -> Bool)? /// The handler that gets called whenever an item collapses. - public var didCollapse: ((ItemIdentifierType) -> Void)? + public var didCollapse: ((Item) -> Void)? } /// Handlers for selecting items. public struct SelectionHandlers { /// The handler that determines which items should get selected. The default value is `nil` which indicates that all items should get selected. - public var shouldSelect: (([ItemIdentifierType]) -> [ItemIdentifierType])? + public var shouldSelect: (([Item]) -> [Item])? /// The handler that gets called whenever items get selected. - public var didSelect: (([ItemIdentifierType]) -> Void)? + public var didSelect: (([Item]) -> Void)? /// The handler that determines which items should get deselected. The default value is `nil` which indicates that all items should get deselected. - public var shouldDeselect: (([ItemIdentifierType]) -> [ItemIdentifierType])? + public var shouldDeselect: (([Item]) -> [Item])? /// The handler that gets called whenever items get deselected. - public var didDeselect: (([ItemIdentifierType]) -> Void)? + public var didDeselect: (([Item]) -> Void)? } /** @@ -970,10 +972,10 @@ public class OutlineViewDiffableDataSource: NSObje */ public struct ReorderingHandlers { /// The handler that determines if items can be reordered. The default value is `nil` which indicates that items can't be reordered. - public var canReorder: ((_ items: [ItemIdentifierType], _ parent: ItemIdentifierType?) -> Bool)? + public var canReorder: ((_ items: [Item], _ parent: Item?) -> Bool)? /// The handler that that gets called before reordering items. - public var willReorder: ((_ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? + public var willReorder: ((_ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? /** The handler that that gets called after reordering items. @@ -1001,7 +1003,7 @@ public class OutlineViewDiffableDataSource: NSObje } ``` */ - public var didReorder: ((_ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? + public var didReorder: ((_ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? /// A Boolean value that indicates whether reordering items is animated. public var animates: Bool = false @@ -1012,10 +1014,10 @@ public class OutlineViewDiffableDataSource: NSObje public struct DeletingHandlers { /// The handler that determines which items can be be deleted. The default value is `nil`, which indicates that all items can be deleted. - public var canDelete: ((_ items: [ItemIdentifierType]) -> [ItemIdentifierType])? + public var canDelete: ((_ items: [Item]) -> [Item])? /// The handler that that gets called before deleting items. - public var willDelete: ((_ items: [ItemIdentifierType], _ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? + public var willDelete: ((_ items: [Item], _ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? /** The handler that that gets called after deleting items. @@ -1043,7 +1045,7 @@ public class OutlineViewDiffableDataSource: NSObje } ``` */ - public var didDelete: ((_ items: [ItemIdentifierType], _ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? + public var didDelete: ((_ items: [Item], _ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? /** A Boolean value that indicates whether items can be deleted by dragging them outside the outline view. @@ -1059,10 +1061,10 @@ public class OutlineViewDiffableDataSource: NSObje /// Handlers for hovering items with the mouse. public struct HoverHandlers { /// The handler that gets called whenever the mouse is hovering an item. - public var isHovering: ((ItemIdentifierType) -> Void)? + public var isHovering: ((Item) -> Void)? /// The handler that gets called whenever the mouse did end hovering an item. - public var didEndHovering: ((ItemIdentifierType) -> Void)? + public var didEndHovering: ((Item) -> Void)? var shouldSetup: Bool { isHovering != nil || didEndHovering != nil @@ -1099,16 +1101,16 @@ public class OutlineViewDiffableDataSource: NSObje /// Handlers for dropping items inside the outline view. public struct DroppingHandlers { /// The handler that determines whether a drop with the pasteboard content is accepted. - public var canDrop: ((_ dropInfo: DropInfo, _ target: ItemIdentifierType?) -> Bool)? + public var canDrop: ((_ dropInfo: DropInfo, _ target: Item?) -> Bool)? /// The handler that determinates the items to be inserted for the pasteboard content. - public var items: ((_ dropInfo: DropInfo) -> ([ItemIdentifierType]))? + public var items: ((_ dropInfo: DropInfo) -> ([Item]))? /// The handler that gets called before new items are dropped. - public var willDrop: ((_ dropInfo: DropInfo, _ target: ItemIdentifierType?, _ transaction: OutlineViewDiffableDataSourceTransaction) -> ())? + public var willDrop: ((_ dropInfo: DropInfo, _ target: Item?, _ transaction: OutlineViewDiffableDataSourceTransaction) -> ())? /// The handler that gets called after new items are dropped. - public var didDrop: ((_ dropInfo: DropInfo, _ target: ItemIdentifierType?, _ transaction: OutlineViewDiffableDataSourceTransaction) -> ())? + public var didDrop: ((_ dropInfo: DropInfo, _ target: Item?, _ transaction: OutlineViewDiffableDataSourceTransaction) -> ())? /// A Boolean value that indicates whether dropping items is animated. public var animates: Bool = false @@ -1121,7 +1123,7 @@ public class OutlineViewDiffableDataSource: NSObje if let canDelete = deletingHandlers.canDelete { keyDownMonitor = NSEvent.localMonitor(for: .keyDown) { [weak self] event in guard let self = self, event.charactersIgnoringModifiers == String(UnicodeScalar(NSDeleteCharacter)!), self.outlineView.isFirstResponder else { return event } - let selected = outlineView.selectedItems as! [ItemIdentifierType] + let selected = outlineView.selectedItems as! [Item] let itemsToDelete = canDelete(selected) guard !itemsToDelete.isEmpty else { return event } @@ -1168,7 +1170,7 @@ public class OutlineViewDiffableDataSource: NSObje // MARK: - Quicklook -extension OutlineViewDiffableDataSource where ItemIdentifierType: QuicklookPreviewable { +extension OutlineViewDiffableDataSource where Item: QuicklookPreviewable { /** A Boolean value that indicates whether the user can open a quicklook preview of selected items by pressing space bar. @@ -1188,7 +1190,7 @@ extension OutlineViewDiffableDataSource where ItemIdentifierType: QuicklookPrevi - items: The items to preview. - current: The item that starts the preview. The default value is `nil`. */ - public func quicklookItems(_ items: [ItemIdentifierType], current: ItemIdentifierType? = nil) { + public func quicklookItems(_ items: [Item], current: Item? = nil) { let rows = items.compactMap { row(for: $0) } if let current = current, let currentRow = row(for: current) { outlineView.quicklookRows(at: rows, current: currentRow) @@ -1206,16 +1208,16 @@ extension OutlineViewDiffableDataSource { - comparator: The item sorting comperator, or `nil` to remove any sorting comperators from the table column. - tableColumn: The table column. */ - public func setSortComparator(_ comparator: SortingComparator?, forColumn tableColumn: NSTableColumn, activate: Bool = false) { + public func setSortComparator(_ comparator: SortingComparator?, forColumn tableColumn: NSTableColumn, activate: Bool = false) { if activate, comparator != nil, let key = tableColumn.sortDescriptorPrototype?.key { outlineView.sortDescriptors.removeAll(where: { $0.key == key }) } if let comparator = comparator { - tableColumn.sortDescriptorPrototype = ItemIdentifierTypeSortDescriptor([comparator]) + tableColumn.sortDescriptorPrototype = ItemSortDescriptor([comparator]) if activate { outlineView.sortDescriptors = [tableColumn.sortDescriptorPrototype!] + outlineView.sortDescriptors } - } else if tableColumn.sortDescriptorPrototype is ItemIdentifierTypeSortDescriptor { + } else if tableColumn.sortDescriptorPrototype is ItemSortDescriptor { tableColumn.sortDescriptorPrototype = nil } } @@ -1227,25 +1229,25 @@ extension OutlineViewDiffableDataSource { - comparators: The item sorting comperators. - tableColumn: The table column. */ - public func setSortComparators(_ comparators: [SortingComparator], forColumn tableColumn: NSTableColumn, activate: Bool = false) { + public func setSortComparators(_ comparators: [SortingComparator], forColumn tableColumn: NSTableColumn, activate: Bool = false) { if activate, !comparators.isEmpty, let key = tableColumn.sortDescriptorPrototype?.key { outlineView.sortDescriptors.removeAll(where: { $0.key == key }) } if comparators.isEmpty { setSortComparator(nil, forColumn: tableColumn) } else { - tableColumn.sortDescriptorPrototype = ItemIdentifierTypeSortDescriptor(comparators) + tableColumn.sortDescriptorPrototype = ItemSortDescriptor(comparators) if activate { outlineView.sortDescriptors = [tableColumn.sortDescriptorPrototype!] + outlineView.sortDescriptors } } } - class ItemIdentifierTypeSortDescriptor: NSSortDescriptor { + class ItemSortDescriptor: NSSortDescriptor { - var comparators: [SortingComparator] = [] + var comparators: [SortingComparator] = [] - init(_ comparators: [SortingComparator], ascending: Bool = true, key: String? = nil) { + init(_ comparators: [SortingComparator], ascending: Bool = true, key: String? = nil) { super.init(key: key ?? UUID().uuidString, ascending: ascending, selector: nil) self.comparators = comparators } @@ -1253,15 +1255,15 @@ extension OutlineViewDiffableDataSource { override var reversedSortDescriptor: Any { var comparators = comparators comparators.editEach({$0.order.toggle() }) - return ItemIdentifierTypeSortDescriptor(comparators, ascending: !ascending, key: key) + return ItemSortDescriptor(comparators, ascending: !ascending, key: key) } override func copy() -> Any { - ItemIdentifierTypeSortDescriptor(comparators, ascending: ascending, key: key) + ItemSortDescriptor(comparators, ascending: ascending, key: key) } override func isEqual(_ object: Any?) -> Bool { - guard let object = object as? ItemIdentifierTypeSortDescriptor else { return false } + guard let object = object as? ItemSortDescriptor else { return false } return object.key == key && object.ascending == ascending && object.comparators == comparators } @@ -1270,3 +1272,18 @@ extension OutlineViewDiffableDataSource { } } } + +/* + + Are the two Swift methods more or less generating simliar random numbers? + + func random(in range: (min: Int, max: Int)) -> Int { + assert(range.max >= range.min, "Max in range should be greater than min") + return Int(arc4random_uniform(UInt32(range.max - range.min))) + range.min + } + + func random(in range: (min: Int, max: Int)) -> Int { + assert(range.max >= range.min, "Max in range should be greater than min") + Int(Double.random(in: Double(min)...Double(max))) + } + */ diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineChangeInstruction.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineChangeInstruction.swift index 702140ec..c67e6487 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineChangeInstruction.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineChangeInstruction.swift @@ -31,10 +31,10 @@ enum OutlineChangeInstruction: CustomStringConvertible, Hashable, Equatable { extension OutlineViewDiffableDataSourceSnapshot { func instructions(forMorphingTo newSnapshot: OutlineViewDiffableDataSourceSnapshot) -> [OutlineChangeInstruction] { - var movedItems: Set = [] + var movedItems: Set = [] var work = self work.isCalculatingDiff = true - func calculateSteps(from source: [ItemIdentifierType], to destination: [ItemIdentifierType], parent: ItemIdentifierType? = nil) -> [OutlineChangeInstruction] { + func calculateSteps(from source: [Item], to destination: [Item], parent: Item? = nil) -> [OutlineChangeInstruction] { var instructions: [OutlineChangeInstruction] = [] for step in destination.difference(from: source).steps { switch step { diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceSnapshot+Node.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceSnapshot+Node.swift index 4e09e7f0..31454e07 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceSnapshot+Node.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceSnapshot+Node.swift @@ -26,9 +26,9 @@ import Foundation } ``` */ -public struct OutlineNode { +public struct OutlineNode { /// The item of the node. - public let item: ItemIdentifierType + public let item: Item /// The children of the node. public let children: [OutlineNode] @@ -43,26 +43,26 @@ public struct OutlineNode { /* /// A Boolean value indicating whether the node contains the item. - public func contains(_ item: ItemIdentifierType) -> Bool { + public func contains(_ item: Item) -> Bool { children.contains(where: { $0.item == item || $0.contains(item) }) } */ /// Creates a node with the specified item. - public init(_ item: ItemIdentifierType) { + public init(_ item: Item) { self.item = item self.children = [] self.isExpanded = false } /// Creates a node with the specified item and children. - public init(_ item: ItemIdentifierType, @Builder _ children: () -> [OutlineNode]) { + public init(_ item: Item, @Builder _ children: () -> [OutlineNode]) { self.item = item self.children = children() self.isExpanded = false } - init(_ item: ItemIdentifierType, children: [OutlineNode], isExpanded: Bool) { + init(_ item: Item, children: [OutlineNode], isExpanded: Bool) { self.item = item self.children = children self.isExpanded = isExpanded @@ -89,30 +89,30 @@ extension OutlineViewDiffableDataSourceSnapshot { } ``` */ - public init(@OutlineNode.Builder nodes: () -> [OutlineNode]) { + public init(@OutlineNode.Builder nodes: () -> [OutlineNode]) { apply(nodes()) } /// Adds the items of the specified nodes as child items of the specified parent item in the snapshot. - public mutating func append(@OutlineNode.Builder _ nodes: () -> [OutlineNode], to parent: ItemIdentifierType? = nil) { + public mutating func append(@OutlineNode.Builder _ nodes: () -> [OutlineNode], to parent: Item? = nil) { apply(nodes(), to: parent) } /// Inserts the items of the provided nodes immediately after the item with the specified identifier in the snapshot. - public mutating func insert(@OutlineNode.Builder _ nodes: () -> [OutlineNode], after item: ItemIdentifierType) { + public mutating func insert(@OutlineNode.Builder _ nodes: () -> [OutlineNode], after item: Item) { let nodes = nodes() insert(nodes.compactMap({$0.item}), after: item) nodes.forEach({ apply($0.children, to: $0.item) }) } /// Inserts the items of the provided nodes immediately before the item with the specified identifier in the snapshot. - public mutating func insert(@OutlineNode.Builder _ nodes: () -> [OutlineNode], before item: ItemIdentifierType) { + public mutating func insert(@OutlineNode.Builder _ nodes: () -> [OutlineNode], before item: Item) { let nodes = nodes() insert(nodes.compactMap({$0.item}), before: item) nodes.forEach({ apply($0.children, to: $0.item) }) } - mutating func apply(_ nodes: [OutlineNode], to item: ItemIdentifierType? = nil) { + mutating func apply(_ nodes: [OutlineNode], to item: Item? = nil) { append(nodes.compactMap({$0.item}), to: item) nodes.forEach({ self.nodes[$0.item]?.isExpanded = $0.isExpanded }) nodes.forEach({ apply($0.children, to: $0.item) }) @@ -151,14 +151,14 @@ extension OutlineNode { expr.map { [$0] } ?? [] } - public static func buildExpression(_ expr: ItemIdentifierType?) -> [OutlineNode] { + public static func buildExpression(_ expr: Item?) -> [OutlineNode] { if let item = expr { return [.init(item)] } return [] } - public static func buildExpression(_ expr: [ItemIdentifierType]?) -> [OutlineNode] { + public static func buildExpression(_ expr: [Item]?) -> [OutlineNode] { expr?.compactMap({.init($0)}) ?? [] } } diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceSnapshot.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceSnapshot.swift index 22319744..8579978c 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceSnapshot.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceSnapshot.swift @@ -27,11 +27,11 @@ import FZSwiftUtils dataSource.apply(snapshot) ``` */ -public struct OutlineViewDiffableDataSourceSnapshot { +public struct OutlineViewDiffableDataSourceSnapshot { struct Node { - var parent: ItemIdentifierType? - var children: [ItemIdentifierType] = [] + var parent: Item? + var children: [Item] = [] var isExpanded = false } @@ -41,13 +41,13 @@ public struct OutlineViewDiffableDataSourceSnapshot = [] + var orderedItems: OrderedSet = [] /// The identifiers of the items at the top level of the snapshot’s hierarchy. - public internal(set) var rootItems: [ItemIdentifierType] = [] + public internal(set) var rootItems: [Item] = [] /// A Boolean value indicating that the root items are displayed as group items. var usesGroupItems: Bool = false @@ -56,13 +56,13 @@ public struct OutlineViewDiffableDataSourceSnapshot [ItemIdentifierType] { + public var visibleItems: [Item] { + func visibleChilds(for parent: Item) -> [Item] { var visibleItems = children(of: parent).filter({ isExpanded($0) }) visibleItems += visibleItems.flatMap({ visibleChilds(for: $0) }) return visibleItems @@ -70,10 +70,10 @@ public struct OutlineViewDiffableDataSourceSnapshot OutlineViewDiffableDataSourceSnapshot { + public func snapshot(of parent: Item, includingParent: Bool = false) -> OutlineViewDiffableDataSourceSnapshot { var snapshot = OutlineViewDiffableDataSourceSnapshot() snapshot.rootItems = includingParent ? [parent] : children(of: parent) for rootItem in snapshot.rootItems { @@ -230,12 +230,12 @@ public struct OutlineViewDiffableDataSourceSnapshot Int? { + public func index(of item: Item) -> Int? { return orderedItems.firstIndex(of: item) } /// Finds the hierarchical level of the specified item in the snapshot. - public func level(of item: ItemIdentifierType) -> Int? { + public func level(of item: Item) -> Int? { guard contains(item) else { return nil } var level = 0 var item = item @@ -247,12 +247,12 @@ public struct OutlineViewDiffableDataSourceSnapshot ItemIdentifierType? { + public func parent(of item: Item) -> Item? { nodes[item]?.parent } /// Returns the children items of the specified item in the snapshot. - public func children(of parent: ItemIdentifierType, recursive: Bool = false) -> [ItemIdentifierType] { + public func children(of parent: Item, recursive: Bool = false) -> [Item] { if !recursive { return nodes[parent]?.children ?? [] } @@ -260,12 +260,12 @@ public struct OutlineViewDiffableDataSourceSnapshot Bool { + public func contains(_ item: Item) -> Bool { nodes[item] != nil } /// Indicates whether the specified item is currently visible onscreen. - public func isVisible(_ item: ItemIdentifierType) -> Bool { + public func isVisible(_ item: Item) -> Bool { var item = item while let parent = parent(of: item) { if nodes[parent]?.isExpanded == false { @@ -277,7 +277,7 @@ public struct OutlineViewDiffableDataSourceSnapshot Bool { + public func isDescendant(_ item: Item, of parent: Item) -> Bool { let children = children(of: parent) return children.contains(item) || children.contains(where: { isDescendant(item, of: $0) }) } @@ -285,9 +285,9 @@ public struct OutlineViewDiffableDataSourceSnapshot Bool { + public func isExpanded(_ item: Item) -> Bool { nodes[item]?.isExpanded == true } /// Expands the specified items in the snapshot. - public mutating func expand(_ items: [ItemIdentifierType]) { + public mutating func expand(_ items: [Item]) { items.forEach({ nodes[$0]?.isExpanded = true }) } /// Collapses the specified items in the snapshot. - public mutating func collapse(_ items: [ItemIdentifierType]) { + public mutating func collapse(_ items: [Item]) { items.forEach({ nodes[$0]?.isExpanded = false }) } @@ -337,9 +337,9 @@ public struct OutlineViewDiffableDataSourceSnapshot String { - var result = "OutlineViewDiffableDataSourceSnapshot<\(String(describing: ItemIdentifierType.self))>\n" + var result = "OutlineViewDiffableDataSourceSnapshot<\(String(describing: Item.self))>\n" - func buildDescription(for item: ItemIdentifierType, level: Int) { + func buildDescription(for item: Item, level: Int) { let isVisible = isVisible(item) ? "*" : "" let isExpanded = isExpanded(item) ? "+" : "-" let annotation = "\(isVisible)\(isExpanded)" @@ -357,9 +357,9 @@ public struct OutlineViewDiffableDataSourceSnapshot [ItemIdentifierType] { - var result: [ItemIdentifierType] = [] - var stack: [ItemIdentifierType] = [parent] + func descendants(of parent: Item) -> [Item] { + var result: [Item] = [] + var stack: [Item] = [parent] while !stack.isEmpty { let currentItem = stack.removeLast() @@ -370,14 +370,14 @@ public struct OutlineViewDiffableDataSourceSnapshot Int? { + func childIndex(of item: Item) -> Int? { if let parent = parent(of: item) { return children(of: parent).firstIndex(of: item) } return rootItems.firstIndex(of: item) } - func validateItems(_ items: [ItemIdentifierType], removing: [ItemIdentifierType] = [], _ message: String = "ItemIdentifierTypes in a snapshot must be unique. Duplicate items:\n") { + func validateItems(_ items: [Item], removing: [Item] = [], _ message: String = "Items in a snapshot must be unique. Duplicate items:\n") { guard !isCalculatingDiff else { return } var orderedItems = orderedItems orderedItems.remove(removing) - var duplicates: OrderedSet = [] + var duplicates: OrderedSet = [] for item in items { if orderedItems.contains(item) { duplicates.append(item) @@ -404,24 +404,24 @@ public struct OutlineViewDiffableDataSourceSnapshot { + var expandedItems: Set { var items = Set(nodes.filter({ $0.value.isExpanded }).keys) if usesGroupItems { items += rootItems @@ -469,5 +469,5 @@ fileprivate extension Array where Element: Equatable { Only items that are inserted to the snapshot can be provided. */ - public var nonCollapsableItems: Set = [] + public var nonCollapsableItems: Set = [] */ diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceTransaction.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceTransaction.swift index f3b77153..ac7ed171 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceTransaction.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineViewDiffableDataSourceTransaction.swift @@ -8,19 +8,19 @@ import Foundation /// A transaction that describes the changes after reordering the items of a outline view.. -public struct OutlineViewDiffableDataSourceTransaction { +public struct OutlineViewDiffableDataSourceTransaction { /// The section snapshot before the transaction occured. - public let initialSnapshot: OutlineViewDiffableDataSourceSnapshot + public let initialSnapshot: OutlineViewDiffableDataSourceSnapshot /// The section snapshot after the transaction occured. - public let finalSnapshot: OutlineViewDiffableDataSourceSnapshot + public let finalSnapshot: OutlineViewDiffableDataSourceSnapshot /// A collection of insertions and removals that describe the difference between initial and final snapshots. - public let difference: CollectionDifference + public let difference: CollectionDifference } extension OutlineViewDiffableDataSourceTransaction { - init(initial: OutlineViewDiffableDataSourceSnapshot, final: OutlineViewDiffableDataSourceSnapshot) { + init(initial: OutlineViewDiffableDataSourceSnapshot, final: OutlineViewDiffableDataSourceSnapshot) { initialSnapshot = initial finalSnapshot = final difference = initial.items.difference(from: final.items) diff --git a/Sources/AdvancedCollectionTableView/Extensions/Shared/NSView+Transform.swift b/Sources/AdvancedCollectionTableView/Extensions/Shared/NSView+Transform.swift index 6b8dd855..43ac688c 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/Shared/NSView+Transform.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/Shared/NSView+Transform.swift @@ -16,7 +16,7 @@ extension NSView { guard newValue != _scaleTransform else { return } setAssociatedValue(newValue, key: "_scaleTransform") anchorPoint = .center - scale = newValue + animatorIfNeeded().scale = newValue } } @@ -26,7 +26,7 @@ extension NSView { guard newValue != _rotation else { return } setAssociatedValue(newValue, key: "_rotation") anchorPoint = .center - rotation = newValue + animatorIfNeeded().rotation = newValue } } } From 76758bcf9c603bb7650ec45b1f4937ac53e252bf Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Mon, 2 Jun 2025 10:47:50 +0200 Subject: [PATCH 09/42] Update TableSidebarViewController.swift --- Example/Example/TableSidebarViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Example/Example/TableSidebarViewController.swift b/Example/Example/TableSidebarViewController.swift index a0c1c8d2..b9bda38a 100644 --- a/Example/Example/TableSidebarViewController.swift +++ b/Example/Example/TableSidebarViewController.swift @@ -60,14 +60,14 @@ class TableSidebarViewController: NSViewController { dataSource.rowActionProvider = { swippedItem, edge in if edge == .leading { /// Left swipe - return [NSTableViewRowAction.regular("SomeTest", color: .systemYellow) { _,_ in + return [NSTableViewRowAction.regular(symbolName: swippedItem.isFavorite ? "star" : "star.fill", color: .systemYellow) { _,_ in swippedItem.isFavorite = !swippedItem.isFavorite self.dataSource.reconfigureItems([swippedItem]) self.tableView.rowActionsVisible = false }, ] } else { /// Right swipe - return [NSTableViewRowAction.regular("SomeTest") { _,_ in + return [NSTableViewRowAction.destructive(symbolName: "trash.fill") { _,_ in var snapshot = self.dataSource.snapshot() snapshot.deleteItems([swippedItem]) self.dataSource.apply(snapshot) From 1db61ef255c75830051e0489e79b4bac96304581 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 3 Jun 2025 01:17:55 +0200 Subject: [PATCH 10/42] updated --- Example/Example/TableSidebarViewController.swift | 4 ++-- .../NSListContentConfiguration/NSListContentView.swift | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Example/Example/TableSidebarViewController.swift b/Example/Example/TableSidebarViewController.swift index b9bda38a..f646ca51 100644 --- a/Example/Example/TableSidebarViewController.swift +++ b/Example/Example/TableSidebarViewController.swift @@ -44,7 +44,7 @@ class TableSidebarViewController: NSViewController { dataSource.reorderingHandlers.canReorder = { selectedItems in return selectedItems } /// Enables deleting selected rows via backspace key. - dataSource.deletingHandlers.canDelete = { selectedItems in return selectedItems } + dataSource.deletingHandlers.canDelete = { selectedItems in return selectedItems } /// Enable dropping strings to the table view by checking if the drop contains strings. dataSource.droppingHandlers.canDrop = { drop in @@ -64,7 +64,7 @@ class TableSidebarViewController: NSViewController { swippedItem.isFavorite = !swippedItem.isFavorite self.dataSource.reconfigureItems([swippedItem]) self.tableView.rowActionsVisible = false - }, ] + }] } else { /// Right swipe return [NSTableViewRowAction.destructive(symbolName: "trash.fill") { _,_ in diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView.swift index dc8aa6f3..f19f6dea 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView.swift @@ -29,7 +29,6 @@ open class NSListContentView: NSView, NSContentView, EditingContentView { imageTextStackView.translatesAutoresizingMaskIntoConstraints = false badgeStackView.translatesAutoresizingMaskIntoConstraints = false stackViewConstraints = addSubview(withConstraint: badgeStackView) - updateConfiguration() } From 1c477e08d264e22ac6720589d870642854086edf Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 3 Jun 2025 12:35:06 +0200 Subject: [PATCH 11/42] updated --- .../NSTableView+/NSTableCellVew+.swift | 38 +++++++++++++++---- .../NSTableView+/NSTableRowView+.swift | 18 +++++++++ .../NSTableView+/NSTableView+.swift | 13 +++++++ .../TableViewDiffableDataSource.swift | 3 +- .../NSTableView/NSTableView+Register.swift | 4 ++ 5 files changed, 68 insertions(+), 8 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift index ff355edc..e5d4ea25 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift @@ -28,6 +28,9 @@ extension NSTableCellView { setAssociatedValue(newValue, key: "contentConfiguration") observeCellView() configurateContentView() + if newValue is AutomaticHeightSizable { + observeWillMoveToRowView() + } } } @@ -272,14 +275,15 @@ extension NSTableCellView { tableViewObservation = observeChanges(for: \.window) { [weak self] _, window in guard window != nil, let self = self, let tableView = self.tableView else { return } tableView.setupObservation() - if self.contentConfiguration is AutomaticHeightSizable { - tableView.usesAutomaticRowHeights = true + if self.contentConfiguration is AutomaticHeightSizable, !tableView.usesAutomaticRowHeights { + tableView.enableAutomaticRowHeights() + } else { + self.updateContentConfigurationStyle() + self.setNeedsAutomaticUpdateConfiguration() + guard let rowView = self.rowView else { return } + rowView.translatesAutoresizingMaskIntoConstraints = false + rowView.observeSelection() } - self.updateContentConfigurationStyle() - self.setNeedsAutomaticUpdateConfiguration() - guard let rowView = self.rowView else { return } - rowView.translatesAutoresizingMaskIntoConstraints = false - rowView.observeSelection() } } else { tableViewObservation = nil @@ -290,4 +294,24 @@ extension NSTableCellView { get { getAssociatedValue("tableViewObservation") } set { setAssociatedValue(newValue, key: "tableViewObservation") } } + + var _tableView: NSTableView? { + get { getAssociatedValue("_tableView") } + set { setAssociatedValue(weak: newValue, key: "_tableView") } + } + + func observeWillMoveToRowView() { + guard !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) else { return } + do { + try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { + object, selector, superview in + guard let rowView = superview as? NSTableRowView else { return } + rowView.observeWillMoveToTableView() + // rowView.translatesAutoresizingMaskIntoConstraints = false + // rowView.observeSelection() + } as @convention(block) (AnyObject, Selector, NSView?) -> ()) + } catch { + Swift.print(error) + } + } } diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift index 46ca9f81..e236de0f 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift @@ -32,6 +32,9 @@ extension NSTableRowView { setAssociatedValue(newValue, key: "contentConfiguration") observeRowView() configurateContentView() + if newValue is AutomaticHeightSizable { + observeWillMoveToTableView() + } } } @@ -261,4 +264,19 @@ extension NSTableRowView { get { getAssociatedValue("tableViewObservation") } set { setAssociatedValue(newValue, key: "tableViewObservation") } } + + func observeWillMoveToTableView() { + guard !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) else { return } + do { + try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { + object, selector, superview in + guard let tableView = superview as? NSTableView else { return } + if !tableView.usesAutomaticRowHeights { + tableView.enableAutomaticRowHeights() + } + } as @convention(block) (AnyObject, Selector, NSView?) -> ()) + } catch { + Swift.print(error) + } + } } diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift index e24f1dc7..ddeb3129 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift @@ -57,4 +57,17 @@ extension NSTableView { var isActive: Bool { window?.isKeyWindow == true } + + func enableAutomaticRowHeights() { + guard !usesAutomaticRowHeights else { return } + Self.swizzleCellRegistration() + isEnablingAutomaticRowHeights = true + usesAutomaticRowHeights = true + reloadData() + } + + var isEnablingAutomaticRowHeights: Bool { + get { getAssociatedValue("isEnablingAutomaticRowHeights") ?? false } + set { setAssociatedValue(newValue, key: "isEnablingAutomaticRowHeights") } + } } diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 5caaed4e..6c63061b 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -97,7 +97,8 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData if let rowViewProvider = rowViewProvider { dataSource.rowViewProvider = { [weak self] tableview, row, identifier in guard let self = self, let item = self.currentSnapshot.itemIdentifiers[id: identifier as! Item.ID] else { return NSTableRowView() } - return rowViewProvider(tableview, row, item) + let rowView = rowViewProvider(tableview, row, item) + return rowView } } else { dataSource.rowViewProvider = nil diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift index a677c684..ae0827c4 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift @@ -64,6 +64,10 @@ extension NSTableView { } @objc func swizzled_makeView(withIdentifier identifier: NSUserInterfaceItemIdentifier, owner: Any?) -> NSView? { + if isEnablingAutomaticRowHeights { + isEnablingAutomaticRowHeights = false + return nil + } if let reconfigureIndexPath = reconfigureIndexPath, let cell = view(atColumn: reconfigureIndexPath.section, row: reconfigureIndexPath.item, makeIfNecessary: false) { return cell } From 5adb784fc20a71087fcec9eedd5a3ad2dad41a5a Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 3 Jun 2025 13:07:55 +0200 Subject: [PATCH 12/42] updateed --- .../NSTableView+/NSTableCellVew+.swift | 19 +++++++++---------- .../NSTableView+/NSTableRowView+.swift | 3 --- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift index e5d4ea25..65582a2b 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift @@ -275,15 +275,11 @@ extension NSTableCellView { tableViewObservation = observeChanges(for: \.window) { [weak self] _, window in guard window != nil, let self = self, let tableView = self.tableView else { return } tableView.setupObservation() - if self.contentConfiguration is AutomaticHeightSizable, !tableView.usesAutomaticRowHeights { - tableView.enableAutomaticRowHeights() - } else { - self.updateContentConfigurationStyle() - self.setNeedsAutomaticUpdateConfiguration() - guard let rowView = self.rowView else { return } - rowView.translatesAutoresizingMaskIntoConstraints = false - rowView.observeSelection() - } + self.updateContentConfigurationStyle() + self.setNeedsAutomaticUpdateConfiguration() + guard let rowView = self.rowView else { return } + rowView.translatesAutoresizingMaskIntoConstraints = false + rowView.observeSelection() } } else { tableViewObservation = nil @@ -297,7 +293,10 @@ extension NSTableCellView { var _tableView: NSTableView? { get { getAssociatedValue("_tableView") } - set { setAssociatedValue(weak: newValue, key: "_tableView") } + set { + guard newValue != _tableView else { return } + setAssociatedValue(weak: newValue, key: "_tableView") + } } func observeWillMoveToRowView() { diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift index e236de0f..e5f4cb8a 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift @@ -250,9 +250,6 @@ extension NSTableRowView { guard tableViewObservation == nil else { return } tableViewObservation = observeChanges(for: \.window) { [weak self] _, window in guard window != nil, let self = self, let tableView = self.tableView else { return } - if self.contentConfiguration is AutomaticHeightSizable { - tableView.usesAutomaticRowHeights = true - } tableView.setupObservation() } } else { From 45678217f7a84ad9b147432d70dac58a350b6fd7 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 3 Jun 2025 13:16:07 +0200 Subject: [PATCH 13/42] updated --- .../NSTableView+/NSTableCellVew+.swift | 30 +++++++------------ .../NSTableView+/NSTableRowView+.swift | 22 +++++++------- 2 files changed, 22 insertions(+), 30 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift index 65582a2b..2b1ad7ca 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift @@ -291,26 +291,18 @@ extension NSTableCellView { set { setAssociatedValue(newValue, key: "tableViewObservation") } } - var _tableView: NSTableView? { - get { getAssociatedValue("_tableView") } - set { - guard newValue != _tableView else { return } - setAssociatedValue(weak: newValue, key: "_tableView") - } - } - func observeWillMoveToRowView() { - guard !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) else { return } - do { - try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { - object, selector, superview in - guard let rowView = superview as? NSTableRowView else { return } - rowView.observeWillMoveToTableView() - // rowView.translatesAutoresizingMaskIntoConstraints = false - // rowView.observeSelection() - } as @convention(block) (AnyObject, Selector, NSView?) -> ()) - } catch { - Swift.print(error) + if let tableView = tableView { + tableView.enableAutomaticRowHeights() + } else if !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) { + do { + try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { + object, selector, superview in + (superview as? NSTableRowView)?.observeWillMoveToTableView() + } as @convention(block) (AnyObject, Selector, NSView?) -> ()) + } catch { + Swift.print(error) + } } } } diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift index e5f4cb8a..72a1c5e8 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift @@ -263,17 +263,17 @@ extension NSTableRowView { } func observeWillMoveToTableView() { - guard !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) else { return } - do { - try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { - object, selector, superview in - guard let tableView = superview as? NSTableView else { return } - if !tableView.usesAutomaticRowHeights { - tableView.enableAutomaticRowHeights() - } - } as @convention(block) (AnyObject, Selector, NSView?) -> ()) - } catch { - Swift.print(error) + if let tableView = tableView { + tableView.enableAutomaticRowHeights() + } else if !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) { + do { + try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { + object, selector, superview in + (superview as? NSTableView)?.enableAutomaticRowHeights() + } as @convention(block) (AnyObject, Selector, NSView?) -> ()) + } catch { + Swift.print(error) + } } } } From 3fcb0b62bd193d8e2be478193cadcf769b6136aa Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 4 Jun 2025 04:37:03 +0200 Subject: [PATCH 14/42] updated --- Example/Example/Base.lproj/Main.storyboard | 5 +- .../NSTableView+/NSTableView+.swift | 2 +- .../OutlineViewDiffableDataSource.swift | 4 +- .../TableViewDiffableDataSource.swift | 4 +- .../NSTableView+ReconfigureRows.swift | 12 ++- .../NSTableView/NSTableView+Register.swift | 93 ++++++++++--------- .../NSTableView/CellRegistration.swift | 2 +- 7 files changed, 69 insertions(+), 53 deletions(-) diff --git a/Example/Example/Base.lproj/Main.storyboard b/Example/Example/Base.lproj/Main.storyboard index d3220c50..7e625f5e 100644 --- a/Example/Example/Base.lproj/Main.storyboard +++ b/Example/Example/Base.lproj/Main.storyboard @@ -1,7 +1,8 @@ - + - + + diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift index ddeb3129..ee269c1a 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift @@ -60,7 +60,7 @@ extension NSTableView { func enableAutomaticRowHeights() { guard !usesAutomaticRowHeights else { return } - Self.swizzleCellRegistration() + Self.swizzleViewRegistration() isEnablingAutomaticRowHeights = true usesAutomaticRowHeights = true reloadData() diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift index db467ae2..4365c9bf 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift @@ -438,7 +438,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV } } - /// Reloads the outline view cells for the specified items. + /// Reloads the outline view row view and cells for the specified items. open func reloadItems(_ items: [Item], reloadChildren: Bool = false, animated: Bool = false) { if animated { NSView.animate { @@ -449,7 +449,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV } } - /// Updates the data for the specified items, preserving the existing outline view cells for the items. + /// Updates the data for the specified items, preserving the existing outline view row views and cells for the items. open func reconfigureItems(_ items: [Item]) { let rows = IndexSet(items.compactMap { row(for: $0) }) outlineView.reconfigureRows(at: rows) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 6c63061b..19007cdf 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -809,14 +809,14 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } - /// Reloads the table view cells for the specified items. + /// Reloads the table row views and cells for the specified items. open func reloadItems(_ items: [Item], animated: Bool = false) { var snapshot = snapshot() snapshot.reloadItems(items) apply(snapshot, animated ? .animated : .withoutAnimation) } - /// Updates the data for the specified items, preserving the existing table view cells for the items. + /// Updates the data for the specified items, preserving the existing table row views and cells for the items. open func reconfigureItems(_ items: [Item]) { let rows = IndexSet(items.compactMap { row(for: $0) }) tableView.reconfigureRows(at: rows) diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift index 46231ba7..7e847474 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift @@ -10,17 +10,19 @@ import FZSwiftUtils extension NSTableView { /** - Updates the data for the rows at the indexes you specify, preserving the existing cells for the rows. + Updates the data for the rows at the indexes you specify, preserving the existing row views and cells for the rows. - To update the contents of existing (including prefetched) cells without replacing them with new cells, use this method instead of `reloadData(forRowIndexes:columnIndexes:)`. For optimal performance, choose to reconfigure rows instead of reloading rows unless you have an explicit need to replace the existing cell with a new cell. + To update the contents of existing (including prefetched) cells without replacing them with new row views nad cells, use this method instead of `reloadData(forRowIndexes:columnIndexes:)`. For optimal performance, choose to reconfigure rows instead of reloading rows unless you have an explicit need to replace the existing row view or cells with new. Your cell provider must dequeue the same type of cell for the provided index path, and must return the same existing cell for a given index path. Because this method reconfigures existing cells, the table view doesn’t call `prepareForReuse()` for each cell dequeued. If you need to return a different type of cell for an index path, use `reloadData(forRowIndexes:columnIndexes:)` instead. + + The same applies to your row view provider. - Parameters: - indexes: The indexes you want to update. */ public func reconfigureRows(at indexes: IndexSet) { - Self.swizzleCellRegistration() + Self.swizzleViewRegistration() guard let delegate = delegate else { return } let indexes = indexes.filter({$0 < numberOfRows}) let columns = tableColumns @@ -31,6 +33,10 @@ extension NSTableView { reconfigureIndexPath = IndexPath(item: row, section: index) _ = delegate.tableView?(self, viewFor: column, row: row) } + if rowView(atRow: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: -1) + _ = delegate.tableView?(self, rowViewForRow: row) + } } } reconfigureIndexPath = nil diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift index ae0827c4..4b9af284 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift @@ -11,91 +11,100 @@ import FZUIKit extension NSTableView { /** - Registers a class to use when creating new cells in the table view. + Registers a view class for the specified identifier, so that view-based table views can use it to instantiate views. - Use this method to register the classes that represent cells in your table view. When you request an cell using the ``makeView(for:)`` method, the table view recycles an existing cell with the same class or creates a new one by instantiating your class. - - - Parameter cellClass: The table cell view class to register. + Use this method to associate the view class with the specified identifier. When you request a view using ``makeView(for:)``, the table view recycles an existing view with the same class or creates a new one by instantiating your class. + + - Parameter viewClass: The view class to register. */ - public func register(_ cellClass: NSTableCellView.Type) { - register(cellClass, forIdentifier: .init(cellClass)) + public func register(_ viewClass: NSView.Type) { + register(viewClass, forIdentifier: .init(viewClass)) } - func register(_ cellClass: NSTableCellView.Type, forIdentifier identifier: NSUserInterfaceItemIdentifier) { - Self.swizzleCellRegistration() - registeredCellsByIdentifier[identifier] = cellClass - registeredCellsByIdentifier = registeredCellsByIdentifier + func register(_ viewClass: NSView.Type, forIdentifier identifier: NSUserInterfaceItemIdentifier) { + Self.swizzleViewRegistration() + registeredClassesByIdentifier[identifier] = viewClass + registeredClassesByIdentifier = registeredClassesByIdentifier } /** - Returns a new or existing view with the specified table cell class. + Returns a new or existing view with the specified view class. - The be able to create a table view cell from a cell class, you have to register it first via ``register(_:)``. + To be able to create a reusable view using this method, you have to register it first via ``register(_:)``. When this method is called, the table view automatically instantiates the cell view with the specified owner, which is usually the table view’s delegate. (The owner is useful in setting up outlets and target/actions from the view.). - This method may also return a reused cell view with the same class that is no longer available on screen. If the cell class isn't registered, the cell can’t be instantiated or can't found in the reuse queue, this method returns nil. + This method may return a reused view with the same class that is no longer available on screen. - This method is usually called by the delegate in `tableView(_:viewFor:row:)`, but it can also be overridden to provide custom views for cell class. Note that `awakeFromNib()` is called each time this method is called, which means that `awakeFromNib` is also called on owner, even though the owner is already awake. + Note that `awakeFromNib()` is called each time this method is called. - - Parameter cellClass: The class of the table cell view. + - Parameter viewClass: The class of the view. - - Returns:The table cell view, or `nil` if the cell class isn't registered or the cell couldn't be created. + - Returns:The view, or `nil` if the view class isn't registered or the view couldn't be created. */ - public func makeView(for cellClass: TableCellView.Type) -> TableCellView? { - makeView(for: cellClass, withIdentifier: .init(cellClass)) + public func makeView(for viewClass: View.Type) -> View? { + makeView(for: viewClass, withIdentifier: .init(viewClass)) } - func makeView(for _: TableCellView.Type, withIdentifier identifier: NSUserInterfaceItemIdentifier) -> TableCellView? { - makeView(withIdentifier: identifier, owner: nil) as? TableCellView + func makeView(for _: View.Type, withIdentifier identifier: NSUserInterfaceItemIdentifier) -> View? { + makeView(withIdentifier: identifier, owner: nil) as? View } - /// The dictionary of all registered cells for view-based table view identifiers. - var registeredCellsByIdentifier: [NSUserInterfaceItemIdentifier: NSTableCellView.Type] { - get { getAssociatedValue("registeredCellsByIdentifier", initialValue: [:]) } - set { setAssociatedValue(newValue, key: "registeredCellsByIdentifier") } + /** + The dictionary of all registered classes for view-based table view identifiers. + + Each key in the dictionary is the identifier used to register the view class in the ``register(_:)``. The value of each key is the corresponding view class. + */ + public private(set) var registeredClassesByIdentifier: [NSUserInterfaceItemIdentifier: NSView.Type] { + get { getAssociatedValue("registeredClassesByIdentifier", initialValue: [:]) } + set { setAssociatedValue(newValue, key: "registeredClassesByIdentifier") } } - @objc func swizzled_register(_ nib: NSNib?, forIdentifier identifier: NSUserInterfaceItemIdentifier) { + @objc private func swizzled_register(_ nib: NSNib?, forIdentifier identifier: NSUserInterfaceItemIdentifier) { if nib == nil { - registeredCellsByIdentifier[identifier] = nil + registeredClassesByIdentifier[identifier] = nil } swizzled_register(nib, forIdentifier: identifier) } - @objc func swizzled_makeView(withIdentifier identifier: NSUserInterfaceItemIdentifier, owner: Any?) -> NSView? { + @objc private func swizzled_makeView(withIdentifier identifier: NSUserInterfaceItemIdentifier, owner: Any?) -> NSView? { if isEnablingAutomaticRowHeights { isEnablingAutomaticRowHeights = false return nil } - if let reconfigureIndexPath = reconfigureIndexPath, let cell = view(atColumn: reconfigureIndexPath.section, row: reconfigureIndexPath.item, makeIfNecessary: false) { - return cell + if let reconfigureIndexPath = reconfigureIndexPath { + if reconfigureIndexPath.section != -1, let cell = view(atColumn: reconfigureIndexPath.section, row: reconfigureIndexPath.item, makeIfNecessary: false) { + return cell + } else if reconfigureIndexPath.section == -1, let rowView = rowView(atRow: reconfigureIndexPath.item, makeIfNecessary: false) { + return rowView + } } - if let registeredCellClass = registeredCellsByIdentifier[identifier] { - if let tableCellView = swizzled_makeView(withIdentifier: identifier, owner: owner) { - return tableCellView + if let registeredViewClass = registeredClassesByIdentifier[identifier] { + if let view = swizzled_makeView(withIdentifier: identifier, owner: owner) { + return view } else { - let tableCellView = registeredCellClass.init(frame: .zero) - tableCellView.identifier = identifier - return tableCellView + let view = registeredViewClass.init(frame: .zero) + view.identifier = identifier + return view } } - return swizzled_makeView(withIdentifier: identifier, owner: owner) + let view = swizzled_makeView(withIdentifier: identifier, owner: owner) + return view } - static var didSwizzleCellRegistration: Bool { - get { FZSwiftUtils.getAssociatedValue("didSwizzleCellRegistration", object: NSTableView.self, initialValue: false) } - set { FZSwiftUtils.setAssociatedValue(newValue, key: "didSwizzleCellRegistration", object: NSTableView.self) } + private static var didSwizzleViewRegistration: Bool { + get { getAssociatedValue("didSwizzleViewRegistration") ?? false } + set { setAssociatedValue(newValue, key: "didSwizzleViewRegistration") } } - @objc static func swizzleCellRegistration() { - guard didSwizzleCellRegistration == false else { return } + static func swizzleViewRegistration() { + guard !didSwizzleViewRegistration else { return } do { try Swizzle(NSTableView.self) { #selector(makeView(withIdentifier:owner:)) <-> #selector(swizzled_makeView(withIdentifier:owner:)) #selector((register(_:forIdentifier:)) as (NSTableView) -> (NSNib?, NSUserInterfaceItemIdentifier) -> Void) <-> #selector(swizzled_register(_:forIdentifier:)) } - didSwizzleCellRegistration = true + didSwizzleViewRegistration = true } catch { Swift.debugPrint(error) } diff --git a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift index ce1902d4..ec9933df 100644 --- a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift +++ b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift @@ -124,7 +124,7 @@ public extension NSTableView { tableView.register(nib, forIdentifier: identifier) } } else { - if tableView.registeredCellsByIdentifier[identifier] != Cell.self { + if tableView.registeredClassesByIdentifier[identifier] != Cell.self { tableView.register(Cell.self, forIdentifier: identifier) } } From 35155594fbc8f9a8f96bec6a9f3415c23c7b757f Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 4 Jun 2025 05:03:45 +0200 Subject: [PATCH 15/42] Update TableViewDiffableDataSource.swift --- .../TableViewDiffableDataSource.swift | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 19007cdf..7f47d85e 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -822,6 +822,28 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData tableView.reconfigureRows(at: rows) } + /** + Updates the section header data for the specified sections. + + This method only updates section headers and not items of the section. It only works, if you provided ``sectionHeaderCellProvider-swift.property`` or section header registration using ``applySectionHeaderRegistration(_:)``. + */ + open func reloadSectionHeaders(_ sections: [Section]) { + guard sectionHeaderCellProvider != nil else { return } + let rows = IndexSet(sections.compactMap { row(for: $0) }) + // tableView.reloadData(forRowIndexes: <#T##IndexSet#>, columnIndexes: <#T##IndexSet#>) + } + + /** + Updates the section header data for the specified sections, preserving existing headers. + + This method only updates section headers and not items of the section. It only works, if you provided ``sectionHeaderCellProvider-swift.property`` or section header registration using ``applySectionHeaderRegistration(_:)``. + */ + open func reconfigureSectionHeaders(_ sections: [Section]) { + guard sectionHeaderCellProvider != nil else { return } + let rows = IndexSet(sections.compactMap { row(for: $0) }) + tableView.reconfigureRows(at: rows) + } + /// The items that are visible. open var visibleItems: [Item] { tableView.visibleRowIndexes().compactMap { item(forRow: $0) } From 91adfeb948e381afef5eefa5fd3b3e86b6d547d5 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 4 Jun 2025 06:41:21 +0200 Subject: [PATCH 16/42] Reload/reconfigure table view section header Reload/reconfigure table view section header --- .../TableViewDiffableDataSource.swift | 3 ++- .../NSTableView+ReconfigureRows.swift | 21 ++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 7f47d85e..571c0301 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -830,7 +830,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData open func reloadSectionHeaders(_ sections: [Section]) { guard sectionHeaderCellProvider != nil else { return } let rows = IndexSet(sections.compactMap { row(for: $0) }) - // tableView.reloadData(forRowIndexes: <#T##IndexSet#>, columnIndexes: <#T##IndexSet#>) + tableView.reloadData(forRowIndexes: rows, columnIndexes: IndexSet([0])) } /** @@ -842,6 +842,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData guard sectionHeaderCellProvider != nil else { return } let rows = IndexSet(sections.compactMap { row(for: $0) }) tableView.reconfigureRows(at: rows) + } /// The items that are visible. diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift index 7e847474..d1f5a039 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift @@ -28,14 +28,21 @@ extension NSTableView { let columns = tableColumns for row in indexes { - for (index, column) in columns.enumerated() { - if view(atColumn: index, row: row, makeIfNecessary: false) != nil { - reconfigureIndexPath = IndexPath(item: row, section: index) - _ = delegate.tableView?(self, viewFor: column, row: row) - } + if delegate.tableView?(self, isGroupRow: row) ?? false { if rowView(atRow: row, makeIfNecessary: false) != nil { - reconfigureIndexPath = IndexPath(item: row, section: -1) - _ = delegate.tableView?(self, rowViewForRow: row) + reconfigureIndexPath = IndexPath(item: row, section: 0) + _ = delegate.tableView?(self, viewFor: nil, row: row) + } + } else { + for (index, column) in columns.enumerated() { + if view(atColumn: index, row: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: index) + _ = delegate.tableView?(self, viewFor: column, row: row) + } + if rowView(atRow: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: -1) + _ = delegate.tableView?(self, rowViewForRow: row) + } } } } From 13fb52cb2d298922ec54bb72a5dbc2ef2ca97333 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 4 Jun 2025 06:50:51 +0200 Subject: [PATCH 17/42] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 11a4307f..569bfafd 100644 --- a/README.md +++ b/README.md @@ -241,3 +241,6 @@ Add `AdvancedCollectionTableView` to your app's `Package.swift` file, or selecti ``` If you clone the repo, you can run the sample app, which demonstrates most of the API`s. + +### Known bugs +- `OutlineViewDiffableDataSource`: Dragging rows isn't working. From 8dd24168b600533fdddaa23f61d6b0f5c1a80286 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 4 Jun 2025 06:58:44 +0200 Subject: [PATCH 18/42] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 569bfafd..e32f965d 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ A framework for NSCollectionView, NSTableView and NSOutlineView. It provides a collection of classes and extensions, many of them being ports of missing UIKit APIs. +**Always use the main branch, as else the code might not compile probably.** + **Take a look at the included sample app which demonstrates most features.** **For a full documentation take a look at the** [Online Documentation](https://swiftpackageindex.com/flocked/AdvancedCollectionTableView/documentation/). @@ -237,10 +239,13 @@ collectionViewItem.quicklookPreview = URL(fileURLWithPath: "someFile.png") Add `AdvancedCollectionTableView` to your app's `Package.swift` file, or selecting `File -> Add Package Dependencies in Xcode: ```swift -.package(url: "https://github.com/flocked/AdvancedCollectionTableView") +.package(url: "https://github.com/flocked/AdvancedCollectionTableView",) ``` +**Always use the main branch, as else the code might not compile probably.** + If you clone the repo, you can run the sample app, which demonstrates most of the API`s. ### Known bugs - `OutlineViewDiffableDataSource`: Dragging rows isn't working. +- All diffable datasources: Some inconsistency for dropping content and dragging out rows/items. From 094735ce186ccf19d26eb50cd0eb0d72fa44bcce Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 4 Jun 2025 07:01:07 +0200 Subject: [PATCH 19/42] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e32f965d..e693ea21 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A framework for NSCollectionView, NSTableView and NSOutlineView. It provides a collection of classes and extensions, many of them being ports of missing UIKit APIs. -**Always use the main branch, as else the code might not compile probably.** +**Always use the main branch, as else the package might not compile probably.** **Take a look at the included sample app which demonstrates most features.** From 938bb8790a5819c8a326a84e5af3b3f8e52ab448 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Sat, 28 Jun 2025 08:02:26 +0200 Subject: [PATCH 20/42] updated --- .../xcshareddata/swiftpm/Package.resolved | 4 +- Example/Example/Base.lproj/Main.storyboard | 2 +- Example/Example/MainViewController.swift | 12 +- .../OutlineSidebarViewController.swift | 8 +- .../Example/TableSidebarViewController.swift | 21 ++-- .../NSListContentConfiguration+Image.swift | 4 +- .../Configurations/Shared/Protocols.swift | 26 ++++ .../OutlineViewDiffableDataSource.swift | 12 +- ...TableViewDiffableDataSource+Delegate.swift | 119 +++++++++++++++++- .../TableViewDiffableDataSource.swift | 1 + ...tConfiguration+Image+Position+Horizonal.md | 10 ++ ...ntConfiguration+Image+Position+Vertical.md | 9 ++ ...ListContentConfiguration+Image+Position.md | 12 ++ ...SListContentConfiguration+Image+Scaling.md | 10 ++ ...NSListContentConfiguration+Image+Sizing.md | 12 ++ .../NSListContentConfiguration+Image.md | 8 +- .../NSListContentConfiguration.md | 2 + .../States/NSItemConfigurationState.md | 5 +- .../States/NSListConfigurationState.md | 5 +- .../CollectionViewDiffableDataSource.md | 5 + ...ableDataSource-Protocol-Implementations.md | 2 + .../OutlineViewDiffableDataSource.md | 16 ++- .../TableViewDiffableDataSource.md | 6 + .../NSTableView+ReconfigureRows.swift | 32 +++++ 24 files changed, 310 insertions(+), 33 deletions(-) create mode 100644 Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position+Horizonal.md create mode 100644 Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position+Vertical.md create mode 100644 Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position.md create mode 100644 Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Scaling.md create mode 100644 Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Sizing.md diff --git a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8a9aa3f1..a7dd6859 100644 --- a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -16,7 +16,7 @@ "location" : "https://github.com/flocked/FZSwiftUtils.git", "state" : { "branch" : "main", - "revision" : "5af861b31f0128f4edf2bb4ae5e8868345631f71" + "revision" : "23ce00567210d61699987e99a2df7b062f221beb" } }, { @@ -25,7 +25,7 @@ "location" : "https://github.com/flocked/FZUIKit.git", "state" : { "branch" : "main", - "revision" : "2524cf36f5a2174a3ae51ce413b940a7d040961c" + "revision" : "fdecc53dcd26e139612da704f308e3abfc26f904" } } ], diff --git a/Example/Example/Base.lproj/Main.storyboard b/Example/Example/Base.lproj/Main.storyboard index 7e625f5e..4dbdbbe2 100644 --- a/Example/Example/Base.lproj/Main.storyboard +++ b/Example/Example/Base.lproj/Main.storyboard @@ -1,7 +1,6 @@ - @@ -975,6 +974,7 @@ Favorite table cells by swiping left and delete them by swiping right. + Reorder items and table cells by dragging them and delete them via backspace. Quicklook collection items via spacebar and favorite them by right-clicking them. Favorite table cells by swiping left and delete them by swiping right. diff --git a/Example/Example/MainViewController.swift b/Example/Example/MainViewController.swift index c60bdc7f..e744d634 100644 --- a/Example/Example/MainViewController.swift +++ b/Example/Example/MainViewController.swift @@ -54,21 +54,23 @@ class MainViewController: NSViewController { collectionView.dataSource = dataSource /// Enables deleting selected items via backspace key. - dataSource.deletingHandlers.canDelete = { selectedItems in return selectedItems } + dataSource.deletingHandlers.canDelete = { selectedItems in + return selectedItems + } dataSource.deletingHandlers.didDelete = { deletedItems, _ in self.galleryItems.remove(deletedItems) } /// Enables reordering selected items by dragging them. - dataSource.reorderingHandlers.canReorder = { selectedItems in return true } + dataSource.reorderingHandlers.canReorder = { selectedItems in + return true + } dataSource.reorderingHandlers.didReorder = { transaction in self.galleryItems = self.galleryItems.applying(transaction.difference)! } dataSource.rightClickHandler = { selectedItems in - selectedItems.forEach({ item in - item.isFavorite = !item.isFavorite - }) + selectedItems.forEach({ item in item.isFavorite = !item.isFavorite }) /// Reconfigurates items without reloading them by calling the item registration handler. self.dataSource.reconfigureElements(selectedItems) } diff --git a/Example/Example/OutlineSidebarViewController.swift b/Example/Example/OutlineSidebarViewController.swift index a98f9d97..09fbd8e4 100644 --- a/Example/Example/OutlineSidebarViewController.swift +++ b/Example/Example/OutlineSidebarViewController.swift @@ -29,10 +29,14 @@ class OutlineSidebarViewController: NSViewController { dataSource.applyGroupItemCellRegistration(cellRegistration) /// Enables reordering selected rows by dragging them. - dataSource.reorderingHandlers.canReorder = { _,_ in return true } + dataSource.reorderingHandlers.canReorder = { selectedItems, newParentItem in + return selectedItems + } /// Enables deleting selected items via backspace key. - dataSource.deletingHandlers.canDelete = { items in return items } + dataSource.deletingHandlers.canDelete = { selectedItems in + return selectedItems + } applySnapshot() } diff --git a/Example/Example/TableSidebarViewController.swift b/Example/Example/TableSidebarViewController.swift index f646ca51..1a3794ce 100644 --- a/Example/Example/TableSidebarViewController.swift +++ b/Example/Example/TableSidebarViewController.swift @@ -16,8 +16,8 @@ class TableSidebarViewController: NSViewController { @IBOutlet var tableView: NSTableView! lazy var dataSource = DataSource(tableView: tableView, cellRegistration: cellRegistration) - - let cellRegistration = CellRegistration { tableCell, _, _, sidebarItem in + + let cellRegistration = CellRegistration { tableCell, _, row, sidebarItem in /// `defaultContentConfiguration` returns a table cell content configuration with default styling based on the table view it's displayed at (in this case a sidebar table). var configuration = tableCell.defaultContentConfiguration() configuration.text = sidebarItem.title @@ -36,15 +36,21 @@ class TableSidebarViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() - + + tableView.draggingDestinationFeedbackStyle = .gap tableView.dataSource = dataSource dataSource.applySectionHeaderRegistration(sectionHeaderRegistration) /// Enables reordering selected rows by dragging them. - dataSource.reorderingHandlers.canReorder = { selectedItems in return selectedItems } + dataSource.reorderingHandlers.canReorder = { selectedItems in + return selectedItems + } + /// Enables deleting selected rows via backspace key. - dataSource.deletingHandlers.canDelete = { selectedItems in return selectedItems } + dataSource.deletingHandlers.canDelete = { selectedItems in + return selectedItems + } /// Enable dropping strings to the table view by checking if the drop contains strings. dataSource.droppingHandlers.canDrop = { drop in @@ -74,17 +80,16 @@ class TableSidebarViewController: NSViewController { }] } } - applySnapshot() } - func applySnapshot() { + func applySnapshot(_ option: NSDiffableDataSourceSnapshotApplyOption = .usingReloadData) { var snapshot = dataSource.emptySnapshot() snapshot.appendSections([.main, .section2, .section3]) snapshot.appendItems(SidebarItem.sampleItems1, toSection: .main) snapshot.appendItems(SidebarItem.sampleItems2, toSection: .section2) snapshot.appendItems(SidebarItem.sampleItems3, toSection: .section3) - dataSource.apply(snapshot, .usingReloadData) + dataSource.apply(snapshot, option) } @IBAction func segmentedPressed(_ segmentedControl: NSSegmentedControl) { diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Image.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Image.swift index bebef9e5..d3b9a537 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Image.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Image.swift @@ -35,7 +35,7 @@ public extension NSListContentConfiguration { } /// The scaling of the image. - public enum Scaling: Int, Hashable { + public enum ImageScaling: Int, Hashable { /// The image is resized to fit the bounds rectangle, preserving the aspect of the image. If the image does not completely fill the bounds rectangle, the image is centered in the partial axis. case scaleToFit /// The image is resized to completely fill the bounds rectangle, while still preserving the aspect of the image. @@ -217,7 +217,7 @@ public extension NSListContentConfiguration { public var symbolConfiguration: ImageSymbolConfiguration? = .font(.body) /// The image scaling. - public var scaling: Scaling = .scaleToFit + public var scaling: ImageScaling = .scaleToFit /// The sizing option for the image. public var sizing: Sizing = .totalTextHeight diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/Shared/Protocols.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/Shared/Protocols.swift index 9e08c7f1..60704717 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/Shared/Protocols.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/Shared/Protocols.swift @@ -16,3 +16,29 @@ extension NSHostingConfiguration: AutomaticHeightSizable { } /// Content configuration views with editable text fields. protocol EditingContentView: NSView { } + +/// A type that can be dragged to a destination suporting the provided drag conten. +protocol Draggable { + /// The drag content. Provide an empty array to prevent dragging. + var dragContent: [PasteboardWriting] { get } + /// The image representing the type while dragging. + var dragImage: NSImage? { get } + /// The method that get's called before the type drags to the specified screen location. + func willDrag(to screenLocation: CGPoint) + /// The method that get's called after the dragged to the specified screen location. + func didDrag(to screenLocation: CGPoint) +} + +extension Draggable { + var dragImage: NSImage? { + nil + } + + func willDrag(to screenLocation: CGPoint) { + + } + + func didDrag(to screenLocation: CGPoint) { + + } +} diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift index 4365c9bf..62c739ec 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource.swift @@ -47,6 +47,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV var hoveredRowObserver: KeyValueObservation? var delegate: Delegate! var draggedItems: [Item] = [] + var reorderingItems: [Item] = [] var draggedParent: Item? var draggedIndexes: [Int] = [] var canDrop = false @@ -859,6 +860,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV public func outlineView(_ outlineView: NSOutlineView, validateDrop info: any NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation { canDrop = false + reorderingItems = [] if info.draggingSource as? NSOutlineView === outlineView { if let item = item as? Item, draggedItems.contains(item) { return [] @@ -877,7 +879,9 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV return [] } */ - return reorderingHandlers.canReorder?(draggedItems, item as? Item) ?? true == true ? .move : [] + reorderingItems = reorderingHandlers.canReorder?(draggedItems, item as? Item) ?? [] + Swift.print("validate", draggedItems.count, reorderingItems.count) + return !reorderingItems.isEmpty ? .move : [] } if info.draggingSource as? NSTableView !== outlineView { if let canDrag = droppingHandlers.canDrop { @@ -890,6 +894,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV public func outlineView(_ outlineView: NSOutlineView, acceptDrop info: any NSDraggingInfo, item: Any?, childIndex index: Int) -> Bool { if info.draggingSource as? NSOutlineView === outlineView { + guard !reorderingItems.isEmpty else { return false } var snapshot = currentSnapshot var index = index if index == -1 { @@ -902,7 +907,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV if index == 0, let item = item as? Item, !snapshot.isExpanded(item) { index = snapshot.children(of: item).count } - snapshot.move(draggedItems, toIndex: index, of: item as? Item) + snapshot.move(reorderingItems, toIndex: index, of: item as? Item) let transaction = OutlineViewDiffableDataSourceTransaction(initial: currentSnapshot, final: snapshot) reorderingHandlers.willReorder?(transaction) apply(snapshot, reorderingHandlers.animates ? .animated : .withoutAnimation) @@ -925,6 +930,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV } public func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> (any NSPasteboardWriting)? { + Swift.print("pasteboardWriterForItem") guard let item = item as? Item else { return nil } return NSPasteboardItem(forItem: item) } @@ -972,7 +978,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV */ public struct ReorderingHandlers { /// The handler that determines if items can be reordered. The default value is `nil` which indicates that items can't be reordered. - public var canReorder: ((_ items: [Item], _ parent: Item?) -> Bool)? + public var canReorder: ((_ items: [Item], _ parent: Item?) -> [Item])? /// The handler that that gets called before reordering items. public var willReorder: ((_ transaction: OutlineViewDiffableDataSourceTransaction) -> Void)? diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource+Delegate.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource+Delegate.swift index 7ea4e6cb..d06858f1 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource+Delegate.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource+Delegate.swift @@ -18,8 +18,6 @@ extension TableViewDiffableDataSource { super.init() dataSource.tableView.delegate = self } - - // MARK: - Selecting public func tableViewSelectionDidChange(_: Notification) { guard dataSource.selectionHandlers.didSelect != nil || dataSource.selectionHandlers.didDeselect != nil else { @@ -131,5 +129,122 @@ extension TableViewDiffableDataSource { func tableView(_ tableView: NSTableView, mouseDownInHeaderOf tableColumn: NSTableColumn) { dataSource.columnHandlers.didClickHeader?(tableColumn) } + + /* + // MARK: - TypeSelect + + + /// Matching type select strings by row. + var matchingTypeSelectStrings: [Int: [String: [String]]] = [:] + var previousSearchString = "" + + public func tableView(_ tableView: NSTableView, shouldTypeSelectFor event: NSEvent, + withCurrentSearch searchString: String?) -> Bool { + if searchString == nil { + matchingTypeSelectStrings = [:] + previousSearchString = "" + } + return true + } + + public func tableView(_ tableView: NSTableView, nextTypeSelectMatchFromRow startRow: Int, toRow endRow: Int, for searchString: String) -> Int { + let searchString = searchString.lowercased() + var rows: [Int] = [] + if endRow >= startRow { + rows = (startRow...endRow).map({$0}) + } else { + rows = (endRow.. [String] { + guard !self.tableView(tableView, isGroupRow: row) else { return (searchString, []) } + var matchingStrings: [String] = [] + let columns = tableView.selectedColumnIndexes.isEmpty ? IndexSet(integersIn: 0.. Bool { + Swift.print("shouldTypeSelect", event.type.description, event.charactersIgnoringModifiers, searchString ?? "") + return true + } + + public func tableView(_ tableView: NSTableView, nextTypeSelectMatchFromRow startRow: Int, toRow endRow: Int, for searchString: String) -> Int { + Swift.print("nextTypeSelect", searchString, startRow, endRow) + return startRow + } + + public func tableView(_ tableView: NSTableView, typeSelectStringFor tableColumn: NSTableColumn?, row: Int) -> String? + + + if let tableColumn = tableColumn { + if let column = tableView.tableColumns.firstIndex(where: { $0 === tableColumn }), let view = tableView.view(atColumn: column, row: row, makeIfNecessary: false) { + return view.subviews(type: NSTextField.self, depth: .max).map({$0.stringValue}).joined(separator: " ") + } + } else if let view = dataSource.tableView.rowView(atRow: row, makeIfNecessary: false) { + return view.subviews(type: NSTextField.self, depth: .max).map({$0.stringValue}).joined(separator: " ") + } +return nil + + } + */ } } + +/* + protocol TextSearchableView: NSView { + var searchableText: String? { get } + } + + extension NSTextField: TextSearchableView { + var searchableText: String? { + guard !isHidden && alphaValue > 0 else { return nil } + return stringValue.lowercased() + } + } + + extension NSTextView: TextSearchableView { + var searchableText: String? { + guard !isHidden && alphaValue > 0 else { return nil } + return string.lowercased() + } + } + */ diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 571c0301..143e1f55 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -509,6 +509,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData // MARK: Dropping open func tableView(_ tableView: NSTableView, validateDrop draggingInfo: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation { + Swift.print("validateDrop") canDrop = false dropTargetRow = nil if !dragingRowIndexes.isEmpty { diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position+Horizonal.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position+Horizonal.md new file mode 100644 index 00000000..a7a33266 --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position+Horizonal.md @@ -0,0 +1,10 @@ +# ``NSListContentConfiguration/ImageProperties-swift.struct/Position-swift.enum/HorizontalPosition`` + +## Topics + +### Horizonral position + +- ``top`` +- ``center`` +- ``bottom`` +- ``firstBaseline`` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position+Vertical.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position+Vertical.md new file mode 100644 index 00000000..5ff43488 --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position+Vertical.md @@ -0,0 +1,9 @@ +# ``NSListContentConfiguration/ImageProperties-swift.struct/Position-swift.enum/VerticalPosition`` + +## Topics + +### Vertical position + +- ``leading`` +- ``center`` +- ``trailing`` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position.md new file mode 100644 index 00000000..84425c30 --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Position.md @@ -0,0 +1,12 @@ +# ``NSListContentConfiguration/ImageProperties-swift.struct/Position-swift.enum`` + +## Topics + +### Image position + +- ``leading(_:)`` +- ``trailing(_:)`` +- ``bottom(_:)`` +- ``top(_:)`` +- ``NSListContentConfiguration/ImageProperties-swift.struct/Position-swift.enum/HorizontalPosition```` +- ``NSListContentConfiguration/ImageProperties-swift.struct/Position-swift.enum/VerticalPosition```` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Scaling.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Scaling.md new file mode 100644 index 00000000..617be26e --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Scaling.md @@ -0,0 +1,10 @@ +# ``NSListContentConfiguration/ImageProperties-swift.struct/ImageScaling-swift.enum`` + +## Topics + +### Image scaling + +- ``scaleToFit`` +- ``scaleToFill`` +- ``resize`` +- ``none`` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Sizing.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Sizing.md new file mode 100644 index 00000000..dcc9f299 --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image+Sizing.md @@ -0,0 +1,12 @@ +# ``NSListContentConfiguration/ImageProperties-swift.struct/Scaling-swift.enum`` + +## Topics + +### Image sizing + +- ``firstTextHeight`` +- ``totalTextHeight`` +- ``size(_:)`` +- ``maxiumSize(width:height:)`` +- ``relative(_:)`` +- ``none`` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image.md index 11ae9237..7082d25d 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration+Image.md @@ -2,10 +2,10 @@ ## Topics -### Configuring scaling +### Configuring image scaling -- ``scaling-swift.property`` -- ``Scaling-swift.enum`` +- ``scaling`` +- ``ImageScaling-swift.enum`` ### Configuring symbol configuration @@ -46,3 +46,5 @@ - ``Sizing-swift.enum`` - ``position-swift.property`` - ``Position-swift.enum`` +- ``reservedLayoutSize`` +- ``standardDimension`` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration.md index b41d55dd..2befa5eb 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/Configurations/ListContentConfiguration/NSListContentConfiguration.md @@ -49,8 +49,10 @@ - ``imageToTextPadding`` - ``textToSecondaryTextPadding`` +- ``textToSecondaryTextHorizontalPadding`` - ``textToBadgePadding`` - ``margins`` +- ``prefersSideBySideTextAndSecondaryText`` ### Creating a content view diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/States/NSItemConfigurationState.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/States/NSItemConfigurationState.md index 21d48939..94032f61 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/States/NSItemConfigurationState.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/States/NSItemConfigurationState.md @@ -4,17 +4,18 @@ ### Creating item configuration states -- ``init(isSelected:highlight:isEditing:activeState:isHovered:isReordering:isDropTarget:)`` +- ``init()`` ### Managing item configuration states - ``isSelected`` -- ``activeState-swift.property`` - ``isEditing`` - ``isHovered`` - ``isDropTarget`` - ``isReordering`` +- ``isDragging`` - ``highlight`` +- ``activeState-swift.property`` - ``ActiveState-swift.enum`` ### Creating a configuration state manually diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/States/NSListConfigurationState.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/States/NSListConfigurationState.md index 7dfc861a..b9dda741 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/States/NSListConfigurationState.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/Configuration/States/NSListConfigurationState.md @@ -4,19 +4,20 @@ ### Creating list configuration states -- ``init(isSelected:isEnabled:isHovered:isEditing:activeState:isReordering:isDropTarget:isNextSelected:isPreviousSelected:)`` +- ``init()`` ### Managing list configuration states - ``isSelected`` - ``isEditing`` -- ``activeState-swift.property`` - ``isPreviousSelected`` - ``isNextSelected`` - ``isEnabled`` - ``isHovered`` - ``isDropTarget`` - ``isReordering`` +- ``isDragging`` +- ``activeState-swift.property`` - ``ActiveState-swift.enum`` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/CollectionViewDiffableData/CollectionViewDiffableDataSource.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/CollectionViewDiffableData/CollectionViewDiffableDataSource.md index ac613a3a..02817e19 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/CollectionViewDiffableData/CollectionViewDiffableDataSource.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/CollectionViewDiffableData/CollectionViewDiffableDataSource.md @@ -47,6 +47,7 @@ ### Configurating user interaction - ``menuProvider`` +- ``doubleClickHandler`` - ``rightClickHandler`` ### Displaying empty view @@ -59,6 +60,10 @@ - ``isQuicklookPreviewable`` - ``quicklookElements(_:current:)`` +- ``previewImage(for:)`` +- ``previewImage(for:size:)`` +- ``previewImage(for:width:)`` +- ``previewImage(for:height:)`` ### Supporting prefetching elements diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/OutlineViewDiffableDataSource/OutlineViewDiffableDataSource-Protocol-Implementations.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/OutlineViewDiffableDataSource/OutlineViewDiffableDataSource-Protocol-Implementations.md index 69036235..c1b45c10 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/OutlineViewDiffableDataSource/OutlineViewDiffableDataSource-Protocol-Implementations.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/OutlineViewDiffableDataSource/OutlineViewDiffableDataSource-Protocol-Implementations.md @@ -21,3 +21,5 @@ The diffable data source type conforms to `NSOutlineViewDataSource`. - ``OutlineViewDiffableDataSource/outlineView(_:validateDrop:proposedItem:proposedChildIndex:)`` - ``OutlineViewDiffableDataSource/outlineView(_:acceptDrop:item:childIndex:)`` - ``OutlineViewDiffableDataSource/outlineView(_:pasteboardWriterForItem:)`` + +- ``OutlineViewDiffableDataSource/outlineView(_:updateDraggingItemsForDrag:)`` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/OutlineViewDiffableDataSource/OutlineViewDiffableDataSource.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/OutlineViewDiffableDataSource/OutlineViewDiffableDataSource.md index f9881b2e..34be67bd 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/OutlineViewDiffableDataSource/OutlineViewDiffableDataSource.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/OutlineViewDiffableDataSource/OutlineViewDiffableDataSource.md @@ -49,11 +49,12 @@ ### Configurating user interaction - ``menuProvider`` +- ``doubleClickHandler`` - ``rightClickHandler`` ### Providing tint configurations -``tintConfigurationProvider`` +- ``tintConfigurationProvider`` ### Displaying empty view @@ -104,6 +105,19 @@ - ``isQuicklookPreviewable`` - ``quicklookItems(_:current:)`` +- ``previewImage(for:)-56vem`` +- ``previewImage(for:tableColumn:)`` +- ``previewImage(for:)-6noxj`` + +Managing drag interaction + +- ``draggingHandlers-swift.property`` +- ``DraggingHandlers-swift.struct`` + +Managing drop interaction + +- ``droppingHandlers-swift.property`` +- ``DroppingHandlers-swift.struct`` ### Supporting protocol requirements diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/TableViewDiffableDataSource/TableViewDiffableDataSource.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/TableViewDiffableDataSource/TableViewDiffableDataSource.md index 7924a914..70b97b9a 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/TableViewDiffableDataSource/TableViewDiffableDataSource.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/DiffableDataSource/TableViewDiffableDataSource/TableViewDiffableDataSource.md @@ -44,6 +44,8 @@ - ``sections`` - ``row(for:)-3rckc`` - ``scrollToSection(_:)`` +- ``reloadSectionHeaders(_:)`` +- ``reconfigureSectionHeaders(_:)`` ### Updating data @@ -55,6 +57,7 @@ ### Configurating user interaction - ``menuProvider`` +- ``doubleClickHandler`` - ``rightClickHandler`` - ``rowActionProvider`` @@ -98,6 +101,9 @@ - ``isQuicklookPreviewable`` - ``quicklookItems(_:current:)`` +- ``previewImage(for:)-3u1yi`` +- ``previewImage(for:tableColumn:)`` +- ``previewImage(for:)-5c512`` ### Managing drag interactions diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift index d1f5a039..6938f711 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift @@ -48,6 +48,38 @@ extension NSTableView { } reconfigureIndexPath = nil } + + public func reconfigureRows(at indexes: IndexSet, columns: [NSUserInterfaceItemIdentifier]) { + reconfigureRows(at: indexes, columns: IndexSet(columns.compactMap({ column(withIdentifier: $0) }))) + } + + public func reconfigureRows(at rows: IndexSet, columns: IndexSet) { + Self.swizzleViewRegistration() + guard let delegate = delegate else { return } + let tableColumns = tableColumns + let columns = columns.filter({ $0 < tableColumns.count }) + guard columns.isEmpty else { return } + for row in rows.filter({$0 < numberOfRows}) { + if delegate.tableView?(self, isGroupRow: row) ?? false { + if rowView(atRow: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: 0) + _ = delegate.tableView?(self, viewFor: nil, row: row) + } + } else { + for column in columns { + if view(atColumn: column, row: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: column) + _ = delegate.tableView?(self, viewFor: tableColumns[column], row: row) + } + if rowView(atRow: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: -1) + _ = delegate.tableView?(self, rowViewForRow: row) + } + } + } + } + reconfigureIndexPath = nil + } var reconfigureIndexPath: IndexPath? { get { getAssociatedValue("reconfigureIndexPath") } From 8f841f3cc059978c31862a8de106cc117b2297e9 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Fri, 4 Jul 2025 03:46:58 +0200 Subject: [PATCH 21/42] updated --- .../NSTableView+/NSTableCellVew+.swift | 20 +++++++++---------- .../NSTableView+/NSTableRowView+.swift | 20 +++++++++---------- .../Shared/TableCollectionObserverView.swift | 2 +- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift index 2b1ad7ca..894f82bc 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift @@ -292,17 +292,15 @@ extension NSTableCellView { } func observeWillMoveToRowView() { - if let tableView = tableView { - tableView.enableAutomaticRowHeights() - } else if !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) { - do { - try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { - object, selector, superview in - (superview as? NSTableRowView)?.observeWillMoveToTableView() - } as @convention(block) (AnyObject, Selector, NSView?) -> ()) - } catch { - Swift.print(error) - } + guard !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) else { return } + tableView?.enableAutomaticRowHeights() + do { + try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { + object, selector, superview in + (superview as? NSTableRowView)?.observeWillMoveToTableView() + } as @convention(block) (AnyObject, Selector, NSView?) -> ()) + } catch { + Swift.print(error) } } } diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift index 72a1c5e8..c91ee2c8 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift @@ -263,17 +263,15 @@ extension NSTableRowView { } func observeWillMoveToTableView() { - if let tableView = tableView { - tableView.enableAutomaticRowHeights() - } else if !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) { - do { - try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { - object, selector, superview in - (superview as? NSTableView)?.enableAutomaticRowHeights() - } as @convention(block) (AnyObject, Selector, NSView?) -> ()) - } catch { - Swift.print(error) - } + guard !isMethodHooked(#selector(NSView.viewWillMove(toSuperview:))) else { return } + tableView?.enableAutomaticRowHeights() + do { + try hookBefore(#selector(NSView.viewWillMove(toSuperview:)), closure: { + object, selector, superview in + (superview as? NSTableView)?.enableAutomaticRowHeights() + } as @convention(block) (AnyObject, Selector, NSView?) -> ()) + } catch { + Swift.print(error) } } } diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/Shared/TableCollectionObserverView.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/Shared/TableCollectionObserverView.swift index 08d106ba..4ce258fc 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/Shared/TableCollectionObserverView.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/Shared/TableCollectionObserverView.swift @@ -61,7 +61,7 @@ class TableCollectionObserverView: NSView { sendToBack() updateTrackingAreas() focusObservation = observeChanges(for: \.window?.firstResponder) { [weak self] oldValue, newValue in - guard let self = self, let _view = self.collectionView ?? self.tableView else { return } + guard let self = self, let _view = self.collectionView ?? self.tableView else { return } if let view = (newValue as? NSView ?? (newValue as? NSText)?.delegate as? NSView), view.isDescendant(of: _view) { self.isFocused = true self.editingView = (view as? EditiableView)?.isEditable == true ? view : nil From 13a2022cd6d2878a67618850dd313dbd6791b130 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 16 Jul 2025 20:29:35 +0200 Subject: [PATCH 22/42] updated --- .../NSCollectionView+/NSCollectionViewItem+.swift | 2 +- .../Extensions/NSTableView+/NSTableCellVew+.swift | 4 ++-- .../Extensions/NSTableView+/NSTableRowView+.swift | 2 +- .../Shared/TableCollectionObserverView.swift | 9 +++++++-- .../States/NSItemConfigurationState.swift | 14 ++++++++++++-- .../States/NSListConfigurationState.swift | 9 ++++++++- .../OutlineViewDiffableDataSource+Delegate.swift | 2 +- .../Snapshot/OutlineChangeInstruction.swift | 2 +- .../NSTableView/TableViewDiffableDataSource.swift | 4 ++-- 9 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift index cedd9762..57644a3a 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift @@ -178,7 +178,7 @@ extension NSCollectionViewItem { */ @objc open var configurationState: NSItemConfigurationState { let isSelected = isRightClickSelected == true ? true : isSelected - let state = NSItemConfigurationState(isSelected: isSelected, highlight: highlightState, isEditing: isEditing, activeState: activeState, isHovered: isHovered, isDragging: isDragging, isReordering: isReordering, isDropTarget: isDropTarget) + let state = NSItemConfigurationState(isSelected: isSelected, highlight: highlightState, isEditing: isEditing, activeState: activeState, isHovered: isHovered, isDragging: isDragging, isReordering: isReordering, isDropTarget: isDropTarget, appearance: view.effectiveAppearance) return state } diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift index 894f82bc..59e8d469 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift @@ -117,7 +117,7 @@ extension NSTableCellView { let tableView = tableView let activeState = tableView?.activeState ?? .inactive let isEditing = tableView?.editingView?.isDescendant(of: self) == true - return NSListConfigurationState(isSelected: rowView?.isSelected ?? false, isEnabled: rowView?.isEnabled ?? true, isHovered: rowView?.isHovered ?? false, isEditing: isEditing, activeState: activeState, isReordering: rowView?.isReordering ?? false, isDropTarget: rowView?.isDropTarget ?? false, isNextSelected: rowView?.isNextRowSelected ?? false, isPreviousSelected: rowView?.isPreviousRowSelected ?? false) + return NSListConfigurationState(isSelected: rowView?.isSelected ?? false, isEnabled: rowView?.isEnabled ?? true, isHovered: rowView?.isHovered ?? false, isEditing: isEditing, activeState: activeState, isReordering: rowView?.isReordering ?? false, isDropTarget: rowView?.isDropTarget ?? false, isNextSelected: rowView?.isNextRowSelected ?? false, isPreviousSelected: rowView?.isPreviousRowSelected ?? false, appearance: effectiveAppearance) } /** @@ -263,7 +263,7 @@ extension NSTableCellView { func updateContentConfigurationStyle() { if let configuration = (contentConfiguration as? NSListContentConfiguration)?.updated(for: self) { setAssociatedValue(configuration, key: "contentConfiguration") - NSAnimationContext.runNonAnimated { + NSAnimationContext.performWithoutAnimation { contentView?.configuration = configuration } } diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift index c91ee2c8..cbeec651 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableRowView+.swift @@ -121,7 +121,7 @@ extension NSTableRowView { let tableView = tableView let activeState = tableView?.activeState ?? .inactive let isEditing = tableView?.editingView?.isDescendant(of: self) == true - let state = NSListConfigurationState(isSelected: isSelected, isEnabled: isEnabled, isHovered: isHovered, isEditing: isEditing, activeState: activeState, isNextSelected: isNextRowSelected, isPreviousSelected: isPreviousRowSelected) + let state = NSListConfigurationState(isSelected: isSelected, isEnabled: isEnabled, isHovered: isHovered, isEditing: isEditing, activeState: activeState, isNextSelected: isNextRowSelected, isPreviousSelected: isPreviousRowSelected, appearance: effectiveAppearance) return state } diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/Shared/TableCollectionObserverView.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/Shared/TableCollectionObserverView.swift index 4ce258fc..92d4f023 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/Shared/TableCollectionObserverView.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/Shared/TableCollectionObserverView.swift @@ -16,6 +16,7 @@ class TableCollectionObserverView: NSView { weak var tableView: NSTableView? var focusObservation: KeyValueObservation? var isEnabledObservation: KeyValueObservation? + var appearanceObservation: KeyValueObservation? var isFocused = false { didSet { @@ -60,8 +61,13 @@ class TableCollectionObserverView: NSView { isFocused = view.isDescendantFirstResponder sendToBack() updateTrackingAreas() + appearanceObservation = observeChanges(for: \.effectiveAppearance) { [weak self] oldValue, newValue in + guard let self = self else { return } + self.tableView?.visibleRows().forEach { $0.setNeedsAutomaticUpdateConfiguration() } + self.collectionView?.visibleItems().forEach { $0.setNeedsAutomaticUpdateConfiguration() } + } focusObservation = observeChanges(for: \.window?.firstResponder) { [weak self] oldValue, newValue in - guard let self = self, let _view = self.collectionView ?? self.tableView else { return } + guard let self = self, let _view = self.collectionView ?? self.tableView else { return } if let view = (newValue as? NSView ?? (newValue as? NSText)?.delegate as? NSView), view.isDescendant(of: _view) { self.isFocused = true self.editingView = (view as? EditiableView)?.isEditable == true ? view : nil @@ -105,7 +111,6 @@ class TableCollectionObserverView: NSView { } } } else if let tableView = tableView { - let location = event.location(in: tableView) tableView.hoveredRow = tableView.row(at: event.location(in: tableView)) } } diff --git a/Sources/AdvancedCollectionTableView/Configuration/States/NSItemConfigurationState.swift b/Sources/AdvancedCollectionTableView/Configuration/States/NSItemConfigurationState.swift index bcf4276a..e22c300b 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/States/NSItemConfigurationState.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/States/NSItemConfigurationState.swift @@ -40,6 +40,7 @@ public struct NSItemConfigurationState: NSConfigurationState, Hashable { activeState != .inactive } + /// The active state of an item. public var activeState: ActiveState = .inactive { didSet { self["activeState"] = activeState.rawValue } } @@ -85,6 +86,9 @@ public struct NSItemConfigurationState: NSConfigurationState, Hashable { /// A Boolean value that indicates whether the item is the target of a drop operation. public var isDropTarget: Bool = false + + /// The appearance of the item. + public var appearance: NSAppearance? /// A Boolean value that indicates whether the item is in a enabled state. var isEnabled: Bool = true @@ -142,7 +146,8 @@ public struct NSItemConfigurationState: NSConfigurationState, Hashable { isHovered: Bool = false, isDragging: Bool = false, isReordering: Bool = false, - isDropTarget: Bool = false + isDropTarget: Bool = false, + appearance: NSAppearance? = nil ) { self.isEditing = isEditing self.isSelected = isSelected @@ -152,6 +157,7 @@ public struct NSItemConfigurationState: NSConfigurationState, Hashable { self.isDragging = isDragging self.isReordering = isReordering self.isDropTarget = isDropTarget + self.appearance = appearance self["isSelected"] = isSelected self["activeState"] = activeState.rawValue self["isItemState"] = true @@ -167,7 +173,8 @@ public struct NSItemConfigurationState: NSConfigurationState, Hashable { activeState: ActiveState, isReordering: Bool, isDropTarget: Bool, - customStates _: [NSConfigurationStateCustomKey: AnyHashable] = [:]) + appearance: NSAppearance?, + customStates: [NSConfigurationStateCustomKey: AnyHashable] = [:]) { self.isSelected = isSelected self.isEnabled = isEnabled @@ -179,6 +186,8 @@ public struct NSItemConfigurationState: NSConfigurationState, Hashable { self.activeState = activeState self.isReordering = isReordering self.isDropTarget = isDropTarget + self.appearance = appearance + self.customStates = customStates self["isSelected"] = isSelected self["activeState"] = activeState.rawValue self["isItemState"] = true @@ -200,6 +209,7 @@ extension NSItemConfigurationState: ReferenceConvertible { isDragging: \(isDragging) isDropTarget: \(isDropTarget) isReordering: \(isReordering) + appearance: \(appearance?.name.rawValue ?? "-") customStates: \(customStates) ) """ diff --git a/Sources/AdvancedCollectionTableView/Configuration/States/NSListConfigurationState.swift b/Sources/AdvancedCollectionTableView/Configuration/States/NSListConfigurationState.swift index bbbbf3db..c249e0d9 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/States/NSListConfigurationState.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/States/NSListConfigurationState.swift @@ -95,6 +95,9 @@ public struct NSListConfigurationState: NSConfigurationState, Hashable { /// A Boolean value that indicates whether the list item is the target of a drop operation. public var isDropTarget: Bool = false + + /// The appearance of the list item. + public var appearance: NSAppearance? /// A Boolean value that indicates whether the list item is in a focused state. var isFocused: Bool = false @@ -153,7 +156,8 @@ public struct NSListConfigurationState: NSConfigurationState, Hashable { isReordering: Bool = false, isDropTarget: Bool = false, isNextSelected: Bool = false, - isPreviousSelected: Bool = false) + isPreviousSelected: Bool = false, + appearance: NSAppearance? = nil) { self.isSelected = isSelected self.isEnabled = isEnabled @@ -179,6 +183,7 @@ public struct NSListConfigurationState: NSConfigurationState, Hashable { isDragging: Bool, isReordering: Bool, isDropTarget: Bool, + appearance: NSAppearance?, customStates: [NSConfigurationStateCustomKey: AnyHashable]) { self.isSelected = isSelected @@ -191,6 +196,7 @@ public struct NSListConfigurationState: NSConfigurationState, Hashable { self.isDragging = isDragging self.isReordering = isReordering self.isDropTarget = isDropTarget + self.appearance = appearance self.customStates = customStates self["activeState"] = activeState.rawValue self["isSelected"] = isSelected @@ -214,6 +220,7 @@ extension NSListConfigurationState: ReferenceConvertible { isReordering: \(isReordering) isNextSelected: \(isNextSelected) isPreviousSelected: \(isPreviousSelected) + appearance: \(appearance?.name.rawValue ?? "-") customStates: \(customStates) ) """ diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource+Delegate.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource+Delegate.swift index 54030e87..d7b432ee 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource+Delegate.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/OutlineViewDiffableDataSource+Delegate.swift @@ -125,7 +125,7 @@ extension OutlineViewDiffableDataSource { if self.outlineView(outlineView, isGroupItem: item), let groupItemCellProvider = dataSource.groupItemCellProvider { let rowView = outlineView.makeView(withIdentifier: "_GroupCellRowView", owner: self) as? GroupItemCellRowView ?? GroupItemCellRowView() rowView.identifier = "_GroupCellRowView" - NSAnimationContext.runNonAnimated { + NSAnimationContext.performWithoutAnimation { rowView.view = groupItemCellProvider(outlineView, item as! Item) } return rowView diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineChangeInstruction.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineChangeInstruction.swift index c67e6487..ad5cb0e7 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineChangeInstruction.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSOutlineView/Snapshot/OutlineChangeInstruction.swift @@ -104,7 +104,7 @@ extension NSOutlineView { expandCollapseItems() completion?() } else if let duration = option.animationDuration, duration > 0.0 { - NSView.animate(withDuration: duration, { + NSView.animate(withDuration: duration, changes: { applySnapshot() }, completion: completion) } else { diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 143e1f55..e52972f5 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -132,7 +132,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData dataSource.sectionHeaderViewProvider = { [weak self] tableView, row, sectionID in guard let self = self, let section = self.sections[id: sectionID] else { return NSTableCellView() } var view: NSTableCellView? - NSAnimationContext.runNonAnimated { + NSAnimationContext.performWithoutAnimation { view = sectionHeaderCellProvider(tableView, row, section) } return view ?? NSTableCellView() @@ -475,7 +475,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData [weak self] tableview, tablecolumn, row, itemID in guard let self = self, let item = self.items[id: itemID] else { return NSTableCellView() } var view: NSView? - NSAnimationContext.runNonAnimated { + NSAnimationContext.performWithoutAnimation { view = cellProvider(tableview, tablecolumn, row, item) } return view ?? NSTableCellView() From 0e427dfd6736195342495c25b1e22889659e9bf6 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Thu, 17 Jul 2025 09:55:47 +0200 Subject: [PATCH 23/42] updated --- .../NSItemContentConfiguration+Badge.swift | 4 ++-- .../NSItemContentConfiguration+Content.swift | 2 +- .../Accessory/NSListContentView+Accessory+Image.swift | 4 ++-- .../NSListContentConfiguration+Badge.swift | 4 ++-- .../NSListContentConfiguration+Image.swift | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentConfiguration+Badge.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentConfiguration+Badge.swift index 12d6b71e..65daeafd 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentConfiguration+Badge.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentConfiguration+Badge.swift @@ -105,10 +105,10 @@ public extension NSItemContentConfiguration { public var visualEffect: VisualEffectConfiguration? /// The border of the badge. - public var border: BorderConfiguration = .none() + public var border: BorderConfiguration = .none /// The shadow of the badge. - public var shadow: ShadowConfiguration = .none() + public var shadow: ShadowConfiguration = .none /// The margins between the text/image and the edges of the badge. public var margins = NSDirectionalEdgeInsets(width: 8, height: 4) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentConfiguration+Content.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentConfiguration+Content.swift index 429f07c7..a3d08c5f 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentConfiguration+Content.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentConfiguration+Content.swift @@ -68,7 +68,7 @@ public extension NSItemContentConfiguration { public var visualEffect: VisualEffectConfiguration? /// The border of the content. - public var border: BorderConfiguration = .none() + public var border: BorderConfiguration = .none /// The border transformer for resolving the border. public var borderTransformer: BorderTransformer? = nil diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/Accessory/NSListContentView+Accessory+Image.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/Accessory/NSListContentView+Accessory+Image.swift index 0234a7f1..015c244f 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/Accessory/NSListContentView+Accessory+Image.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/Accessory/NSListContentView+Accessory+Image.swift @@ -176,7 +176,7 @@ extension NSListContentConfiguration.AccessoryProperties { public var cornerRadius: CGFloat = 0.0 /// The border of the image. - public var border: BorderConfiguration = .none() + public var border: BorderConfiguration = .none /// The border transformer for resolving the border. public var borderTransformer: BorderTransformer? = nil @@ -187,7 +187,7 @@ extension NSListContentConfiguration.AccessoryProperties { } /// The shadow of the image. - public var shadow: ShadowConfiguration = .none() + public var shadow: ShadowConfiguration = .none /// The shadow transformer for resolving the shadow. public var shadowTransformer: ShadowTransformer? = nil diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Badge.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Badge.swift index a282e628..6951235c 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Badge.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Badge.swift @@ -89,10 +89,10 @@ public extension NSListContentConfiguration { } /// The border of the badge. - public var border: BorderConfiguration = .none() + public var border: BorderConfiguration = .none /// The shadow of the badge. - public var shadow: ShadowConfiguration = .none() + public var shadow: ShadowConfiguration = .none /// The margins between the text/image and the edges of the badge. public var margins = NSDirectionalEdgeInsets(top: 1, leading: 3, bottom: 1, trailing: 3) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Image.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Image.swift index d3b9a537..0c084517 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Image.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentConfiguration+Image.swift @@ -192,7 +192,7 @@ public extension NSListContentConfiguration { public var cornerRadius: CGFloat = 0.0 /// The border of the image. - public var border: BorderConfiguration = .none() + public var border: BorderConfiguration = .none /// The border transformer for resolving the border. public var borderTransformer: BorderTransformer? = nil @@ -203,7 +203,7 @@ public extension NSListContentConfiguration { } /// The shadow of the image. - public var shadow: ShadowConfiguration = .none() + public var shadow: ShadowConfiguration = .none /// The shadow transformer for resolving the shadow. public var shadowTransformer: ShadowTransformer? = nil From 458c898c5af9980930cc79b94578dfde9cbc772f Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 22 Jul 2025 20:23:14 +0200 Subject: [PATCH 24/42] updated --- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../NSCollectionViewItem+.swift | 46 ++----- .../NSTableView+/NSTableView+.swift | 8 +- .../NSTableView+ReconfigureRows.swift | 89 -------------- .../NSTableView/NSTableView+Register.swift | 112 ------------------ .../NSTableView/CellRegistration.swift | 9 ++ 6 files changed, 30 insertions(+), 238 deletions(-) delete mode 100644 Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift delete mode 100644 Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift diff --git a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index a7dd6859..10bfc1a6 100644 --- a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -16,7 +16,7 @@ "location" : "https://github.com/flocked/FZSwiftUtils.git", "state" : { "branch" : "main", - "revision" : "23ce00567210d61699987e99a2df7b062f221beb" + "revision" : "bb48070ce5e3fb586dc3f3041dab1704488391b5" } }, { @@ -25,7 +25,7 @@ "location" : "https://github.com/flocked/FZUIKit.git", "state" : { "branch" : "main", - "revision" : "fdecc53dcd26e139612da704f308e3abfc26f904" + "revision" : "7f3959f2e202973117a912ac88f3d3ec4fba7d00" } } ], diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift index 57644a3a..51c7ed22 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSCollectionView+/NSCollectionViewItem+.swift @@ -299,11 +299,6 @@ extension NSCollectionViewItem { } } - /// A Boolean value that indicates whether the item is enabled. - var isEnabled: Bool { - _collectionView?.isEnabled ?? true - } - /** A Boolean value that indicates whether the item is in an editing state. @@ -377,40 +372,25 @@ extension NSCollectionViewItem { } /* -extension NSCollectionViewItem { +extension NSCollectionViewItem: NSAnimatablePropertyContainer { /** Returns a proxy object for the collection view item that can be used to initiate implied animations when changing ``contentConfiguration`` and ``backgroundConfiguration``. */ public func animator() -> Self { - return unsafeBitCast(AnimatorProxy(target: self), to: Self.self) + NSObjectProxy(object: self).asObject() } - class AnimatorProxy: NSObject { - private weak var target: NSCollectionViewItem? - - init(target: NSCollectionViewItem) { - self.target = target - } - - override func forwardingTarget(for aSelector: Selector!) -> Any? { - target - } - - override func isProxy() -> Bool { - return true - } - - override func responds(to aSelector: Selector!) -> Bool { - target?.responds(to: aSelector) ?? false - } - - func performAnimated(_ block: () -> Void) { - NSAnimationContext.runAnimationGroup { context in - context.duration = NSAnimationContext.current.duration - context.allowsImplicitAnimation = true - block() - } - } + public var animations: [NSAnimatablePropertyKey : Any] { + get { [:] } + set { } + } + + public func animation(forKey key: NSAnimatablePropertyKey) -> Any? { + nil + } + + public static func defaultAnimation(forKey key: NSAnimatablePropertyKey) -> Any? { + nil } } */ diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift index ee269c1a..c59c7887 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift @@ -67,7 +67,11 @@ extension NSTableView { } var isEnablingAutomaticRowHeights: Bool { - get { getAssociatedValue("isEnablingAutomaticRowHeights") ?? false } - set { setAssociatedValue(newValue, key: "isEnablingAutomaticRowHeights") } + get { value(forKeySafely: "isEnablingAutomaticRowHeights") as? Bool ?? false } + set { setValue(safely: newValue, forKey: "isEnablingAutomaticRowHeights") } + } + + static func swizzleViewRegistration() { + setValue(safely: true, forKey: "shouldSwizzleViewRegistration") } } diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift deleted file mode 100644 index 6938f711..00000000 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// NSTableView+ReconfigurateRows.swift -// -// -// Created by Florian Zand on 18.05.22. -// - -import AppKit -import FZSwiftUtils - -extension NSTableView { - /** - Updates the data for the rows at the indexes you specify, preserving the existing row views and cells for the rows. - - To update the contents of existing (including prefetched) cells without replacing them with new row views nad cells, use this method instead of `reloadData(forRowIndexes:columnIndexes:)`. For optimal performance, choose to reconfigure rows instead of reloading rows unless you have an explicit need to replace the existing row view or cells with new. - - Your cell provider must dequeue the same type of cell for the provided index path, and must return the same existing cell for a given index path. Because this method reconfigures existing cells, the table view doesn’t call `prepareForReuse()` for each cell dequeued. If you need to return a different type of cell for an index path, use `reloadData(forRowIndexes:columnIndexes:)` instead. - - The same applies to your row view provider. - - - Parameters: - - indexes: The indexes you want to update. - */ - public func reconfigureRows(at indexes: IndexSet) { - Self.swizzleViewRegistration() - guard let delegate = delegate else { return } - let indexes = indexes.filter({$0 < numberOfRows}) - let columns = tableColumns - - for row in indexes { - if delegate.tableView?(self, isGroupRow: row) ?? false { - if rowView(atRow: row, makeIfNecessary: false) != nil { - reconfigureIndexPath = IndexPath(item: row, section: 0) - _ = delegate.tableView?(self, viewFor: nil, row: row) - } - } else { - for (index, column) in columns.enumerated() { - if view(atColumn: index, row: row, makeIfNecessary: false) != nil { - reconfigureIndexPath = IndexPath(item: row, section: index) - _ = delegate.tableView?(self, viewFor: column, row: row) - } - if rowView(atRow: row, makeIfNecessary: false) != nil { - reconfigureIndexPath = IndexPath(item: row, section: -1) - _ = delegate.tableView?(self, rowViewForRow: row) - } - } - } - } - reconfigureIndexPath = nil - } - - public func reconfigureRows(at indexes: IndexSet, columns: [NSUserInterfaceItemIdentifier]) { - reconfigureRows(at: indexes, columns: IndexSet(columns.compactMap({ column(withIdentifier: $0) }))) - } - - public func reconfigureRows(at rows: IndexSet, columns: IndexSet) { - Self.swizzleViewRegistration() - guard let delegate = delegate else { return } - let tableColumns = tableColumns - let columns = columns.filter({ $0 < tableColumns.count }) - guard columns.isEmpty else { return } - for row in rows.filter({$0 < numberOfRows}) { - if delegate.tableView?(self, isGroupRow: row) ?? false { - if rowView(atRow: row, makeIfNecessary: false) != nil { - reconfigureIndexPath = IndexPath(item: row, section: 0) - _ = delegate.tableView?(self, viewFor: nil, row: row) - } - } else { - for column in columns { - if view(atColumn: column, row: row, makeIfNecessary: false) != nil { - reconfigureIndexPath = IndexPath(item: row, section: column) - _ = delegate.tableView?(self, viewFor: tableColumns[column], row: row) - } - if rowView(atRow: row, makeIfNecessary: false) != nil { - reconfigureIndexPath = IndexPath(item: row, section: -1) - _ = delegate.tableView?(self, rowViewForRow: row) - } - } - } - } - reconfigureIndexPath = nil - } - - var reconfigureIndexPath: IndexPath? { - get { getAssociatedValue("reconfigureIndexPath") } - set { setAssociatedValue(newValue, key: "reconfigureIndexPath") - } - } -} diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift deleted file mode 100644 index 4b9af284..00000000 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift +++ /dev/null @@ -1,112 +0,0 @@ -// -// NSTableView+Nibless.swift -// -// -// Created by Florian Zand on 10.12.22. -// - -import AppKit -import FZSwiftUtils -import FZUIKit - -extension NSTableView { - /** - Registers a view class for the specified identifier, so that view-based table views can use it to instantiate views. - - Use this method to associate the view class with the specified identifier. When you request a view using ``makeView(for:)``, the table view recycles an existing view with the same class or creates a new one by instantiating your class. - - - Parameter viewClass: The view class to register. - */ - public func register(_ viewClass: NSView.Type) { - register(viewClass, forIdentifier: .init(viewClass)) - } - - func register(_ viewClass: NSView.Type, forIdentifier identifier: NSUserInterfaceItemIdentifier) { - Self.swizzleViewRegistration() - registeredClassesByIdentifier[identifier] = viewClass - registeredClassesByIdentifier = registeredClassesByIdentifier - } - - /** - Returns a new or existing view with the specified view class. - - To be able to create a reusable view using this method, you have to register it first via ``register(_:)``. - - When this method is called, the table view automatically instantiates the cell view with the specified owner, which is usually the table view’s delegate. (The owner is useful in setting up outlets and target/actions from the view.). - - This method may return a reused view with the same class that is no longer available on screen. - - Note that `awakeFromNib()` is called each time this method is called. - - - Parameter viewClass: The class of the view. - - - Returns:The view, or `nil` if the view class isn't registered or the view couldn't be created. - */ - public func makeView(for viewClass: View.Type) -> View? { - makeView(for: viewClass, withIdentifier: .init(viewClass)) - } - - func makeView(for _: View.Type, withIdentifier identifier: NSUserInterfaceItemIdentifier) -> View? { - makeView(withIdentifier: identifier, owner: nil) as? View - } - - /** - The dictionary of all registered classes for view-based table view identifiers. - - Each key in the dictionary is the identifier used to register the view class in the ``register(_:)``. The value of each key is the corresponding view class. - */ - public private(set) var registeredClassesByIdentifier: [NSUserInterfaceItemIdentifier: NSView.Type] { - get { getAssociatedValue("registeredClassesByIdentifier", initialValue: [:]) } - set { setAssociatedValue(newValue, key: "registeredClassesByIdentifier") } - } - - @objc private func swizzled_register(_ nib: NSNib?, forIdentifier identifier: NSUserInterfaceItemIdentifier) { - if nib == nil { - registeredClassesByIdentifier[identifier] = nil - } - swizzled_register(nib, forIdentifier: identifier) - } - - @objc private func swizzled_makeView(withIdentifier identifier: NSUserInterfaceItemIdentifier, owner: Any?) -> NSView? { - if isEnablingAutomaticRowHeights { - isEnablingAutomaticRowHeights = false - return nil - } - if let reconfigureIndexPath = reconfigureIndexPath { - if reconfigureIndexPath.section != -1, let cell = view(atColumn: reconfigureIndexPath.section, row: reconfigureIndexPath.item, makeIfNecessary: false) { - return cell - } else if reconfigureIndexPath.section == -1, let rowView = rowView(atRow: reconfigureIndexPath.item, makeIfNecessary: false) { - return rowView - } - } - if let registeredViewClass = registeredClassesByIdentifier[identifier] { - if let view = swizzled_makeView(withIdentifier: identifier, owner: owner) { - return view - } else { - let view = registeredViewClass.init(frame: .zero) - view.identifier = identifier - return view - } - } - let view = swizzled_makeView(withIdentifier: identifier, owner: owner) - return view - } - - private static var didSwizzleViewRegistration: Bool { - get { getAssociatedValue("didSwizzleViewRegistration") ?? false } - set { setAssociatedValue(newValue, key: "didSwizzleViewRegistration") } - } - - static func swizzleViewRegistration() { - guard !didSwizzleViewRegistration else { return } - do { - try Swizzle(NSTableView.self) { - #selector(makeView(withIdentifier:owner:)) <-> #selector(swizzled_makeView(withIdentifier:owner:)) - #selector((register(_:forIdentifier:)) as (NSTableView) -> (NSNib?, NSUserInterfaceItemIdentifier) -> Void) <-> #selector(swizzled_register(_:forIdentifier:)) - } - didSwizzleViewRegistration = true - } catch { - Swift.debugPrint(error) - } - } -} diff --git a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift index ec9933df..5f41d409 100644 --- a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift +++ b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift @@ -153,6 +153,15 @@ extension NSTableView { } } +fileprivate extension NSTableView { + func register(_ viewClass: NSView.Type, forIdentifier identifier: NSUserInterfaceItemIdentifier) { + Self.swizzleViewRegistration() + var registeredClassesByIdentifier = registeredClassesByIdentifier + registeredClassesByIdentifier[identifier] = viewClass + setValue(safely: registeredClassesByIdentifier, forKey: "registeredClassesByIdentifier") + } +} + /// A registration for table view’s cells. public protocol NSTableViewCellRegistration { /// The identifiers of the table columns. From 133c8c52b46b46c2110f98739227c559fd9c0a59 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 22 Jul 2025 23:41:08 +0200 Subject: [PATCH 25/42] Update EmptyView.swift --- .../DiffableDataSource/Shared/EmptyView.swift | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift index f4879f1b..e0d24b67 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift @@ -10,13 +10,13 @@ import FZUIKit /// View that is displayed if a table or collection view is empty. class EmptyView: NSView { - + fileprivate var boundsSize: CGSize = .zero + var view: NSView? { didSet { guard oldValue != view else { return } oldValue?.removeFromSuperview() - if let view = view { - view.frame.size = bounds.size + if let view = view?.size(bounds.size) { addSubview(view) } } @@ -53,6 +53,8 @@ class EmptyView: NSView { override func layout() { super.layout() + guard bounds.size != boundsSize else { return } + boundsSize = bounds.size view?.frame.size = bounds.size } } From 7e159353a35fd14e32e70d0f1ca021521daa05cb Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 22 Jul 2025 23:43:27 +0200 Subject: [PATCH 26/42] updated --- .../NSCollectionView/CollectionViewDiffableDataSource.swift | 6 +++--- .../NSOutlineView/OutlineViewDiffableDataSource.swift | 6 +++--- .../NSTableView/TableViewDiffableDataSource.swift | 6 +++--- .../DiffableDataSource/Shared/EmptyView.swift | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift index 453fc2ac..6e1562ff 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift @@ -694,7 +694,7 @@ open class CollectionViewDiffableDataSource: NSObject, NSOutlineV if let emptyContentView = emptyContentView { emptyContentView.view = newValue } else { - emptyContentView = EmptyView(view: newValue) + emptyContentView = .init(view: newValue) } updateEmptyView() } else { @@ -320,7 +320,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV if let emptyContentView = emptyContentView { emptyContentView.configuration = configuration } else { - emptyContentView = EmptyView(configuration: configuration) + emptyContentView = .init(configuration: configuration) } updateEmptyView() } else { @@ -330,7 +330,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV } } - var emptyContentView: EmptyView? + var emptyContentView: EmptyCollectionTableView? /** The handler that gets called when the data source switches between an empty and non-empty snapshot or viceversa. diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index e52972f5..d3590073 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -970,7 +970,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData if let emptyContentView = emptyContentView { emptyContentView.view = newValue } else { - emptyContentView = EmptyView(view: newValue) + emptyContentView = .init(view: newValue) } updateEmptyView() } else { @@ -992,7 +992,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData if let emptyContentView = emptyContentView { emptyContentView.configuration = configuration } else { - emptyContentView = EmptyView(configuration: configuration) + emptyContentView = .init(configuration: configuration) } updateEmptyView() } else { @@ -1002,7 +1002,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } - var emptyContentView: EmptyView? + var emptyContentView: EmptyCollectionTableView? /** The handler that gets called when the data source switches between an empty and non-empty snapshot or viceversa. diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift index e0d24b67..48258478 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/EmptyView.swift @@ -9,7 +9,7 @@ import AppKit import FZUIKit /// View that is displayed if a table or collection view is empty. -class EmptyView: NSView { +class EmptyCollectionTableView: NSView { fileprivate var boundsSize: CGSize = .zero var view: NSView? { From 5cbca0aa335e0a5ec72c105e92b3df222267ceb3 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 22 Jul 2025 23:52:39 +0200 Subject: [PATCH 27/42] updated --- .../CollectionViewDiffableDataSource.swift | 3 +-- .../NSOutlineView/OutlineViewDiffableDataSource.swift | 7 ++----- .../NSTableView/TableViewDiffableDataSource.swift | 7 ++----- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift index 6e1562ff..47e24ff3 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift @@ -743,12 +743,11 @@ open class CollectionViewDiffableDataSource: NSObject, NSOutlineV func updateEmptyView(previousIsEmpty: Bool? = nil) { if !currentSnapshot.items.isEmpty { - emptyView?.removeFromSuperview() emptyContentView?.removeFromSuperview() } else if let emptyContentView = emptyContentView, emptyContentView.superview != outlineView { outlineView.addSubview(withConstraint: emptyContentView) } - if let emptyHandler = self.emptyHandler, let previousIsEmpty = previousIsEmpty { - if previousIsEmpty != currentSnapshot.items.isEmpty { - emptyHandler(currentSnapshot.items.isEmpty) - } + if let emptyHandler = emptyHandler, let previousIsEmpty = previousIsEmpty, previousIsEmpty != currentSnapshot.items.isEmpty { + emptyHandler(currentSnapshot.items.isEmpty) } } diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index d3590073..6336ee6d 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -1019,15 +1019,12 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData func updateEmptyView(previousIsEmpty: Bool? = nil) { if currentSnapshot.numberOfItems != 0 { - emptyView?.removeFromSuperview() emptyContentView?.removeFromSuperview() } else if let emptyContentView = emptyContentView, emptyContentView.superview != tableView { tableView.addSubview(withConstraint: emptyContentView) } - if let emptyHandler = self.emptyHandler, let previousIsEmpty = previousIsEmpty { - if previousIsEmpty != currentSnapshot.isEmpty { - emptyHandler(currentSnapshot.isEmpty) - } + if let emptyHandler = emptyHandler, let previousIsEmpty = previousIsEmpty, previousIsEmpty != currentSnapshot.isEmpty { + emptyHandler(currentSnapshot.isEmpty) } } From 8f007e64f1c86eb48fe7e2149627e1295292b09a Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Tue, 22 Jul 2025 23:54:39 +0200 Subject: [PATCH 28/42] updated --- .../CollectionViewDiffableDataSource.swift | 8 ++++---- .../NSOutlineView/OutlineViewDiffableDataSource.swift | 8 ++++---- .../NSTableView/TableViewDiffableDataSource.swift | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift index 47e24ff3..7867d9fa 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift @@ -725,9 +725,7 @@ open class CollectionViewDiffableDataSource: NSObject, NSOutlineV } } } - - var emptyContentView: EmptyCollectionTableView? - + /** The handler that gets called when the data source switches between an empty and non-empty snapshot or viceversa. @@ -345,7 +343,9 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV } } - func updateEmptyView(previousIsEmpty: Bool? = nil) { + fileprivate var emptyContentView: EmptyCollectionTableView? + + fileprivate func updateEmptyView(previousIsEmpty: Bool? = nil) { if !currentSnapshot.items.isEmpty { emptyContentView?.removeFromSuperview() } else if let emptyContentView = emptyContentView, emptyContentView.superview != outlineView { diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 6336ee6d..2b83d2c9 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -1002,8 +1002,6 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } - var emptyContentView: EmptyCollectionTableView? - /** The handler that gets called when the data source switches between an empty and non-empty snapshot or viceversa. @@ -1016,8 +1014,10 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData emptyHandler?(currentSnapshot.isEmpty) } } + + fileprivate var emptyContentView: EmptyCollectionTableView? - func updateEmptyView(previousIsEmpty: Bool? = nil) { + fileprivate func updateEmptyView(previousIsEmpty: Bool? = nil) { if currentSnapshot.numberOfItems != 0 { emptyContentView?.removeFromSuperview() } else if let emptyContentView = emptyContentView, emptyContentView.superview != tableView { From 8b07dd616af2244e2056688d31f26c19829d0176 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 23 Jul 2025 00:04:25 +0200 Subject: [PATCH 29/42] updated --- .../CollectionViewDiffableDataSource.swift | 24 +++++----- .../OutlineViewDiffableDataSource.swift | 20 ++++----- .../TableViewDiffableDataSource.swift | 45 +++++++++---------- 3 files changed, 42 insertions(+), 47 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift index 7867d9fa..0bed71ad 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift @@ -45,12 +45,12 @@ import QuickLookUI open class CollectionViewDiffableDataSource: NSObject, NSCollectionViewDataSource { weak var collectionView: NSCollectionView! var dataSource: NSCollectionViewDiffableDataSource! - var delegate: Delegate! var currentSnapshot = NSDiffableDataSourceSnapshot() - var previousDisplayingItems = [Element.ID]() - var rightDownMonitor: NSEvent.Monitor? - var keyDownMonitor: NSEvent.Monitor? - var hoveredItemObserver: KeyValueObservation? + fileprivate var delegate: Delegate! + fileprivate var previousDisplayingItems = [Element.ID]() + fileprivate var rightDownMonitor: NSEvent.Monitor? + fileprivate var keyDownMonitor: NSEvent.Monitor? + fileprivate var hoveredItemObserver: KeyValueObservation? /// The closure that configures and returns the collection view’s supplementary views, such as headers and footers, from the diffable data source. open var supplementaryViewProvider: SupplementaryViewProvider? @@ -148,14 +148,14 @@ open class CollectionViewDiffableDataSource NSCollectionViewItem? { guard let indexPath = indexPath(for: element) else { return nil } return collectionView.item(at: indexPath) } - func observeHoveredItem() { + fileprivate func observeHoveredItem() { if hoverHandlers.shouldObserve { collectionView.setupObservation() if hoveredItemObserver == nil { @@ -174,7 +174,7 @@ open class CollectionViewDiffableDataSource: NSObject, NSOutlineV weak var outlineView: NSOutlineView! var currentSnapshot = OutlineViewDiffableDataSourceSnapshot() let cellProvider: CellProvider - var keyDownMonitor: NSEvent.Monitor? - var hoveredRowObserver: KeyValueObservation? - var delegate: Delegate! - var draggedItems: [Item] = [] - var reorderingItems: [Item] = [] - var draggedParent: Item? - var draggedIndexes: [Int] = [] - var canDrop = false var isApplyingSnapshot = false - lazy var groupRowTableColumn = NSTableColumn() + fileprivate var keyDownMonitor: NSEvent.Monitor? + fileprivate var hoveredRowObserver: KeyValueObservation? + fileprivate var delegate: Delegate! + fileprivate var draggedItems: [Item] = [] + fileprivate var reorderingItems: [Item] = [] + fileprivate var draggedParent: Item? + fileprivate var draggedIndexes: [Int] = [] + fileprivate var canDrop = false + fileprivate lazy var groupRowTableColumn = NSTableColumn() /// The closure that configures and returns the outline view’s row views from the diffable data source. open var rowViewProvider: RowViewProvider? @@ -193,7 +193,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV } } - var doubleClickGesture: DoubleClickGestureRecognizer? + fileprivate var doubleClickGesture: DoubleClickGestureRecognizer? /// The handlers for selecting items. open var selectionHandlers = SelectionHandlers() diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 2b83d2c9..e6fc4b3f 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -44,26 +44,21 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData weak var tableView: NSTableView! var dataSource: NSTableViewDiffableDataSource! - var cellProvider: CellProvider! - var delegate: Delegate! - var currentSnapshot = NSDiffableDataSourceSnapshot() - var dropValidationRow: Int? = nil - enum ColumnItemSortingStrategy: Int, Hashable { - case reset - /// Updates the item order - case update - } - var dragDeleteItems: [Item] = [] - var dragDeleteObservation: KeyValueObservation? - var dragDistanceIsMatched = false - var dragingRowIndexes: [Int] = [] { + fileprivate var cellProvider: CellProvider! + fileprivate var delegate: Delegate! + fileprivate var currentSnapshot = NSDiffableDataSourceSnapshot() + fileprivate var dropValidationRow: Int? = nil + fileprivate var dragDeleteItems: [Item] = [] + fileprivate var dragDeleteObservation: KeyValueObservation? + fileprivate var dragDistanceIsMatched = false + fileprivate var dragingRowIndexes: [Int] = [] { didSet { guard oldValue != dragingRowIndexes else { return } oldValue.forEach({ tableView?.rowView(atRow: $0, makeIfNecessary: false)?.isReordering = false }) dragingRowIndexes.forEach({ tableView?.rowView(atRow: $0, makeIfNecessary: false)?.isReordering = true }) } } - var dropTargetRow: Int? = nil { + fileprivate var dropTargetRow: Int? = nil { didSet { guard oldValue != dropTargetRow else { return } if let row = oldValue { @@ -74,7 +69,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } } - var reorderingSectionRow: Int? { + fileprivate var reorderingSectionRow: Int? { didSet { if let row = oldValue { tableView?.rowView(atRow: row, makeIfNecessary: false)?.isReordering = false @@ -85,11 +80,11 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } var sectionRowIndexes: [Int] = [] - var hoveredRowObserver: KeyValueObservation? - var keyDownMonitor: NSEvent.Monitor? - var canDragItems = false - var canDrop = false - var immediatelyReorderRowView: NSTableRowView? + fileprivate var hoveredRowObserver: KeyValueObservation? + fileprivate var keyDownMonitor: NSEvent.Monitor? + fileprivate var canDragItems = false + fileprivate var canDrop = false + fileprivate var immediatelyReorderRowView: NSTableRowView? /// The closure that configures and returns the table view’s row views from the diffable data source. open var rowViewProvider: RowViewProvider? { @@ -227,7 +222,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } - var doubleClickGesture: DoubleClickGestureRecognizer? + fileprivate var doubleClickGesture: DoubleClickGestureRecognizer? /** The default animation the UI uses to show differences between rows. @@ -245,7 +240,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData dataSource.defaultRowAnimation.rawValue } - func setupHoverObserving() { + fileprivate func setupHoverObserving() { if hoverHandlers.shouldSetup { guard hoveredRowObserver == nil else { return } tableView.setupObservation() @@ -263,7 +258,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } - func setupKeyDownMonitor() { + fileprivate func setupKeyDownMonitor() { if let canDelete = deletingHandlers.canDelete { keyDownMonitor = NSEvent.localMonitor(for: .keyDown) { [weak self] event in guard let self = self, event.charactersIgnoringModifiers == String(UnicodeScalar(NSDeleteCharacter)!), self.tableView.isFirstResponder else { return event } @@ -324,7 +319,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData updateEmptyView(previousIsEmpty: previousIsEmpty) } - func updateSectionRowIndexes() { + fileprivate func updateSectionRowIndexes() { sectionRowIndexes.removeAll() guard sectionHeaderCellProvider != nil else { return } var row = 0 @@ -351,7 +346,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData return NSImage(combineVertical: items.compactMap({ previewImage(for: $0)}).reversed(), alignment: .left) } - private func previewImage(for item: Item, tableColumn: NSTableColumn, useColumnWidth: Bool) -> NSImage? { + fileprivate func previewImage(for item: Item, tableColumn: NSTableColumn, useColumnWidth: Bool) -> NSImage? { guard tableView.tableColumns.contains(tableColumn) else { return nil } let view = cellProvider(tableView, tableColumn, 0, item) view.frame.size = view.systemLayoutSizeFitting(width: tableColumn.width) From 540b44d19acde8dd6fb74e531d45d6e1b0cb8f2a Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 23 Jul 2025 00:05:45 +0200 Subject: [PATCH 30/42] updated --- .../CollectionViewDiffableDataSource.swift | 28 ++++++------ .../OutlineViewDiffableDataSource.swift | 24 +++++----- .../TableViewDiffableDataSource.swift | 44 +++++++++---------- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift index 0bed71ad..1db416f2 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift @@ -46,11 +46,11 @@ open class CollectionViewDiffableDataSource! var currentSnapshot = NSDiffableDataSourceSnapshot() - fileprivate var delegate: Delegate! - fileprivate var previousDisplayingItems = [Element.ID]() - fileprivate var rightDownMonitor: NSEvent.Monitor? - fileprivate var keyDownMonitor: NSEvent.Monitor? - fileprivate var hoveredItemObserver: KeyValueObservation? + private var delegate: Delegate! + private var previousDisplayingItems = [Element.ID]() + private var rightDownMonitor: NSEvent.Monitor? + private var keyDownMonitor: NSEvent.Monitor? + private var hoveredItemObserver: KeyValueObservation? /// The closure that configures and returns the collection view’s supplementary views, such as headers and footers, from the diffable data source. open var supplementaryViewProvider: SupplementaryViewProvider? @@ -148,14 +148,14 @@ open class CollectionViewDiffableDataSource NSCollectionViewItem? { guard let indexPath = indexPath(for: element) else { return nil } return collectionView.item(at: indexPath) } - fileprivate func observeHoveredItem() { + private func observeHoveredItem() { if hoverHandlers.shouldObserve { collectionView.setupObservation() if hoveredItemObserver == nil { @@ -174,7 +174,7 @@ open class CollectionViewDiffableDataSource: NSObject, NSOutlineV var currentSnapshot = OutlineViewDiffableDataSourceSnapshot() let cellProvider: CellProvider var isApplyingSnapshot = false - fileprivate var keyDownMonitor: NSEvent.Monitor? - fileprivate var hoveredRowObserver: KeyValueObservation? - fileprivate var delegate: Delegate! - fileprivate var draggedItems: [Item] = [] - fileprivate var reorderingItems: [Item] = [] - fileprivate var draggedParent: Item? - fileprivate var draggedIndexes: [Int] = [] - fileprivate var canDrop = false - fileprivate lazy var groupRowTableColumn = NSTableColumn() + private var keyDownMonitor: NSEvent.Monitor? + private var hoveredRowObserver: KeyValueObservation? + private var delegate: Delegate! + private var draggedItems: [Item] = [] + private var reorderingItems: [Item] = [] + private var draggedParent: Item? + private var draggedIndexes: [Int] = [] + private var canDrop = false + private lazy var groupRowTableColumn = NSTableColumn() /// The closure that configures and returns the outline view’s row views from the diffable data source. open var rowViewProvider: RowViewProvider? @@ -193,7 +193,7 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV } } - fileprivate var doubleClickGesture: DoubleClickGestureRecognizer? + private var doubleClickGesture: DoubleClickGestureRecognizer? /// The handlers for selecting items. open var selectionHandlers = SelectionHandlers() @@ -343,9 +343,9 @@ public class OutlineViewDiffableDataSource: NSObject, NSOutlineV } } - fileprivate var emptyContentView: EmptyCollectionTableView? + private var emptyContentView: EmptyCollectionTableView? - fileprivate func updateEmptyView(previousIsEmpty: Bool? = nil) { + private func updateEmptyView(previousIsEmpty: Bool? = nil) { if !currentSnapshot.items.isEmpty { emptyContentView?.removeFromSuperview() } else if let emptyContentView = emptyContentView, emptyContentView.superview != outlineView { diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index e6fc4b3f..5e0cd6b7 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -44,21 +44,21 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData weak var tableView: NSTableView! var dataSource: NSTableViewDiffableDataSource! - fileprivate var cellProvider: CellProvider! - fileprivate var delegate: Delegate! - fileprivate var currentSnapshot = NSDiffableDataSourceSnapshot() - fileprivate var dropValidationRow: Int? = nil - fileprivate var dragDeleteItems: [Item] = [] - fileprivate var dragDeleteObservation: KeyValueObservation? - fileprivate var dragDistanceIsMatched = false - fileprivate var dragingRowIndexes: [Int] = [] { + private var cellProvider: CellProvider! + private var delegate: Delegate! + private var currentSnapshot = NSDiffableDataSourceSnapshot() + private var dropValidationRow: Int? = nil + private var dragDeleteItems: [Item] = [] + private var dragDeleteObservation: KeyValueObservation? + private var dragDistanceIsMatched = false + private var dragingRowIndexes: [Int] = [] { didSet { guard oldValue != dragingRowIndexes else { return } oldValue.forEach({ tableView?.rowView(atRow: $0, makeIfNecessary: false)?.isReordering = false }) dragingRowIndexes.forEach({ tableView?.rowView(atRow: $0, makeIfNecessary: false)?.isReordering = true }) } } - fileprivate var dropTargetRow: Int? = nil { + private var dropTargetRow: Int? = nil { didSet { guard oldValue != dropTargetRow else { return } if let row = oldValue { @@ -69,7 +69,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } } - fileprivate var reorderingSectionRow: Int? { + private var reorderingSectionRow: Int? { didSet { if let row = oldValue { tableView?.rowView(atRow: row, makeIfNecessary: false)?.isReordering = false @@ -80,11 +80,11 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } var sectionRowIndexes: [Int] = [] - fileprivate var hoveredRowObserver: KeyValueObservation? - fileprivate var keyDownMonitor: NSEvent.Monitor? - fileprivate var canDragItems = false - fileprivate var canDrop = false - fileprivate var immediatelyReorderRowView: NSTableRowView? + private var hoveredRowObserver: KeyValueObservation? + private var keyDownMonitor: NSEvent.Monitor? + private var canDragItems = false + private var canDrop = false + private var immediatelyReorderRowView: NSTableRowView? /// The closure that configures and returns the table view’s row views from the diffable data source. open var rowViewProvider: RowViewProvider? { @@ -222,7 +222,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } - fileprivate var doubleClickGesture: DoubleClickGestureRecognizer? + private var doubleClickGesture: DoubleClickGestureRecognizer? /** The default animation the UI uses to show differences between rows. @@ -240,7 +240,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData dataSource.defaultRowAnimation.rawValue } - fileprivate func setupHoverObserving() { + private func setupHoverObserving() { if hoverHandlers.shouldSetup { guard hoveredRowObserver == nil else { return } tableView.setupObservation() @@ -258,7 +258,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } - fileprivate func setupKeyDownMonitor() { + private func setupKeyDownMonitor() { if let canDelete = deletingHandlers.canDelete { keyDownMonitor = NSEvent.localMonitor(for: .keyDown) { [weak self] event in guard let self = self, event.charactersIgnoringModifiers == String(UnicodeScalar(NSDeleteCharacter)!), self.tableView.isFirstResponder else { return event } @@ -319,7 +319,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData updateEmptyView(previousIsEmpty: previousIsEmpty) } - fileprivate func updateSectionRowIndexes() { + private func updateSectionRowIndexes() { sectionRowIndexes.removeAll() guard sectionHeaderCellProvider != nil else { return } var row = 0 @@ -346,7 +346,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData return NSImage(combineVertical: items.compactMap({ previewImage(for: $0)}).reversed(), alignment: .left) } - fileprivate func previewImage(for item: Item, tableColumn: NSTableColumn, useColumnWidth: Bool) -> NSImage? { + private func previewImage(for item: Item, tableColumn: NSTableColumn, useColumnWidth: Bool) -> NSImage? { guard tableView.tableColumns.contains(tableColumn) else { return nil } let view = cellProvider(tableView, tableColumn, 0, item) view.frame.size = view.systemLayoutSizeFitting(width: tableColumn.width) @@ -1010,9 +1010,9 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } - fileprivate var emptyContentView: EmptyCollectionTableView? + private var emptyContentView: EmptyCollectionTableView? - fileprivate func updateEmptyView(previousIsEmpty: Bool? = nil) { + private func updateEmptyView(previousIsEmpty: Bool? = nil) { if currentSnapshot.numberOfItems != 0 { emptyContentView?.removeFromSuperview() } else if let emptyContentView = emptyContentView, emptyContentView.superview != tableView { From 985af0b5d96e00c1e0501b192a1dff0cea08ac3b Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 30 Jul 2025 04:00:22 +0200 Subject: [PATCH 31/42] Update NSTableCellVew+.swift --- .../Configuration/Extensions/NSTableView+/NSTableCellVew+.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift index 59e8d469..56baab85 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift @@ -264,7 +264,7 @@ extension NSTableCellView { if let configuration = (contentConfiguration as? NSListContentConfiguration)?.updated(for: self) { setAssociatedValue(configuration, key: "contentConfiguration") NSAnimationContext.performWithoutAnimation { - contentView?.configuration = configuration + self.contentView?.configuration = configuration } } } From 1a93b91952517886d85510c661d0203bc56e12dc Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 30 Jul 2025 05:16:37 +0200 Subject: [PATCH 32/42] updated --- .../TableViewDiffableDataSource.swift | 29 ++++++++++++++----- .../NSTableView/CellRegistration.swift | 28 ++++++++++++++---- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 5e0cd6b7..9157527c 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -404,9 +404,11 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData Creates a diffable data source with the specified cell registrations, and connects it to the specified table view. Specify column identifiers for each of the cell registrations using: ``AppKit/NSTableView/CellRegistration/init(columnIdentifiers:handler:)`` - + The column identifiers are used to create the cells for each column with the coresponding column identifier. + If you don't specify any column identifiers, the cell registrations are used in the order of the table columns. + ```swift dataSource = TableViewDiffableDataSource(tableView: tableView, cellRegistrations: cellRegistrations) ``` @@ -416,13 +418,24 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData - cellRegistrations: Cell registrations which returns each of the cells for the table view from the data the diffable data source provides. */ public convenience init(tableView: NSTableView, cellRegistrations: [NSTableViewCellRegistration]) { - self.init(tableView: tableView, cellProvider: { - _, column, row, item in - if let cellRegistration = (cellRegistrations.first(where: { $0.columnIdentifiers.contains(column.identifier) }) ?? cellRegistrations.first(where: { $0.columnIdentifiers.isEmpty })) as? _NSTableViewCellRegistration { - return cellRegistration.makeView(tableView, column, row, item) ?? NSTableCellView() - } - return NSTableCellView() - }) + let cellRegistrations = cellRegistrations.compactMap({$0 as? _NSTableViewCellRegistration}) + if cellRegistrations.contains(where: {!$0.columnIdentifiers.isEmpty}) { + self.init(tableView: tableView, cellProvider: { + tableView, column, row, item in + if let cellRegistration = cellRegistrations.first(where: { $0.columnIdentifiers.contains(column.identifier) }) ?? cellRegistrations.first(where: { $0.columnIdentifiers.isEmpty }) { + return cellRegistration.makeView(tableView, column, row, item) ?? NSTableCellView() + } + return NSTableCellView() + }) + } else { + self.init(tableView: tableView, cellProvider: { + tableView, column, row, item in + if let cellRegistration = cellRegistrations[safe: tableView.tableColumns.firstIndex(of: column) ?? 0] ?? cellRegistrations.first { + return cellRegistration.makeView(tableView, column, row, item) ?? NSTableCellView() + } + return NSTableCellView() + }) + } } /* diff --git a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift index 5f41d409..0e9a2937 100644 --- a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift +++ b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift @@ -48,7 +48,11 @@ public extension NSTableView { ## Column Identifiers - With `columnIdentifiers` you can restrict the cell to specific table columns when used with ``TableViewDiffableDataSource`` using ``TableViewDiffableDataSource/init(tableView:cellRegistrations:)``. You only have to provide column identifiers when your table view has multiple columns and the columns should use different types of table cells. The data source will use the matching cell registration for each column. + With `columnIdentifiers` you can restrict the cell to specific table columns when used with ``TableViewDiffableDataSource`` using ``TableViewDiffableDataSource/init(tableView:cellRegistrations:)``. + + You only have to provide column identifiers when your table view has multiple columns. The table cell is displayed for the columns with the same identifiers. + + An empty array indicates that the cell isn't restricted to any specific columns. ## Section Header View @@ -68,9 +72,11 @@ public extension NSTableView { /** The identifiers of the table columns, - An empty array indicates that the cell isn't restricted to any specific columns. + The column identifiers are used when the registration is applied to ``TableViewDiffableDataSource`` using ``TableViewDiffableDataSource/init(tableView:cellRegistrations:)``. + + You only have to provide column identifiers when your table view has multiple columns. The table cell is displayed for the columns with the same identifiers. - The identifiers are used when the registration is applied to ``TableViewDiffableDataSource``. If the value isn't `nil`, the table cell is displayed for the columns with the same identifiers. + An empty array indicates that the cell isn't restricted to any specific columns. */ public let columnIdentifiers: [NSUserInterfaceItemIdentifier] @@ -78,9 +84,15 @@ public extension NSTableView { /** Creates a cell registration with the specified registration handler. + + The column identifiers are used when the registration is applied to ``TableViewDiffableDataSource`` using ``TableViewDiffableDataSource/init(tableView:cellRegistrations:)``. + + You only have to provide column identifiers when your table view has multiple columns. The table cell is displayed for the columns with the same identifiers. + An empty array indicates that the cell isn't restricted to any specific columns. + - Parameters: - - columnIdentifiers: The identifiers of the table columns. The identifiers of the table columns. The default value is `[]`, which indicates that the cell isn't restricted to specific columns. + - columnIdentifiers: The identifiers of the table columns. The default value is `[]`, which indicates that the cell isn't restricted to specific columns. - handler: The handler to configurate the cell. */ public init(columnIdentifiers: [NSUserInterfaceItemIdentifier] = [], handler: @escaping Handler) { @@ -91,6 +103,12 @@ public extension NSTableView { /** Creates a cell registration with the specified registration handler and nib file. + + The column identifiers are used when the registration is applied to ``TableViewDiffableDataSource`` using ``TableViewDiffableDataSource/init(tableView:cellRegistrations:)``. + + You only have to provide column identifiers when your table view has multiple columns. The table cell is displayed for the columns with the same identifiers. + + An empty array indicates that the cell isn't restricted to any specific columns. - Parameters: - nib: The nib of the cell. @@ -168,6 +186,6 @@ public protocol NSTableViewCellRegistration { var columnIdentifiers: [NSUserInterfaceItemIdentifier] { get } } -protocol _NSTableViewCellRegistration { +protocol _NSTableViewCellRegistration: NSTableViewCellRegistration { func makeView(_ tableView: NSTableView, _ tableColumn: NSTableColumn, _ row: Int, _ item: Any) -> NSTableCellView? } From bc9552b23ccbbbc1c38c50468179c46deb387c95 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 30 Jul 2025 07:30:33 +0200 Subject: [PATCH 33/42] updated --- .../NSTableView+/NSTableView+.swift | 9 -- .../NSCollectionView+ReconfigureItem.swift | 16 ++- .../NSTableView/NSOutlineView+.swift | 24 ++++ .../NSTableView+ReconfigureRows.swift | 91 +++++++++++++ .../NSTableView/NSTableView+Register.swift | 124 ++++++++++++++++++ .../NSTableView/CellRegistration.swift | 9 -- 6 files changed, 248 insertions(+), 25 deletions(-) create mode 100644 Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSOutlineView+.swift create mode 100644 Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift create mode 100644 Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift index c59c7887..a4036d88 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableView+.swift @@ -65,13 +65,4 @@ extension NSTableView { usesAutomaticRowHeights = true reloadData() } - - var isEnablingAutomaticRowHeights: Bool { - get { value(forKeySafely: "isEnablingAutomaticRowHeights") as? Bool ?? false } - set { setValue(safely: newValue, forKey: "isEnablingAutomaticRowHeights") } - } - - static func swizzleViewRegistration() { - setValue(safely: true, forKey: "shouldSwizzleViewRegistration") - } } diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+ReconfigureItem.swift b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+ReconfigureItem.swift index b953a06b..2fa5d434 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+ReconfigureItem.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+ReconfigureItem.swift @@ -5,6 +5,7 @@ // Created by Florian Zand on 18.05.22. // +#if os(macOS) import AppKit import FZSwiftUtils @@ -31,24 +32,24 @@ extension NSCollectionView { isReconfiguratingItems = false } - var isReconfiguratingItems: Bool { - get { getAssociatedValue("isReconfiguratingItems", initialValue: false) } + fileprivate var isReconfiguratingItems: Bool { + get { getAssociatedValue("isReconfiguratingItems") ?? false } set { setAssociatedValue(newValue, key: "isReconfiguratingItems") } } - static var didSwizzleMakeItem: Bool { - get { getAssociatedValue("didSwizzleMakeItem", initialValue: false) } + fileprivate static var didSwizzleMakeItem: Bool { + get { getAssociatedValue("didSwizzleMakeItem") ?? false } set { setAssociatedValue(newValue, key: "didSwizzleMakeItem") } } @objc static func swizzleMakeItem() { - guard didSwizzleMakeItem == false else { return } + guard !didSwizzleMakeItem else { return } + didSwizzleMakeItem = true do { - try Swizzle(NSCollectionView.self) { + _ = try Swizzle(NSCollectionView.self) { #selector(makeItem(withIdentifier:for:)) <-> #selector(swizzled_makeItem(withIdentifier:for:)) } - didSwizzleMakeItem = true } catch { Swift.debugPrint(error) } @@ -61,3 +62,4 @@ extension NSCollectionView { return self.swizzled_makeItem(withIdentifier: identifier, for: indexPath) } } +#endif diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSOutlineView+.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSOutlineView+.swift new file mode 100644 index 00000000..ffeb7215 --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSOutlineView+.swift @@ -0,0 +1,24 @@ +// +// NSOutlineView+.swift +// +// +// Created by Florian Zand on 30.07.25. +// + +import AppKit +import FZUIKit + +extension NSOutlineView { + /** + Updates the data for the items you specify, preserving the existing row views and cells for the rows. + + To update the contents of existing (including prefetched) cells without replacing them with new row views nad cells, use this method instead of ``AppKit/NSOutlineView/reloadItems(_:)``. For optimal performance, choose to reconfigure rows instead of reloading rows unless you have an explicit need to replace the existing row view or cells with new. + + - Parameter items: The items you want to update. + */ + public func reconfigurateItems(_ items: [Any]) { + let rows = items.map({ row(forItem: $0) }).filter({ $0 != -1 }) + guard !rows.isEmpty else { return } + reconfigureRows(at: IndexSet(rows)) + } +} diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift new file mode 100644 index 00000000..15463aec --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+ReconfigureRows.swift @@ -0,0 +1,91 @@ +// +// NSTableView+ReconfigurateRows.swift +// +// +// Created by Florian Zand on 18.05.22. +// + +#if os(macOS) +import AppKit +import FZSwiftUtils + +extension NSTableView { + /** + Updates the data for the rows at the indexes you specify, preserving the existing row views and cells for the rows. + + To update the contents of existing (including prefetched) cells without replacing them with new row views nad cells, use this method instead of [reloadData(forRowIndexes:columnIndexes:)](https://developer.apple.com/documentation/appkit/nstableview/reloaddata(forrowindexes:columnindexes:)). For optimal performance, choose to reconfigure rows instead of reloading rows unless you have an explicit need to replace the existing row view or cells with new. + + - Parameter indexes: The indexes you want to update. + */ + public func reconfigureRows(at indexes: IndexSet) { + let indexes = indexes.filter({$0 >= 0 && $0 < numberOfRows}) + let columns = (0..= 0 && $0 < tableColumns.count }) + guard columns.isEmpty else { return } + for row in rows.filter({ $0 >= 0 && $0 < numberOfRows}) { + if delegate.tableView?(self, isGroupRow: row) ?? false { + if rowView(atRow: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: 0) + _ = delegate.tableView?(self, viewFor: nil, row: row) + } + } else { + for column in columns { + if view(atColumn: column, row: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: column) + _ = delegate.tableView?(self, viewFor: tableColumns[column], row: row) + } + if rowView(atRow: row, makeIfNecessary: false) != nil { + reconfigureIndexPath = IndexPath(item: row, section: -1) + _ = delegate.tableView?(self, rowViewForRow: row) + } + } + } + } + reconfigureIndexPath = nil + } + + var reconfigureIndexPath: IndexPath? { + get { getAssociatedValue("reconfigureIndexPath") } + set { setAssociatedValue(newValue, key: "reconfigureIndexPath") + } + } +} +#endif diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift new file mode 100644 index 00000000..20dc934e --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift @@ -0,0 +1,124 @@ +// +// NSTableView+Register.swift +// +// +// Created by Florian Zand on 22.07.25. +// + +#if os(macOS) + +import AppKit +import FZSwiftUtils + +extension NSTableView { + /** + Registers a view class for the specified identifier, so that view-based table views can use it to instantiate views. + + Use this method to associate the view class with the specified identifier. When you request a view using ``AppKit/NSTableView/makeView(for:)``, the table view recycles an existing view with the same class or creates a new one by instantiating your class. + + - Parameter viewClass: The view class to register. + */ + public func register(_ viewClass: NSView.Type) { + register(viewClass, forIdentifier: .init(viewClass)) + } + + func register(_ viewClass: NSView.Type, forIdentifier identifier: NSUserInterfaceItemIdentifier) { + Self.swizzleViewRegistration() + registeredClassesByIdentifier[identifier] = viewClass + registeredClassesByIdentifier = registeredClassesByIdentifier + } + + /** + Returns a new or existing view with the specified view class. + + To be able to create a reusable view using this method, you have to register it first via ``AppKit/NSTableView/register(_:)``. + + When this method is called, the table view automatically instantiates the cell view with the specified owner, which is usually the table view’s delegate. (The owner is useful in setting up outlets and target/actions from the view.). + + This method may return a reused view with the same class that is no longer available on screen. + + Note that `awakeFromNib()` is called each time this method is called. + + - Parameter viewClass: The class of the view. + + - Returns:The view, or `nil` if the view class isn't registered or the view couldn't be created. + */ + public func makeView(for viewClass: View.Type) -> View? { + makeView(for: viewClass, withIdentifier: .init(viewClass)) + } + + func makeView(for _: View.Type, withIdentifier identifier: NSUserInterfaceItemIdentifier) -> View? { + makeView(withIdentifier: identifier, owner: nil) as? View + } + + /** + The dictionary of all registered classes for view-based table view identifiers. + + Each key in the dictionary is the identifier used to register the view class in the ``AppKit/NSTableView/register(_:)``. The value of each key is the corresponding view class. + */ + @objc public private(set) var registeredClassesByIdentifier: [NSUserInterfaceItemIdentifier: NSView.Type] { + get { getAssociatedValue("registeredClassesByIdentifier", initialValue: [:]) } + set { setAssociatedValue(newValue, key: "registeredClassesByIdentifier") } + } + + @objc fileprivate func swizzled_register(_ nib: NSNib?, forIdentifier identifier: NSUserInterfaceItemIdentifier) { + if nib == nil { + registeredClassesByIdentifier[identifier] = nil + } + swizzled_register(nib, forIdentifier: identifier) + } + + @objc fileprivate func swizzled_makeView(withIdentifier identifier: NSUserInterfaceItemIdentifier, owner: Any?) -> NSView? { + if isEnablingAutomaticRowHeights { + isEnablingAutomaticRowHeights = false + return nil + } + if let reconfigureIndexPath = reconfigureIndexPath { + if reconfigureIndexPath.section != -1, let cell = view(atColumn: reconfigureIndexPath.section, row: reconfigureIndexPath.item, makeIfNecessary: false) { + return cell + } else if reconfigureIndexPath.section == -1, let rowView = rowView(atRow: reconfigureIndexPath.item, makeIfNecessary: false) { + return rowView + } + } + if let registeredViewClass = registeredClassesByIdentifier[identifier] { + if let view = swizzled_makeView(withIdentifier: identifier, owner: owner) { + return view + } else { + let view = registeredViewClass.init(frame: .zero) + view.identifier = identifier + return view + } + } + let view = swizzled_makeView(withIdentifier: identifier, owner: owner) + return view + } + + static func swizzleViewRegistration() { + guard !didSwizzleViewRegistration else { return } + do { + _ = try Swizzle(NSTableView.self) { + #selector(makeView(withIdentifier:owner:)) <-> #selector(swizzled_makeView(withIdentifier:owner:)) + #selector((register(_:forIdentifier:)) as (NSTableView) -> (NSNib?, NSUserInterfaceItemIdentifier) -> Void) <-> #selector(swizzled_register(_:forIdentifier:)) + } + didSwizzleViewRegistration = true + } catch { + Swift.debugPrint(error) + } + } + + fileprivate static var didSwizzleViewRegistration: Bool { + get { getAssociatedValue("didSwizzleViewRegistration") ?? false } + set { setAssociatedValue(newValue, key: "didSwizzleViewRegistration") } + } + + @objc var isEnablingAutomaticRowHeights: Bool { + get { getAssociatedValue("isEnablingAutomaticRowHeights") ?? false } + set { setAssociatedValue(newValue, key: "isEnablingAutomaticRowHeights") } + } + + @objc fileprivate static var shouldSwizzleViewRegistration: Bool { + get { didSwizzleViewRegistration } + set { swizzleViewRegistration() } + } +} +#endif diff --git a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift index 0e9a2937..8219fcee 100644 --- a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift +++ b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift @@ -171,15 +171,6 @@ extension NSTableView { } } -fileprivate extension NSTableView { - func register(_ viewClass: NSView.Type, forIdentifier identifier: NSUserInterfaceItemIdentifier) { - Self.swizzleViewRegistration() - var registeredClassesByIdentifier = registeredClassesByIdentifier - registeredClassesByIdentifier[identifier] = viewClass - setValue(safely: registeredClassesByIdentifier, forKey: "registeredClassesByIdentifier") - } -} - /// A registration for table view’s cells. public protocol NSTableViewCellRegistration { /// The identifiers of the table columns. From 874416ddbd5160baa9b2ab57be7ba797757b9f05 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Wed, 30 Jul 2025 07:34:57 +0200 Subject: [PATCH 34/42] updated --- .../AdvancedCollectionTableView.md | 1 + .../AppKit Extensions/NSTableView/NSOutlineView+.md | 9 +++++++++ .../Extensions/NSTableView/NSOutlineView+.swift | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/AppKit Extensions/NSTableView/NSOutlineView+.md diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/AdvancedCollectionTableView.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/AdvancedCollectionTableView.md index 47596b9c..138b7c32 100644 --- a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/AdvancedCollectionTableView.md +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/AdvancedCollectionTableView.md @@ -58,4 +58,5 @@ A collection of classes and extensions for `NSCollectionView` and `NSTableView`, - - - +- - ``NSTableViewCellRegistration`` diff --git a/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/AppKit Extensions/NSTableView/NSOutlineView+.md b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/AppKit Extensions/NSTableView/NSOutlineView+.md new file mode 100644 index 00000000..38ee7406 --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Documentation/AdvancedCollectionTableView.docc/Extensions/AppKit Extensions/NSTableView/NSOutlineView+.md @@ -0,0 +1,9 @@ +# NSOutlineView + +Extensions for `NSOutlineView`. + +## Topics + +### Recofigurare items + +- ``AppKit/NSOutlineView/reconfigurateItems(_:)`` diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSOutlineView+.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSOutlineView+.swift index ffeb7215..57a68047 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSOutlineView+.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSOutlineView+.swift @@ -11,7 +11,7 @@ import FZUIKit extension NSOutlineView { /** Updates the data for the items you specify, preserving the existing row views and cells for the rows. - + To update the contents of existing (including prefetched) cells without replacing them with new row views nad cells, use this method instead of ``AppKit/NSOutlineView/reloadItems(_:)``. For optimal performance, choose to reconfigure rows instead of reloading rows unless you have an explicit need to replace the existing row view or cells with new. - Parameter items: The items you want to update. From c17758370c538e2d4f128af7251295e74235b3c5 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Mon, 4 Aug 2025 12:46:18 +0200 Subject: [PATCH 35/42] updated --- .../NSItemContentConfiguration/NSItemContentView.swift | 1 - .../NSCollectionView/CollectionViewDiffableDataSource.swift | 2 +- .../NSOutlineView/OutlineViewDiffableDataSource.swift | 2 +- .../NSTableView/TableViewDiffableDataSource.swift | 2 +- .../NSCollectionViewDiffableDataSource+Delete.swift | 2 +- .../NSTableView/NSTableViewDiffableDataSource+Delete.swift | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView.swift index 092124ce..4389ab83 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView.swift @@ -24,7 +24,6 @@ open class NSItemContentView: NSView, NSContentView, EditingContentView { public init(configuration: NSItemContentConfiguration) { appliedConfiguration = configuration super.init(frame: .zero) - isOpaque = false wantsLayer = true clipsToBounds = false stackviewConstraints = addSubview(withConstraint: stackView) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift index 1db416f2..3544bfdc 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSCollectionView/CollectionViewDiffableDataSource.swift @@ -208,7 +208,7 @@ open class CollectionViewDiffableDataSource: NSObject, NSOutlineV func setupKeyDownMonitor() { if let canDelete = deletingHandlers.canDelete { - keyDownMonitor = NSEvent.localMonitor(for: .keyDown) { [weak self] event in + keyDownMonitor = .local(for: .keyDown) { [weak self] event in guard let self = self, event.charactersIgnoringModifiers == String(UnicodeScalar(NSDeleteCharacter)!), self.outlineView.isFirstResponder else { return event } let selected = outlineView.selectedItems as! [Item] let itemsToDelete = canDelete(selected) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 9157527c..3f16b970 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -260,7 +260,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData private func setupKeyDownMonitor() { if let canDelete = deletingHandlers.canDelete { - keyDownMonitor = NSEvent.localMonitor(for: .keyDown) { [weak self] event in + keyDownMonitor = .local(for: .keyDown) { [weak self] event in guard let self = self, event.charactersIgnoringModifiers == String(UnicodeScalar(NSDeleteCharacter)!), self.tableView.isFirstResponder else { return event } let itemsToDelete = canDelete(self.selectedItems) guard !itemsToDelete.isEmpty else { return event } diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionViewDiffableDataSource+Delete.swift b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionViewDiffableDataSource+Delete.swift index b88dae89..438c0837 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionViewDiffableDataSource+Delete.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionViewDiffableDataSource+Delete.swift @@ -94,7 +94,7 @@ extension NSCollectionViewDiffableDataSource { func setupKeyDownMonitor() { if let canDelete = deletingHandlers.canDelete, let didDelete = deletingHandlers.didDelete { - keyDownMonitor = NSEvent.localMonitor(for: .keyDown) { [weak self] event in + keyDownMonitor = .local(for: .keyDown) { [weak self] event in guard let self = self else { return event } guard event.keyCode == 51 else { return event } if let collectionView = (NSApp.keyWindow?.firstResponder as? NSCollectionView), collectionView.dataSource === self { diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+Delete.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+Delete.swift index e6690ead..448b35e3 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+Delete.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+Delete.swift @@ -95,7 +95,7 @@ extension NSTableViewDiffableDataSource { func setupKeyDownMonitor() { if let canDelete = deletingHandlers.canDelete, let didDelete = deletingHandlers.didDelete { - keyDownMonitor = NSEvent.localMonitor(for: .keyDown) { [weak self] event in + keyDownMonitor = .local(for: .keyDown) { [weak self] event in guard let self = self else { return event } guard event.keyCode == 51 else { return event } if let tableView = (NSApp.keyWindow?.firstResponder as? NSTableView), tableView.dataSource === self { From 8c012373932ea6727d9e7ee89f0fd1b825a8b3a4 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Fri, 22 Aug 2025 07:02:32 +0200 Subject: [PATCH 36/42] updated --- .../xcshareddata/swiftpm/Package.resolved | 4 +- Package.swift | 3 +- .../NSListContentView+ImageView.swift | 280 +++++++++++++++--- .../NSListContentView+ImageViewAlt.swift | 162 ++++++++++ .../NSListContentView+ImageViewAlt1.swift | 94 ++++++ .../Resources/fontSizes | 1 + 6 files changed, 496 insertions(+), 48 deletions(-) create mode 100644 Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt.swift create mode 100644 Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt1.swift create mode 100644 Sources/AdvancedCollectionTableView/Resources/fontSizes diff --git a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 10bfc1a6..2f798ee7 100644 --- a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -16,7 +16,7 @@ "location" : "https://github.com/flocked/FZSwiftUtils.git", "state" : { "branch" : "main", - "revision" : "bb48070ce5e3fb586dc3f3041dab1704488391b5" + "revision" : "11bc4fb9781f48917d8d4548fd9ee541255027f9" } }, { @@ -25,7 +25,7 @@ "location" : "https://github.com/flocked/FZUIKit.git", "state" : { "branch" : "main", - "revision" : "7f3959f2e202973117a912ac88f3d3ec4fba7d00" + "revision" : "5c610909d2ec3f8896fc3bf3a3a5acd5dd944a5f" } } ], diff --git a/Package.swift b/Package.swift index 0b8cc593..b8458bdf 100644 --- a/Package.swift +++ b/Package.swift @@ -22,7 +22,6 @@ let package = Package( targets: [ .target( name: "AdvancedCollectionTableView", - dependencies: ["FZSwiftUtils", "FZUIKit", "FZQuicklook"], path: "Sources/AdvancedCollectionTableView" - ), + dependencies: ["FZSwiftUtils", "FZUIKit", "FZQuicklook"], path: "Sources/AdvancedCollectionTableView", resources: [.process("Resources")]), ] ) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift index 9453e794..14f4d52e 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift @@ -11,81 +11,273 @@ import FZUIKit import SwiftUI extension NSListContentView { - class ListImageView: ImageView { + class ListImageView: NSView { + let imageView = ImageView() + + var imageScaling: NSListContentConfiguration.ImageProperties.ImageScaling = .scaleToFit { + didSet { + guard oldValue != imageScaling else { return } + imageView.imageScaling = imageScaling.scaling + setNeedsLayout() + } + } + + var image: NSImage? { + get { imageView.image } + set { + imageView.image = newValue + isHidden = newValue == nil + setNeedsLayout() + } + } + var properties: NSListContentConfiguration.ImageProperties { didSet { guard oldValue != properties else { return } update() } } - - override var image: NSImage? { - didSet { isHidden = image == nil } + + func update() { + imageScaling = properties.scaling + imageView.symbolConfiguration = properties.symbolConfiguration?.nsSymbolConfiguration() + imageView.border = properties.resolvedBorder() + imageView.backgroundColor = properties.resolvedBackgroundColor() + imageView.contentTintColor = properties.resolvedTintColor() + imageView.cornerRadius = properties.cornerRadius + imageView.outerShadow = properties.resolvedShadow() + imageView.toolTip = properties.toolTip + imageView._reservedLayoutSize = properties.reservedLayoutSize + invalidateIntrinsicContentSize() + } + + override func layout() { + super.layout() + + if imageScaling == .scaleToFill, let imageSize = image?.size { + imageView.frame.size = imageSize.scaled(toFill: bounds.size) + imageView.center = bounds.center + } else { + imageView.frame = bounds + } + } + + override var fittingSize: NSSize { + imageView.fittingSize + } + + override func alignmentRect(forFrame frame: NSRect) -> NSRect { + imageView.alignmentRect(forFrame: frame) } + override func frame(forAlignmentRect alignmentRect: NSRect) -> NSRect { + imageView.frame(forAlignmentRect: alignmentRect) + } + + override var firstBaselineOffsetFromTop: CGFloat { + imageView.firstBaselineOffsetFromTop + } + + override var lastBaselineOffsetFromBottom: CGFloat { + imageView.lastBaselineOffsetFromBottom + } + + override var baselineOffsetFromBottom: CGFloat { + imageView.baselineOffsetFromBottom + } + override var intrinsicContentSize: NSSize { - var intrinsicContentSize = super.intrinsicContentSize - - intrinsicContentSize = intrinsicContentSize.clamped(min: reservedLayoutSize) + var intrinsicContentSize = imageView.intrinsicContentSize - if reservedLayoutSize.width == 0, image?.isSymbolImage == true, properties.position.orientation == .horizontal { + intrinsicContentSize = intrinsicContentSize.clamped(min: imageView._reservedLayoutSize ?? .zero) + + if imageView._reservedLayoutSize?.width == 0, image?.isSymbolImage == true, properties.position.orientation == .horizontal { intrinsicContentSize.width = (intrinsicContentSize.height * 2.5).rounded(.towardZero) return intrinsicContentSize } - if reservedLayoutSize.width == NSListContentConfiguration.ImageProperties.standardDimension { - // intrinsicContentSize.width = intrinsicContentSize.width.c + if imageView._reservedLayoutSize?.width == NSListContentConfiguration.ImageProperties.standardDimension { + // intrinsicContentSize.width = intrinsicContentSize.width.c } - + if let calculatedSize = calculatedSize { return calculatedSize } - + return intrinsicContentSize } - - var calculatedSize: CGSize? { - didSet { - invalidateIntrinsicContentSize() - } - } - + var verticalConstraint: NSLayoutConstraint? - var reservedLayoutSize: CGSize = .zero { - didSet { - if reservedLayoutSize.width == NSListContentConfiguration.ImageProperties.standardDimension { - reservedLayoutSize.width = 36.0 - } - if reservedLayoutSize.height == NSListContentConfiguration.ImageProperties.standardDimension { - reservedLayoutSize.height = 9.0 - } - } - } - - func update() { - imageScaling = image?.isSymbolImage == true ? .none : properties.scaling.imageScaling - symbolConfiguration = properties.symbolConfiguration?.nsSymbolConfiguration() - border = properties.resolvedBorder() - backgroundColor = properties.resolvedBackgroundColor() - tintColor = properties.resolvedTintColor() - cornerRadius = properties.cornerRadius - outerShadow = properties.resolvedShadow() - toolTip = properties.toolTip - reservedLayoutSize = properties.reservedLayoutSize - invalidateIntrinsicContentSize() + + var calculatedSize: CGSize? { + didSet { invalidateIntrinsicContentSize() } } - + init(properties: NSListContentConfiguration.ImageProperties) { self.properties = properties super.init(frame: .zero) wantsLayer = true - imageAlignment = .alignCenter + addSubview(imageView) update() } - + @available(*, unavailable) required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") } } } + +extension NSListContentView.ListImageView { + class ImageView: NSImageView { + var _reservedLayoutSize: CGSize? { + get { (cell as? ImageCell)?.reservedLayoutSize } + set { + guard var newValue = newValue else { return } + if newValue.width == NSListContentConfiguration.ImageProperties.standardDimension { + newValue.width = 36.0 + } + if newValue.height == NSListContentConfiguration.ImageProperties.standardDimension { + newValue.height = 9.0 + } + (cell as? ImageCell)?.reservedLayoutSize = newValue + } + } + + override class var cellClass: AnyClass? { + get { ImageCell.self } + set { } + } + + private class ImageCell: NSImageCell { + var reservedLayoutSize: CGSize? = .zero + var lastSymbolFont: SymbolFont = .default + var symbolSize = CGSize(25.0, 20.0) + var observations: [KeyValueObservation] = [] + var needsSymbolSizeUpdate = false + + override var cellSize: NSSize { + guard let reservedLayoutSize = reservedLayoutSize, let image = image else { return super.cellSize } + var cellSize = reservedLayoutSize + if cellSize.width == 0 || cellSize.height == 0 { + if image.isSymbolImage { + updateSymbolSize() + if cellSize.width == 0 { cellSize.width = symbolSize.width } + if cellSize.height == 0 { cellSize.height = symbolSize.height } + } else { + if cellSize.width == 0 { cellSize.width = image.size.width } + if cellSize.height == 0 { cellSize.height = image.size.height } + } + } + return cellSize + } + + override func draw(withFrame cellFrame: NSRect, in controlView: NSView) { + guard reservedLayoutSize != nil, let image = image else { + super.draw(withFrame: cellFrame, in: controlView) + return + } + let reservedSize = cellSize + var imageRect: CGRect = CGRect(.zero, image.size) + switch imageAlignment { + case .alignLeft, .alignTopLeft, .alignBottomLeft: + imageRect.origin.x = cellFrame.origin.x + case .alignRight, .alignTopRight, .alignBottomRight: + imageRect.origin.x = cellFrame.maxX - reservedSize.width + case .alignCenter, .alignTop, .alignBottom: + imageRect.origin.x = cellFrame.midX - (reservedSize.width / 2.0) + default: + imageRect.origin.x = cellFrame.origin.x + } + switch imageAlignment { + case .alignBottom, .alignBottomLeft, .alignBottomRight: + imageRect.origin.y = cellFrame.origin.y + case .alignTop, .alignTopLeft, .alignTopRight: + imageRect.origin.y = cellFrame.maxY - reservedSize.height + case .alignCenter, .alignLeft, .alignRight: + imageRect.origin.y = cellFrame.midY - (reservedSize.height / 2.0) + default: + imageRect.origin.y = cellFrame.origin.y + } + imageRect.origin.x += (reservedSize.width - image.size.width) / 2 + imageRect.origin.y += (reservedSize.height - image.size.height) / 2 + // image.draw(in: imageRect) + super.draw(withFrame: imageRect, in: controlView) + } + + func updateSymbolSize() { + guard needsSymbolSizeUpdate else { return } + let symbolFont = symbolFont + needsSymbolSizeUpdate = false + guard symbolFont != lastSymbolFont else { return } + lastSymbolFont = symbolFont + symbolSize = Self.symbolSizes[symbolFont] ?? Self.symbolSizes[.default]! + } + + static let symbolSizes: [SymbolFont: CGSize] = { + if let url = Bundle.module.url(forResource: "fontSizes"), let data = try? Data(contentsOf: url), let sizes = try? JSONDecoder().decode([SymbolFont: CGSize].self, from: data) { + return sizes + } + return [.default : CGSize(25.0, 20.0)] + }() + + func setupObservations(for imageView: NSImageView) { + observations += imageView.observeChanges(for: \.image) { [weak self] old, new in + guard let self = self, old != new else { return } + self.needsSymbolSizeUpdate = true + } + observations += imageView.observeChanges(for: \.symbolConfiguration) { [weak self] old, new in + guard let self = self else { return } + self.needsSymbolSizeUpdate = true + } + } + + var symbolConfiguration: NSImage.SymbolConfiguration? { + if #available(macOS 12.0, *) { + return (controlView as? NSImageView)?.symbolConfiguration ?? image?.symbolConfiguration + } else { + return (controlView as? NSImageView)?.symbolConfiguration + } + } + + var symbolFont: SymbolFont { + if let configuration = symbolConfiguration { + return SymbolFont(configuration.pointSize, configuration.scale, configuration.weight) + } + return .default + } + } + } +} + +fileprivate extension NSImage.SymbolConfiguration { + var pointSize: CGFloat { + get { value(forKey: "pointSize") ?? 0.0 } + set { setIvarValue(Double(newValue), of: "_pointSize") } + } + + var scale: NSImage.SymbolScale { + guard let rawValue: Int = value(forKey: "scale"), rawValue != -1 else { + return .default } + return NSUIImage.SymbolScale(rawValue: rawValue) ?? .default + } + + var weight: NSFont.Weight { + guard let weight: Double = value(forKey: "weight") else { return .regular } + return NSUISymbolWeight(rawValue: weight) + } +} + +fileprivate struct SymbolFont: Hashable, Codable { + let size: CGFloat + let scale: Int + let weight: CGFloat + + init(_ size: CGFloat, _ scale: NSImage.SymbolScale, _ weight: NSFont.Weight) { + self.size = size + self.scale = scale.rawValue + self.weight = (weight == .unspecified ? .regular : weight).rawValue + } + + static let `default` = Self(13.0, .default, .regular) +} diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt.swift new file mode 100644 index 00000000..5002e56c --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt.swift @@ -0,0 +1,162 @@ +// +// NSList+ImageV.swift +// +// +// Created by Florian Zand on 21.08.25. +// + +import AppKit +import FZSwiftUtils +import FZUIKit +import SwiftUI + +/* +extension NSListContentView { + class ListImageView: NSImageView { + override var image: NSImage? { + didSet { isHidden = image == nil } + } + + override var intrinsicContentSize: NSSize { + var intrinsicContentSize = super.intrinsicContentSize + + intrinsicContentSize = intrinsicContentSize.clamped(min: _reservedLayoutSize ?? .zero) + + if _reservedLayoutSize?.width == 0, image?.isSymbolImage == true, properties.position.orientation == .horizontal { + intrinsicContentSize.width = (intrinsicContentSize.height * 2.5).rounded(.towardZero) + return intrinsicContentSize + } + + if _reservedLayoutSize?.width == NSListContentConfiguration.ImageProperties.standardDimension { + // intrinsicContentSize.width = intrinsicContentSize.width.c + } + + if let calculatedSize = calculatedSize { + return calculatedSize + } + + return intrinsicContentSize + } + + var properties: NSListContentConfiguration.ImageProperties { + didSet { + guard oldValue != properties else { return } + update() + } + } + + func update() { + imageScaling = .scaleNone + symbolConfiguration = properties.symbolConfiguration?.nsSymbolConfiguration() + border = properties.resolvedBorder() + backgroundColor = properties.resolvedBackgroundColor() + contentTintColor = properties.resolvedTintColor() + cornerRadius = properties.cornerRadius + outerShadow = properties.resolvedShadow() + toolTip = properties.toolTip + _reservedLayoutSize = properties.reservedLayoutSize + invalidateIntrinsicContentSize() + } + + init(properties: NSListContentConfiguration.ImageProperties) { + self.properties = properties + super.init(frame: .zero) + wantsLayer = true + update() + } + + var verticalConstraint: NSLayoutConstraint? + + var calculatedSize: CGSize? { + didSet { + invalidateIntrinsicContentSize() + } + } + + @available(*, unavailable) + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + var _reservedLayoutSize: CGSize? { + get { (cell as? ImageCell)?.reservedLayoutSize } + set { + guard var newValue = newValue else { return } + if newValue.width == NSListContentConfiguration.ImageProperties.standardDimension { + newValue.width = 36.0 + } + if newValue.height == NSListContentConfiguration.ImageProperties.standardDimension { + newValue.height = 9.0 + } + (cell as? ImageCell)?.reservedLayoutSize = newValue + } + } + + override class var cellClass: AnyClass? { + get { ImageCell.self } + set { } + } + + private class ImageCell: NSImageCell { + var reservedLayoutSize: CGSize? = .zero + var symbolConfiguration: NSImage.SymbolConfiguration? { + if #available(macOS 12.0, *) { + return (controlView as? NSImageView)?.symbolConfiguration ?? image?.symbolConfiguration + } else { + return (controlView as? NSImageView)?.symbolConfiguration + } + } + + override var cellSize: NSSize { + guard let reservedLayoutSize = reservedLayoutSize, let image = image else { return super.cellSize } + var cellSize = reservedLayoutSize + if cellSize.width == 0 || cellSize.height == 0 { + if image.isSymbolImage { + let symbolSize = CGSize(width: 36, height: 16) + if cellSize.width == 0 { cellSize.width = symbolSize.width } + if cellSize.height == 0 { cellSize.height = symbolSize.height } + } else { + if cellSize.width == 0 { cellSize.width = image.size.width } + if cellSize.height == 0 { cellSize.height = image.size.height } + } + } + return cellSize + } + + override func draw(withFrame cellFrame: NSRect, in controlView: NSView) { + guard reservedLayoutSize != nil, let image = image else { + super.draw(withFrame: cellFrame, in: controlView) + return + } + let reservedSize = cellSize + var imageRect: CGRect = CGRect(.zero, image.size) + switch imageAlignment { + case .alignLeft, .alignTopLeft, .alignBottomLeft: + imageRect.origin.x = cellFrame.origin.x + case .alignRight, .alignTopRight, .alignBottomRight: + imageRect.origin.x = cellFrame.maxX - reservedSize.width + case .alignCenter, .alignTop, .alignBottom: + imageRect.origin.x = cellFrame.midX - (reservedSize.width / 2.0) + default: + imageRect.origin.x = cellFrame.origin.x + } + switch imageAlignment { + case .alignBottom, .alignBottomLeft, .alignBottomRight: + imageRect.origin.y = cellFrame.origin.y + case .alignTop, .alignTopLeft, .alignTopRight: + imageRect.origin.y = cellFrame.maxY - reservedSize.height + case .alignCenter, .alignLeft, .alignRight: + imageRect.origin.y = cellFrame.midY - (reservedSize.height / 2.0) + default: + imageRect.origin.y = cellFrame.origin.y + } + imageRect.origin.x += (reservedSize.width - image.size.width) / 2 + imageRect.origin.y += (reservedSize.height - image.size.height) / 2 + // image.draw(in: imageRect) + Swift.print("draw", imageRect) + super.draw(withFrame: imageRect, in: controlView) + } + } + } +} +*/ diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt1.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt1.swift new file mode 100644 index 00000000..57633057 --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt1.swift @@ -0,0 +1,94 @@ +// +// NSListContentView+ImageViewAlt1.swift +// +// +// Created by Florian Zand on 22.08.25. +// + +import AppKit +import FZSwiftUtils +import FZUIKit +import SwiftUI + +/* +extension NSListContentView { + class ListImageView: ImageView { + var properties: NSListContentConfiguration.ImageProperties { + didSet { + guard oldValue != properties else { return } + update() + } + } + + override var image: NSImage? { + didSet { isHidden = image == nil } + } + + override var intrinsicContentSize: NSSize { + var intrinsicContentSize = super.intrinsicContentSize + + intrinsicContentSize = intrinsicContentSize.clamped(min: _reservedLayoutSize) + + if _reservedLayoutSize.width == 0, image?.isSymbolImage == true, properties.position.orientation == .horizontal { + intrinsicContentSize.width = (intrinsicContentSize.height * 2.5).rounded(.towardZero) + return intrinsicContentSize + } + + if _reservedLayoutSize.width == NSListContentConfiguration.ImageProperties.standardDimension { + // intrinsicContentSize.width = intrinsicContentSize.width.c + } + + if let calculatedSize = calculatedSize { + return calculatedSize + } + + return intrinsicContentSize + } + + var calculatedSize: CGSize? { + didSet { + invalidateIntrinsicContentSize() + } + } + + var verticalConstraint: NSLayoutConstraint? + var _reservedLayoutSize: CGSize = .zero { + didSet { + if _reservedLayoutSize.width == NSListContentConfiguration.ImageProperties.standardDimension { + _reservedLayoutSize.width = 36.0 + } + if _reservedLayoutSize.height == NSListContentConfiguration.ImageProperties.standardDimension { + _reservedLayoutSize.height = 9.0 + } + } + } + + func update() { + imageScaling = image?.isSymbolImage == true ? .none : properties.scaling.imageScaling + symbolConfiguration = properties.symbolConfiguration?.nsSymbolConfiguration() + border = properties.resolvedBorder() + backgroundColor = properties.resolvedBackgroundColor() + tintColor = properties.resolvedTintColor() + cornerRadius = properties.cornerRadius + outerShadow = properties.resolvedShadow() + toolTip = properties.toolTip + _reservedLayoutSize = properties.reservedLayoutSize + reservedLayoutSize + invalidateIntrinsicContentSize() + } + + init(properties: NSListContentConfiguration.ImageProperties) { + self.properties = properties + super.init(frame: .zero) + wantsLayer = true + imageAlignment = .alignCenter + update() + } + + @available(*, unavailable) + required init?(coder _: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + } +} + */ diff --git a/Sources/AdvancedCollectionTableView/Resources/fontSizes b/Sources/AdvancedCollectionTableView/Resources/fontSizes new file mode 100644 index 00000000..066ec5bc --- /dev/null +++ b/Sources/AdvancedCollectionTableView/Resources/fontSizes @@ -0,0 +1 @@ +[{"size":111,"scale":3,"weight":0.4000000059604645},[280,226],{"size":12,"scale":-1,"weight":-0.4000000059604645},[23,18],{"size":153,"scale":-1,"weight":-0.800000011920929},[278,223],{"size":187,"scale":1,"weight":0.23000000417232513},[285,232],{"size":64,"scale":3,"weight":-0.6000000238418579},[151,120],{"size":15,"scale":2,"weight":0.6200000047683716},[31,26],{"size":20,"scale":-1,"weight":0.6200000047683716},[41,33],{"size":37,"scale":3,"weight":0.30000001192092896},[92,74],{"size":20,"scale":2,"weight":0.5600000023841858},[41,33],{"size":78,"scale":3,"weight":0.6200000047683716},[204,165],{"size":160,"scale":2,"weight":0.6200000047683716},[329,266],{"size":70,"scale":2,"weight":0.5600000023841858},[141,114],{"size":12,"scale":3,"weight":0.30000001192092896},[30,25],{"size":11,"scale":-1,"weight":-0.6000000238418579},[21,16],{"size":117,"scale":3,"weight":-0.6000000238418579},[276,219],{"size":74,"scale":3,"weight":0.30000001192092896},[184,149],{"size":29,"scale":3,"weight":0.6200000047683716},[76,62],{"size":3,"scale":1,"weight":0.5600000023841858},[6,4],{"size":7,"scale":3,"weight":0.5600000023841858},[19,15],{"size":24,"scale":-1,"weight":0.23000000417232513},[47,38],{"size":111,"scale":-1,"weight":0.4000000059604645},[219,177],{"size":130,"scale":-1,"weight":0.23000000417232513},[251,203],{"size":188,"scale":-1,"weight":0.4000000059604645},[371,300],{"size":128,"scale":-1,"weight":0.5600000023841858},[258,209],{"size":86,"scale":3,"weight":-0.800000011920929},[202,161],{"size":182,"scale":1,"weight":-0.4000000059604645},[269,216],{"size":63,"scale":-1,"weight":-0.6000000238418579},[116,92],{"size":99,"scale":1,"weight":-0.800000011920929},[141,113],{"size":82,"scale":2,"weight":-0.800000011920929},[149,119],{"size":167,"scale":3,"weight":-0.4000000059604645},[400,319],{"size":158,"scale":2,"weight":0.4000000059604645},[312,253],{"size":12,"scale":3,"weight":-0.800000011920929},[29,23],{"size":143,"scale":1,"weight":-0.800000011920929},[204,163],{"size":37,"scale":1,"weight":0.4000000059604645},[58,47],{"size":194,"scale":2,"weight":-0.800000011920929},[352,282],{"size":32,"scale":1,"weight":0.23000000417232513},[49,40],{"size":36,"scale":1,"weight":-0.4000000059604645},[54,43],{"size":186,"scale":2,"weight":0.23000000417232513},[359,289],{"size":51,"scale":3,"weight":0.5600000023841858},[132,106],{"size":101,"scale":1,"weight":0.6200000047683716},[164,133],{"size":79,"scale":-1,"weight":0.4000000059604645},[157,127],{"size":189,"scale":2,"weight":0},[360,283],{"size":63,"scale":2,"weight":-0.4000000059604645},[119,95],{"size":41,"scale":-1,"weight":0.23000000417232513},[80,64],{"size":193,"scale":1,"weight":0.5600000023841858},[307,248],{"size":8,"scale":-1,"weight":0},[16,12],{"size":113,"scale":3,"weight":0},[275,220],{"size":75,"scale":-1,"weight":0.23000000417232513},[145,117],{"size":45,"scale":-1,"weight":0.23000000417232513},[88,71],{"size":28,"scale":2,"weight":0},[54,42],{"size":78,"scale":1,"weight":0.23000000417232513},[119,97],{"size":8,"scale":3,"weight":0.23000000417232513},[20,17],{"size":151,"scale":-1,"weight":-0.800000011920929},[275,219],{"size":189,"scale":2,"weight":0.30000001192092896},[368,298],{"size":191,"scale":2,"weight":0.30000001192092896},[372,300],{"size":15,"scale":1,"weight":0.30000001192092896},[23,19],{"size":155,"scale":3,"weight":0},[377,302],{"size":8,"scale":-1,"weight":-0.4000000059604645},[16,12],{"size":175,"scale":-1,"weight":-0.6000000238418579},[321,254],{"size":124,"scale":2,"weight":0},[236,186],{"size":56,"scale":2,"weight":-0.4000000059604645},[105,84],{"size":171,"scale":2,"weight":0.23000000417232513},[330,266],{"size":64,"scale":3,"weight":-0.4000000059604645},[154,122],{"size":80,"scale":-1,"weight":0.6200000047683716},[164,133],{"size":124,"scale":3,"weight":0.30000001192092896},[308,248],{"size":174,"scale":3,"weight":-0.800000011920929},[408,326],{"size":156,"scale":3,"weight":0.6200000047683716},[407,329],{"size":14,"scale":2,"weight":0},[27,21],{"size":159,"scale":1,"weight":-0.6000000238418579},[230,182],{"size":143,"scale":1,"weight":0.5600000023841858},[228,185],{"size":174,"scale":1,"weight":-0.4000000059604645},[257,207],{"size":170,"scale":3,"weight":-0.800000011920929},[399,319],{"size":166,"scale":-1,"weight":0.30000001192092896},[323,261],{"size":152,"scale":2,"weight":-0.800000011920929},[276,221],{"size":42,"scale":2,"weight":0.4000000059604645},[84,67],{"size":3,"scale":3,"weight":0.6200000047683716},[9,7],{"size":95,"scale":3,"weight":-0.800000011920929},[223,178],{"size":39,"scale":3,"weight":0.5600000023841858},[101,82],{"size":94,"scale":3,"weight":-0.800000011920929},[220,177],{"size":115,"scale":2,"weight":-0.800000011920929},[209,167],{"size":200,"scale":3,"weight":0.23000000417232513},[492,396],{"size":132,"scale":3,"weight":0},[321,258],{"size":171,"scale":-1,"weight":-0.800000011920929},[311,249],{"size":161,"scale":-1,"weight":0},[306,241],{"size":51,"scale":-1,"weight":0.5600000023841858},[104,84],{"size":166,"scale":3,"weight":-0.800000011920929},[389,311],{"size":43,"scale":3,"weight":0.30000001192092896},[107,87],{"size":85,"scale":1,"weight":0.23000000417232513},[130,106],{"size":31,"scale":2,"weight":-0.6000000238418579},[57,45],{"size":19,"scale":-1,"weight":-0.800000011920929},[35,28],{"size":97,"scale":1,"weight":0.23000000417232513},[148,120],{"size":7,"scale":2,"weight":-0.6000000238418579},[14,10],{"size":70,"scale":1,"weight":0.6200000047683716},[113,92],{"size":171,"scale":-1,"weight":-0.4000000059604645},[320,256],{"size":88,"scale":2,"weight":0.5600000023841858},[178,143],{"size":64,"scale":-1,"weight":0.4000000059604645},[126,102],{"size":18,"scale":1,"weight":0.6200000047683716},[30,24],{"size":63,"scale":2,"weight":0.4000000059604645},[125,101],{"size":73,"scale":-1,"weight":0.30000001192092896},[142,115],{"size":106,"scale":2,"weight":0.6200000047683716},[218,176],{"size":181,"scale":1,"weight":0.30000001192092896},[279,226],{"size":109,"scale":2,"weight":0.6200000047683716},[224,181],{"size":80,"scale":2,"weight":-0.6000000238418579},[147,116],{"size":4,"scale":-1,"weight":0.6200000047683716},[9,7],{"size":93,"scale":-1,"weight":-0.4000000059604645},[174,139],{"size":20,"scale":2,"weight":-0.4000000059604645},[38,30],{"size":1,"scale":-1,"weight":-0.6000000238418579},[2,2],{"size":137,"scale":1,"weight":0.4000000059604645},[214,174],{"size":73,"scale":2,"weight":0.6200000047683716},[150,122],{"size":193,"scale":-1,"weight":0.5600000023841858},[389,315],{"size":92,"scale":3,"weight":0.6200000047683716},[240,195],{"size":33,"scale":-1,"weight":-0.6000000238418579},[61,48],{"size":124,"scale":-1,"weight":-0.800000011920929},[226,181],{"size":90,"scale":2,"weight":0.4000000059604645},[178,144],{"size":133,"scale":-1,"weight":0.5600000023841858},[268,217],{"size":179,"scale":2,"weight":-0.6000000238418579},[328,259],{"size":177,"scale":1,"weight":0},[267,216],{"size":148,"scale":3,"weight":0.6200000047683716},[386,312],{"size":75,"scale":3,"weight":0.4000000059604645},[189,153],{"size":118,"scale":-1,"weight":0},[224,177],{"size":10,"scale":2,"weight":0.23000000417232513},[20,16],{"size":29,"scale":-1,"weight":0.5600000023841858},[59,48],{"size":200,"scale":3,"weight":-0.800000011920929},[468,375],{"size":172,"scale":3,"weight":-0.800000011920929},[403,323],{"size":132,"scale":3,"weight":-0.4000000059604645},[317,252],{"size":134,"scale":1,"weight":-0.6000000238418579},[194,153],{"size":21,"scale":2,"weight":-0.6000000238418579},[39,31],{"size":91,"scale":1,"weight":0},[137,111],{"size":124,"scale":-1,"weight":0.4000000059604645},[245,199],{"size":108,"scale":1,"weight":-0.6000000238418579},[157,124],{"size":154,"scale":3,"weight":-0.6000000238418579},[362,289],{"size":161,"scale":2,"weight":0},[306,241],{"size":168,"scale":3,"weight":0.5600000023841858},[432,349],{"size":57,"scale":3,"weight":0.30000001192092896},[142,115],{"size":154,"scale":3,"weight":0.4000000059604645},[388,313],{"size":155,"scale":-1,"weight":0.5600000023841858},[313,253],{"size":76,"scale":-1,"weight":0.30000001192092896},[148,120],{"size":31,"scale":-1,"weight":0.30000001192092896},[61,49],{"size":31,"scale":1,"weight":0.30000001192092896},[48,39],{"size":41,"scale":1,"weight":0.5600000023841858},[66,54],{"size":74,"scale":3,"weight":0.4000000059604645},[187,151],{"size":185,"scale":-1,"weight":0.30000001192092896},[360,291],{"size":145,"scale":2,"weight":0.30000001192092896},[283,228],{"size":91,"scale":3,"weight":-0.800000011920929},[213,171],{"size":135,"scale":2,"weight":0.30000001192092896},[264,213],{"size":194,"scale":3,"weight":0},[471,378],{"size":9,"scale":1,"weight":-0.4000000059604645},[14,11],{"size":166,"scale":2,"weight":0.6200000047683716},[341,276],{"size":24,"scale":-1,"weight":0.30000001192092896},[47,38],{"size":179,"scale":3,"weight":0.23000000417232513},[441,354],{"size":135,"scale":3,"weight":0.23000000417232513},[333,267],{"size":85,"scale":-1,"weight":0.4000000059604645},[168,136],{"size":200,"scale":3,"weight":0.30000001192092896},[497,400],{"size":10,"scale":-1,"weight":-0.6000000238418579},[19,15],{"size":131,"scale":1,"weight":-0.4000000059604645},[194,156],{"size":65,"scale":3,"weight":0},[158,127],{"size":125,"scale":-1,"weight":0.30000001192092896},[244,197],{"size":162,"scale":2,"weight":0},[308,242],{"size":95,"scale":1,"weight":0.23000000417232513},[145,118],{"size":162,"scale":2,"weight":0.30000001192092896},[315,255],{"size":48,"scale":-1,"weight":0.23000000417232513},[93,75],{"size":147,"scale":3,"weight":0.6200000047683716},[384,310],{"size":94,"scale":-1,"weight":0.30000001192092896},[184,148],{"size":54,"scale":2,"weight":0.23000000417232513},[104,84],{"size":165,"scale":2,"weight":0.23000000417232513},[318,257],{"size":170,"scale":2,"weight":0.6200000047683716},[349,283],{"size":5,"scale":2,"weight":-0.4000000059604645},[10,8],{"size":117,"scale":2,"weight":-0.4000000059604645},[219,175],{"size":105,"scale":1,"weight":-0.800000011920929},[150,119],{"size":43,"scale":-1,"weight":0.4000000059604645},[85,70],{"size":23,"scale":3,"weight":0.5600000023841858},[59,48],{"size":28,"scale":2,"weight":0.4000000059604645},[56,45],{"size":86,"scale":-1,"weight":0.5600000023841858},[174,140],{"size":59,"scale":1,"weight":0.23000000417232513},[90,73],{"size":90,"scale":3,"weight":0.5600000023841858},[231,187],{"size":65,"scale":3,"weight":0.23000000417232513},[160,129],{"size":78,"scale":2,"weight":0.6200000047683716},[160,130],{"size":48,"scale":1,"weight":-0.800000011920929},[69,55],{"size":75,"scale":1,"weight":0.5600000023841858},[120,97],{"size":69,"scale":3,"weight":0.23000000417232513},[170,137],{"size":102,"scale":1,"weight":-0.4000000059604645},[151,121],{"size":10,"scale":3,"weight":0},[25,20],{"size":4,"scale":3,"weight":-0.6000000238418579},[10,8],{"size":83,"scale":-1,"weight":-0.6000000238418579},[152,120],{"size":62,"scale":-1,"weight":0.6200000047683716},[128,103],{"size":22,"scale":2,"weight":0.4000000059604645},[44,36],{"size":181,"scale":1,"weight":0.4000000059604645},[283,229],{"size":61,"scale":2,"weight":0.6200000047683716},[126,102],{"size":169,"scale":3,"weight":0},[411,329],{"size":123,"scale":3,"weight":0},[299,240],{"size":28,"scale":1,"weight":-0.800000011920929},[41,32],{"size":161,"scale":3,"weight":-0.4000000059604645},[386,307],{"size":104,"scale":3,"weight":-0.800000011920929},[243,195],{"size":129,"scale":-1,"weight":0.30000001192092896},[251,204],{"size":125,"scale":3,"weight":0},[304,244],{"size":2,"scale":1,"weight":0.5600000023841858},[3,3],{"size":106,"scale":2,"weight":0.5600000023841858},[214,173],{"size":191,"scale":2,"weight":0.23000000417232513},[368,297],{"size":130,"scale":2,"weight":-0.800000011920929},[236,189],{"size":162,"scale":1,"weight":0.5600000023841858},[258,209],{"size":91,"scale":3,"weight":0.4000000059604645},[230,185],{"size":31,"scale":3,"weight":0.6200000047683716},[81,66],{"size":175,"scale":3,"weight":0.5600000023841858},[450,363],{"size":180,"scale":3,"weight":-0.800000011920929},[422,338],{"size":1,"scale":3,"weight":0.6200000047683716},[3,2],{"size":94,"scale":2,"weight":0.23000000417232513},[181,146],{"size":22,"scale":1,"weight":0.23000000417232513},[34,28],{"size":37,"scale":-1,"weight":-0.800000011920929},[67,54],{"size":150,"scale":2,"weight":-0.4000000059604645},[281,224],{"size":146,"scale":2,"weight":0.30000001192092896},[285,229],{"size":1,"scale":2,"weight":0.6200000047683716},[2,2],{"size":193,"scale":2,"weight":-0.4000000059604645},[361,289],{"size":151,"scale":2,"weight":-0.800000011920929},[275,219],{"size":174,"scale":2,"weight":0.6200000047683716},[357,289],{"size":114,"scale":3,"weight":-0.6000000238418579},[269,214],{"size":143,"scale":1,"weight":0.23000000417232513},[218,177],{"size":55,"scale":-1,"weight":0.30000001192092896},[108,87],{"size":94,"scale":-1,"weight":0.6200000047683716},[193,156],{"size":172,"scale":2,"weight":-0.6000000238418579},[315,249],{"size":2,"scale":3,"weight":0.5600000023841858},[6,4],{"size":77,"scale":1,"weight":0.4000000059604645},[121,98],{"size":23,"scale":-1,"weight":0},[44,35],{"size":40,"scale":3,"weight":0.4000000059604645},[101,82],{"size":193,"scale":1,"weight":-0.800000011920929},[276,219],{"size":110,"scale":3,"weight":0.23000000417232513},[271,218],{"size":193,"scale":3,"weight":0.5600000023841858},[496,400],{"size":42,"scale":3,"weight":0.6200000047683716},[110,89],{"size":22,"scale":1,"weight":-0.6000000238418579},[32,26],{"size":5,"scale":1,"weight":0.6200000047683716},[9,7],{"size":49,"scale":1,"weight":0.23000000417232513},[75,61],{"size":135,"scale":1,"weight":0.23000000417232513},[205,167],{"size":35,"scale":3,"weight":0},[86,69],{"size":196,"scale":2,"weight":-0.4000000059604645},[367,293],{"size":16,"scale":2,"weight":-0.6000000238418579},[30,24],{"size":19,"scale":3,"weight":-0.800000011920929},[45,36],{"size":105,"scale":1,"weight":0.4000000059604645},[164,133],{"size":88,"scale":3,"weight":-0.6000000238418579},[207,165],{"size":116,"scale":1,"weight":-0.800000011920929},[166,132],{"size":139,"scale":3,"weight":0.23000000417232513},[342,275],{"size":101,"scale":2,"weight":0.4000000059604645},[200,162],{"size":96,"scale":1,"weight":-0.800000011920929},[138,109],{"size":114,"scale":2,"weight":0},[217,171],{"size":9,"scale":1,"weight":0.23000000417232513},[14,11],{"size":140,"scale":-1,"weight":0.23000000417232513},[270,218],{"size":138,"scale":-1,"weight":-0.6000000238418579},[253,200],{"size":31,"scale":-1,"weight":0.5600000023841858},[63,51],{"size":21,"scale":3,"weight":-0.800000011920929},[50,40],{"size":59,"scale":-1,"weight":0.23000000417232513},[114,92],{"size":190,"scale":2,"weight":-0.4000000059604645},[356,284],{"size":19,"scale":-1,"weight":0.5600000023841858},[39,31],{"size":138,"scale":-1,"weight":0.4000000059604645},[273,220],{"size":153,"scale":1,"weight":0.23000000417232513},[233,189],{"size":42,"scale":3,"weight":-0.800000011920929},[99,79],{"size":81,"scale":1,"weight":-0.800000011920929},[116,92],{"size":125,"scale":1,"weight":-0.4000000059604645},[185,149],{"size":133,"scale":2,"weight":0.30000001192092896},[259,209],{"size":3,"scale":2,"weight":-0.800000011920929},[6,5],{"size":102,"scale":-1,"weight":-0.800000011920929},[186,149],{"size":81,"scale":3,"weight":0.6200000047683716},[212,171],{"size":12,"scale":1,"weight":0.5600000023841858},[20,16],{"size":176,"scale":2,"weight":0.23000000417232513},[339,274],{"size":133,"scale":-1,"weight":0.23000000417232513},[256,207],{"size":105,"scale":-1,"weight":-0.800000011920929},[191,153],{"size":129,"scale":1,"weight":-0.4000000059604645},[191,154],{"size":153,"scale":2,"weight":0.30000001192092896},[298,241],{"size":113,"scale":2,"weight":0.30000001192092896},[220,178],{"size":6,"scale":3,"weight":0.4000000059604645},[16,12],{"size":84,"scale":-1,"weight":0},[160,125],{"size":7,"scale":3,"weight":-0.800000011920929},[17,14],{"size":14,"scale":1,"weight":-0.6000000238418579},[21,17],{"size":189,"scale":1,"weight":-0.800000011920929},[270,215],{"size":4,"scale":1,"weight":0.4000000059604645},[7,6],{"size":119,"scale":3,"weight":-0.6000000238418579},[280,223],{"size":168,"scale":2,"weight":0.4000000059604645},[332,268],{"size":161,"scale":2,"weight":0.30000001192092896},[314,253],{"size":3,"scale":2,"weight":0.30000001192092896},[7,6],{"size":128,"scale":3,"weight":0.5600000023841858},[329,266],{"size":38,"scale":-1,"weight":0.30000001192092896},[74,61],{"size":148,"scale":3,"weight":0},[360,288],{"size":114,"scale":3,"weight":-0.4000000059604645},[273,218],{"size":127,"scale":-1,"weight":0.6200000047683716},[261,211],{"size":56,"scale":3,"weight":-0.800000011920929},[132,106],{"size":57,"scale":1,"weight":0.5600000023841858},[91,74],{"size":178,"scale":3,"weight":-0.6000000238418579},[419,333],{"size":198,"scale":2,"weight":-0.4000000059604645},[370,297],{"size":184,"scale":3,"weight":0.23000000417232513},[453,364],{"size":67,"scale":2,"weight":0.23000000417232513},[129,105],{"size":192,"scale":-1,"weight":0.5600000023841858},[387,313],{"size":194,"scale":-1,"weight":0.6200000047683716},[398,322],{"size":9,"scale":2,"weight":-0.800000011920929},[17,14],{"size":117,"scale":2,"weight":0},[222,175],{"size":151,"scale":-1,"weight":0.4000000059604645},[299,241],{"size":1,"scale":-1,"weight":-0.4000000059604645},[2,2],{"size":106,"scale":-1,"weight":0.6200000047683716},[218,176],{"size":195,"scale":-1,"weight":-0.800000011920929},[355,283],{"size":75,"scale":-1,"weight":0.4000000059604645},[149,120],{"size":7,"scale":-1,"weight":-0.6000000238418579},[14,10],{"size":6,"scale":2,"weight":0.6200000047683716},[13,10],{"size":162,"scale":-1,"weight":0.6200000047683716},[332,269],{"size":183,"scale":3,"weight":0.4000000059604645},[461,372],{"size":57,"scale":-1,"weight":-0.4000000059604645},[107,86],{"size":193,"scale":2,"weight":0.23000000417232513},[372,301],{"size":165,"scale":1,"weight":0.6200000047683716},[267,216],{"size":140,"scale":2,"weight":-0.6000000238418579},[257,203],{"size":69,"scale":-1,"weight":0.6200000047683716},[142,115],{"size":184,"scale":1,"weight":0.6200000047683716},[297,241],{"size":163,"scale":1,"weight":0.30000001192092896},[251,203],{"size":143,"scale":-1,"weight":0.5600000023841858},[289,233],{"size":105,"scale":-1,"weight":0.5600000023841858},[212,171],{"size":176,"scale":1,"weight":0},[265,215],{"size":15,"scale":3,"weight":0.30000001192092896},[38,30],{"size":142,"scale":2,"weight":-0.6000000238418579},[261,206],{"size":44,"scale":3,"weight":0.6200000047683716},[115,93],{"size":139,"scale":1,"weight":0.5600000023841858},[221,179],{"size":163,"scale":1,"weight":0},[245,199],{"size":53,"scale":-1,"weight":0.5600000023841858},[107,87],{"size":111,"scale":1,"weight":0.5600000023841858},[177,143],{"size":61,"scale":3,"weight":-0.800000011920929},[144,115],{"size":170,"scale":3,"weight":0.6200000047683716},[443,359],{"size":181,"scale":2,"weight":0},[344,271],{"size":49,"scale":2,"weight":-0.6000000238418579},[90,72],{"size":197,"scale":3,"weight":0.23000000417232513},[485,389],{"size":188,"scale":2,"weight":0.4000000059604645},[371,300],{"size":82,"scale":1,"weight":-0.800000011920929},[117,93],{"size":74,"scale":2,"weight":-0.800000011920929},[135,108],{"size":166,"scale":2,"weight":0},[316,249],{"size":88,"scale":-1,"weight":0.5600000023841858},[178,143],{"size":187,"scale":2,"weight":0},[355,280],{"size":50,"scale":3,"weight":-0.800000011920929},[117,94],{"size":67,"scale":-1,"weight":0.5600000023841858},[136,110],{"size":34,"scale":1,"weight":0.4000000059604645},[54,44],{"size":61,"scale":-1,"weight":-0.800000011920929},[111,89],{"size":102,"scale":3,"weight":0.4000000059604645},[258,208],{"size":67,"scale":1,"weight":-0.4000000059604645},[99,80],{"size":139,"scale":-1,"weight":0},[264,208],{"size":79,"scale":2,"weight":0.6200000047683716},[162,132],{"size":71,"scale":2,"weight":0.4000000059604645},[141,113],{"size":118,"scale":3,"weight":-0.4000000059604645},[283,226],{"size":128,"scale":2,"weight":0.6200000047683716},[263,212],{"size":168,"scale":1,"weight":0.5600000023841858},[267,216],{"size":61,"scale":1,"weight":0},[92,74],{"size":87,"scale":1,"weight":0.30000001192092896},[134,109],{"size":115,"scale":3,"weight":-0.800000011920929},[270,216],{"size":135,"scale":1,"weight":0},[204,164],{"size":37,"scale":3,"weight":0.4000000059604645},[94,75],{"size":5,"scale":2,"weight":0.30000001192092896},[10,8],{"size":67,"scale":1,"weight":0.23000000417232513},[102,83],{"size":158,"scale":2,"weight":0.23000000417232513},[305,246],{"size":154,"scale":1,"weight":0.5600000023841858},[245,198],{"size":191,"scale":3,"weight":-0.6000000238418579},[450,358],{"size":64,"scale":2,"weight":0.6200000047683716},[132,106],{"size":23,"scale":2,"weight":-0.4000000059604645},[43,35],{"size":107,"scale":1,"weight":0.6200000047683716},[173,141],{"size":78,"scale":3,"weight":-0.4000000059604645},[187,149],{"size":66,"scale":3,"weight":-0.6000000238418579},[156,124],{"size":159,"scale":1,"weight":-0.4000000059604645},[235,189],{"size":190,"scale":3,"weight":-0.6000000238418579},[447,356],{"size":161,"scale":-1,"weight":-0.800000011920929},[292,234],{"size":99,"scale":1,"weight":0.5600000023841858},[158,128],{"size":135,"scale":-1,"weight":-0.4000000059604645},[253,203],{"size":160,"scale":1,"weight":-0.800000011920929},[229,182],{"size":116,"scale":2,"weight":0},[221,174],{"size":189,"scale":3,"weight":0.23000000417232513},[465,374],{"size":73,"scale":3,"weight":-0.800000011920929},[171,137],{"size":90,"scale":2,"weight":-0.6000000238418579},[165,131],{"size":110,"scale":2,"weight":0.5600000023841858},[222,179],{"size":24,"scale":3,"weight":0.6200000047683716},[63,51],{"size":175,"scale":1,"weight":-0.800000011920929},[250,199],{"size":184,"scale":2,"weight":0},[350,275],{"size":34,"scale":1,"weight":0.23000000417232513},[53,43],{"size":144,"scale":3,"weight":0.4000000059604645},[363,292],{"size":163,"scale":-1,"weight":-0.800000011920929},[297,237],{"size":135,"scale":-1,"weight":-0.800000011920929},[246,197],{"size":197,"scale":1,"weight":-0.4000000059604645},[291,234],{"size":86,"scale":2,"weight":0.23000000417232513},[166,134],{"size":192,"scale":1,"weight":-0.4000000059604645},[284,228],{"size":113,"scale":2,"weight":0.5600000023841858},[228,185],{"size":199,"scale":3,"weight":0.4000000059604645},[501,405],{"size":20,"scale":-1,"weight":-0.6000000238418579},[37,29],{"size":172,"scale":1,"weight":0.30000001192092896},[265,215],{"size":18,"scale":1,"weight":0.5600000023841858},[29,23],{"size":160,"scale":1,"weight":-0.6000000238418579},[232,183],{"size":22,"scale":-1,"weight":0.30000001192092896},[44,35],{"size":152,"scale":3,"weight":-0.4000000059604645},[364,290],{"size":113,"scale":-1,"weight":0.6200000047683716},[232,188],{"size":108,"scale":1,"weight":0.30000001192092896},[167,135],{"size":65,"scale":3,"weight":0.5600000023841858},[167,136],{"size":53,"scale":3,"weight":-0.4000000059604645},[127,101],{"size":92,"scale":2,"weight":-0.4000000059604645},[172,138],{"size":54,"scale":3,"weight":0.5600000023841858},[140,112],{"size":50,"scale":-1,"weight":0.5600000023841858},[101,82],{"size":108,"scale":1,"weight":0.6200000047683716},[175,142],{"size":131,"scale":1,"weight":0.30000001192092896},[202,164],{"size":87,"scale":2,"weight":0.4000000059604645},[172,139],{"size":106,"scale":3,"weight":0},[258,207],{"size":114,"scale":-1,"weight":0.23000000417232513},[220,178],{"size":198,"scale":2,"weight":-0.6000000238418579},[363,287],{"size":108,"scale":-1,"weight":0.5600000023841858},[218,176],{"size":68,"scale":2,"weight":0.5600000023841858},[137,111],{"size":19,"scale":-1,"weight":0.23000000417232513},[37,30],{"size":43,"scale":2,"weight":0.4000000059604645},[85,70],{"size":135,"scale":-1,"weight":-0.6000000238418579},[248,196],{"size":27,"scale":3,"weight":0.30000001192092896},[67,54],{"size":159,"scale":1,"weight":0.5600000023841858},[253,205],{"size":31,"scale":2,"weight":0.23000000417232513},[61,48],{"size":58,"scale":-1,"weight":-0.6000000238418579},[107,84],{"size":112,"scale":-1,"weight":0.5600000023841858},[226,183],{"size":138,"scale":3,"weight":-0.4000000059604645},[331,263],{"size":125,"scale":3,"weight":0.4000000059604645},[315,254],{"size":10,"scale":-1,"weight":-0.800000011920929},[18,15],{"size":107,"scale":-1,"weight":0.30000001192092896},[209,169],{"size":52,"scale":1,"weight":0},[79,64],{"size":50,"scale":2,"weight":0.5600000023841858},[101,82],{"size":103,"scale":-1,"weight":0.5600000023841858},[208,168],{"size":120,"scale":-1,"weight":0.23000000417232513},[232,187],{"size":196,"scale":3,"weight":-0.800000011920929},[459,368],{"size":139,"scale":-1,"weight":0.4000000059604645},[275,222],{"size":1,"scale":3,"weight":0.4000000059604645},[3,2],{"size":23,"scale":1,"weight":0.4000000059604645},[37,29],{"size":115,"scale":2,"weight":0.4000000059604645},[227,184],{"size":199,"scale":3,"weight":0.5600000023841858},[512,413],{"size":140,"scale":2,"weight":0.4000000059604645},[276,223],{"size":198,"scale":3,"weight":0.6200000047683716},[517,418],{"size":183,"scale":-1,"weight":-0.800000011920929},[333,266],{"size":147,"scale":3,"weight":-0.4000000059604645},[352,280],{"size":197,"scale":2,"weight":0.30000001192092896},[384,310],{"size":120,"scale":3,"weight":0.6200000047683716},[313,254],{"size":112,"scale":-1,"weight":0.4000000059604645},[222,180],{"size":174,"scale":2,"weight":-0.4000000059604645},[326,260],{"size":169,"scale":-1,"weight":-0.800000011920929},[307,245],{"size":191,"scale":3,"weight":0.23000000417232513},[470,378],{"size":132,"scale":2,"weight":0},[251,198],{"size":81,"scale":3,"weight":-0.6000000238418579},[191,152],{"size":7,"scale":1,"weight":0.6200000047683716},[12,10],{"size":47,"scale":3,"weight":0.30000001192092896},[117,95],{"size":105,"scale":2,"weight":0.5600000023841858},[212,171],{"size":87,"scale":1,"weight":-0.6000000238418579},[126,100],{"size":40,"scale":2,"weight":0},[77,60],{"size":169,"scale":2,"weight":-0.800000011920929},[307,245],{"size":150,"scale":-1,"weight":0.30000001192092896},[293,236],{"size":101,"scale":3,"weight":0.6200000047683716},[264,214],{"size":49,"scale":1,"weight":0},[74,60],{"size":34,"scale":-1,"weight":0.6200000047683716},[70,57],{"size":179,"scale":1,"weight":0.5600000023841858},[285,230],{"size":74,"scale":3,"weight":-0.4000000059604645},[178,142],{"size":34,"scale":-1,"weight":0},[65,52],{"size":49,"scale":1,"weight":0.5600000023841858},[78,64],{"size":15,"scale":3,"weight":0.5600000023841858},[39,31],{"size":148,"scale":1,"weight":-0.4000000059604645},[219,176],{"size":119,"scale":-1,"weight":-0.800000011920929},[217,173],{"size":198,"scale":2,"weight":0.6200000047683716},[406,329],{"size":31,"scale":3,"weight":0.4000000059604645},[78,63],{"size":173,"scale":2,"weight":-0.4000000059604645},[324,259],{"size":76,"scale":2,"weight":-0.800000011920929},[138,110],{"size":95,"scale":2,"weight":0.4000000059604645},[188,152],{"size":55,"scale":3,"weight":0.4000000059604645},[139,112],{"size":169,"scale":-1,"weight":0.23000000417232513},[326,263],{"size":39,"scale":3,"weight":0},[95,77],{"size":57,"scale":3,"weight":-0.4000000059604645},[137,109],{"size":53,"scale":3,"weight":0},[129,104],{"size":21,"scale":3,"weight":0.5600000023841858},[55,44],{"size":131,"scale":1,"weight":0.23000000417232513},[200,162],{"size":194,"scale":-1,"weight":0.4000000059604645},[384,310],{"size":150,"scale":1,"weight":-0.4000000059604645},[222,179],{"size":33,"scale":2,"weight":0.5600000023841858},[67,54],{"size":45,"scale":1,"weight":-0.4000000059604645},[67,54],{"size":36,"scale":3,"weight":0.5600000023841858},[93,75],{"size":98,"scale":-1,"weight":-0.800000011920929},[178,143],{"size":73,"scale":-1,"weight":-0.4000000059604645},[137,110],{"size":128,"scale":-1,"weight":0.30000001192092896},[249,201],{"size":103,"scale":2,"weight":0.5600000023841858},[208,168],{"size":168,"scale":3,"weight":0.4000000059604645},[424,342],{"size":94,"scale":2,"weight":0},[179,141],{"size":119,"scale":2,"weight":0},[227,178],{"size":151,"scale":-1,"weight":0.30000001192092896},[294,237],{"size":200,"scale":-1,"weight":0.4000000059604645},[395,319],{"size":164,"scale":3,"weight":-0.6000000238418579},[386,307],{"size":156,"scale":3,"weight":0},[379,304],{"size":129,"scale":-1,"weight":0.4000000059604645},[255,207],{"size":89,"scale":2,"weight":0.6200000047683716},[183,149],{"size":104,"scale":3,"weight":0.5600000023841858},[267,216],{"size":55,"scale":3,"weight":-0.6000000238418579},[130,103],{"size":99,"scale":2,"weight":0.6200000047683716},[203,164],{"size":99,"scale":1,"weight":-0.4000000059604645},[147,118],{"size":25,"scale":3,"weight":-0.4000000059604645},[60,48],{"size":186,"scale":2,"weight":-0.4000000059604645},[348,278],{"size":138,"scale":-1,"weight":0.6200000047683716},[283,229],{"size":185,"scale":2,"weight":0.5600000023841858},[373,301],{"size":101,"scale":-1,"weight":0.4000000059604645},[200,162],{"size":41,"scale":1,"weight":0.6200000047683716},[67,54],{"size":83,"scale":-1,"weight":0},[158,124],{"size":81,"scale":-1,"weight":0.4000000059604645},[160,130],{"size":11,"scale":1,"weight":0.4000000059604645},[18,15],{"size":86,"scale":-1,"weight":-0.6000000238418579},[158,125],{"size":51,"scale":2,"weight":-0.800000011920929},[93,75],{"size":33,"scale":2,"weight":-0.6000000238418579},[61,48],{"size":148,"scale":3,"weight":-0.6000000238418579},[349,277],{"size":26,"scale":-1,"weight":0.6200000047683716},[53,44],{"size":83,"scale":1,"weight":0.30000001192092896},[128,104],{"size":122,"scale":2,"weight":0.30000001192092896},[238,192],{"size":140,"scale":3,"weight":-0.4000000059604645},[336,268],{"size":34,"scale":2,"weight":0.30000001192092896},[66,54],{"size":158,"scale":1,"weight":-0.800000011920929},[226,180],{"size":168,"scale":3,"weight":0},[408,328],{"size":135,"scale":1,"weight":0.30000001192092896},[208,168],{"size":85,"scale":3,"weight":0.23000000417232513},[210,168],{"size":100,"scale":1,"weight":-0.6000000238418579},[144,115],{"size":78,"scale":-1,"weight":0.5600000023841858},[157,128],{"size":129,"scale":3,"weight":-0.4000000059604645},[309,246],{"size":127,"scale":-1,"weight":-0.4000000059604645},[238,190],{"size":190,"scale":2,"weight":-0.6000000238418579},[348,275],{"size":177,"scale":2,"weight":-0.4000000059604645},[331,265],{"size":19,"scale":1,"weight":0.30000001192092896},[30,25],{"size":172,"scale":2,"weight":0},[327,258],{"size":41,"scale":-1,"weight":0.5600000023841858},[83,67],{"size":85,"scale":3,"weight":0},[207,166],{"size":131,"scale":2,"weight":-0.800000011920929},[239,191],{"size":192,"scale":3,"weight":0.4000000059604645},[484,390],{"size":84,"scale":3,"weight":0.6200000047683716},[219,178],{"size":147,"scale":-1,"weight":0.6200000047683716},[302,245],{"size":34,"scale":2,"weight":-0.800000011920929},[63,50],{"size":78,"scale":3,"weight":-0.800000011920929},[183,147],{"size":111,"scale":3,"weight":-0.6000000238418579},[262,208],{"size":123,"scale":-1,"weight":0.23000000417232513},[237,191],{"size":179,"scale":3,"weight":-0.6000000238418579},[422,335],{"size":160,"scale":1,"weight":0.4000000059604645},[250,203],{"size":127,"scale":3,"weight":0},[309,248],{"size":60,"scale":2,"weight":0},[114,90],{"size":87,"scale":2,"weight":-0.6000000238418579},[160,126],{"size":159,"scale":2,"weight":0.4000000059604645},[314,254],{"size":160,"scale":3,"weight":-0.4000000059604645},[383,305],{"size":165,"scale":3,"weight":0},[401,321],{"size":159,"scale":2,"weight":-0.4000000059604645},[298,238],{"size":172,"scale":3,"weight":0.5600000023841858},[442,358],{"size":53,"scale":3,"weight":0.4000000059604645},[134,108],{"size":108,"scale":3,"weight":0.6200000047683716},[282,228],{"size":176,"scale":1,"weight":0.30000001192092896},[271,220],{"size":16,"scale":3,"weight":0.5600000023841858},[41,34],{"size":92,"scale":1,"weight":0.23000000417232513},[140,114],{"size":79,"scale":1,"weight":0.23000000417232513},[121,98],{"size":164,"scale":2,"weight":-0.6000000238418579},[300,238],{"size":150,"scale":2,"weight":0},[285,225],{"size":78,"scale":-1,"weight":-0.6000000238418579},[143,114],{"size":23,"scale":3,"weight":0.30000001192092896},[57,46],{"size":140,"scale":2,"weight":0},[266,209],{"size":112,"scale":2,"weight":0.30000001192092896},[219,177],{"size":87,"scale":1,"weight":0.23000000417232513},[132,108],{"size":16,"scale":3,"weight":-0.6000000238418579},[39,31],{"size":98,"scale":1,"weight":0.4000000059604645},[153,124],{"size":155,"scale":2,"weight":0.4000000059604645},[307,248],{"size":56,"scale":1,"weight":0.5600000023841858},[89,73],{"size":163,"scale":1,"weight":0.5600000023841858},[259,210],{"size":13,"scale":2,"weight":0.30000001192092896},[26,21],{"size":59,"scale":-1,"weight":0},[113,89],{"size":76,"scale":1,"weight":0.5600000023841858},[121,98],{"size":166,"scale":3,"weight":0.5600000023841858},[427,344],{"size":135,"scale":2,"weight":0},[257,202],{"size":6,"scale":3,"weight":0.6200000047683716},[17,13],{"size":16,"scale":-1,"weight":0.6200000047683716},[33,27],{"size":18,"scale":3,"weight":0.23000000417232513},[45,36],{"size":1,"scale":2,"weight":-0.6000000238418579},[2,2],{"size":123,"scale":3,"weight":0.6200000047683716},[321,260],{"size":42,"scale":2,"weight":0.23000000417232513},[81,65],{"size":173,"scale":-1,"weight":-0.6000000238418579},[317,251],{"size":66,"scale":2,"weight":0.4000000059604645},[131,106],{"size":151,"scale":-1,"weight":0.6200000047683716},[310,250],{"size":96,"scale":2,"weight":0.6200000047683716},[198,160],{"size":61,"scale":2,"weight":-0.4000000059604645},[114,92],{"size":159,"scale":-1,"weight":0},[302,238],{"size":74,"scale":2,"weight":-0.6000000238418579},[136,108],{"size":26,"scale":1,"weight":-0.4000000059604645},[38,32],{"size":170,"scale":-1,"weight":-0.4000000059604645},[318,255],{"size":3,"scale":-1,"weight":0.5600000023841858},[7,6],{"size":105,"scale":3,"weight":0.30000001192092896},[261,211],{"size":180,"scale":1,"weight":-0.800000011920929},[257,205],{"size":60,"scale":-1,"weight":-0.6000000238418579},[110,87],{"size":65,"scale":-1,"weight":0.6200000047683716},[133,108],{"size":6,"scale":3,"weight":0.23000000417232513},[16,12],{"size":33,"scale":3,"weight":-0.4000000059604645},[79,63],{"size":31,"scale":2,"weight":0.4000000059604645},[62,50],{"size":137,"scale":2,"weight":0.30000001192092896},[267,216],{"size":44,"scale":2,"weight":0.23000000417232513},[85,69],{"size":104,"scale":-1,"weight":-0.6000000238418579},[191,151],{"size":143,"scale":3,"weight":0.4000000059604645},[361,291],{"size":110,"scale":2,"weight":-0.4000000059604645},[206,165],{"size":36,"scale":2,"weight":0.23000000417232513},[70,56],{"size":110,"scale":-1,"weight":0.23000000417232513},[212,171],{"size":67,"scale":-1,"weight":-0.800000011920929},[122,98],{"size":178,"scale":3,"weight":-0.800000011920929},[417,334],{"size":149,"scale":-1,"weight":0.30000001192092896},[291,235],{"size":165,"scale":2,"weight":-0.4000000059604645},[309,247],{"size":164,"scale":1,"weight":-0.4000000059604645},[243,194],{"size":3,"scale":3,"weight":0.4000000059604645},[8,7],{"size":44,"scale":3,"weight":0.4000000059604645},[111,90],{"size":180,"scale":-1,"weight":-0.6000000238418579},[330,260],{"size":67,"scale":3,"weight":0.4000000059604645},[169,136],{"size":61,"scale":-1,"weight":-0.6000000238418579},[112,89],{"size":124,"scale":2,"weight":0.30000001192092896},[242,196],{"size":15,"scale":-1,"weight":0.4000000059604645},[30,25],{"size":34,"scale":-1,"weight":0.5600000023841858},[69,56],{"size":173,"scale":3,"weight":-0.6000000238418579},[407,324],{"size":137,"scale":2,"weight":0.5600000023841858},[276,224],{"size":89,"scale":2,"weight":-0.800000011920929},[162,130],{"size":51,"scale":-1,"weight":-0.4000000059604645},[96,77],{"size":9,"scale":3,"weight":0.6200000047683716},[24,19],{"size":55,"scale":-1,"weight":-0.6000000238418579},[101,80],{"size":22,"scale":2,"weight":-0.6000000238418579},[41,32],{"size":173,"scale":1,"weight":0.30000001192092896},[267,216],{"size":43,"scale":3,"weight":0},[105,84],{"size":146,"scale":1,"weight":0.23000000417232513},[222,181],{"size":145,"scale":3,"weight":0.30000001192092896},[361,291],{"size":45,"scale":1,"weight":0},[69,55],{"size":85,"scale":2,"weight":-0.4000000059604645},[159,128],{"size":199,"scale":2,"weight":0.5600000023841858},[401,325],{"size":172,"scale":3,"weight":0.30000001192092896},[428,345],{"size":170,"scale":-1,"weight":0.6200000047683716},[349,283],{"size":148,"scale":1,"weight":0.5600000023841858},[236,190],{"size":150,"scale":-1,"weight":0},[285,225],{"size":47,"scale":3,"weight":-0.800000011920929},[110,89],{"size":43,"scale":3,"weight":0.5600000023841858},[111,90],{"size":51,"scale":1,"weight":-0.6000000238418579},[74,59],{"size":150,"scale":2,"weight":0.5600000023841858},[303,245],{"size":192,"scale":1,"weight":0.5600000023841858},[306,247],{"size":74,"scale":-1,"weight":0.6200000047683716},[152,123],{"size":100,"scale":2,"weight":0.30000001192092896},[195,157],{"size":90,"scale":-1,"weight":-0.800000011920929},[163,131],{"size":179,"scale":3,"weight":-0.800000011920929},[420,336],{"size":179,"scale":-1,"weight":0.23000000417232513},[345,278],{"size":8,"scale":2,"weight":0.30000001192092896},[16,13],{"size":8,"scale":1,"weight":0.4000000059604645},[13,11],{"size":149,"scale":-1,"weight":-0.4000000059604645},[279,223],{"size":175,"scale":1,"weight":0.30000001192092896},[270,219],{"size":120,"scale":-1,"weight":0.30000001192092896},[234,189],{"size":54,"scale":1,"weight":0},[82,66],{"size":56,"scale":1,"weight":0.30000001192092896},[86,71],{"size":81,"scale":2,"weight":0.4000000059604645},[160,130],{"size":114,"scale":-1,"weight":0},[217,171],{"size":71,"scale":-1,"weight":-0.6000000238418579},[131,103],{"size":128,"scale":1,"weight":0.5600000023841858},[204,166],{"size":177,"scale":-1,"weight":-0.6000000238418579},[324,257],{"size":169,"scale":3,"weight":0.23000000417232513},[416,334],{"size":24,"scale":2,"weight":0.23000000417232513},[47,38],{"size":72,"scale":-1,"weight":-0.4000000059604645},[135,108],{"size":82,"scale":1,"weight":0},[124,100],{"size":167,"scale":3,"weight":-0.6000000238418579},[393,313],{"size":117,"scale":1,"weight":-0.800000011920929},[167,133],{"size":54,"scale":1,"weight":-0.6000000238418579},[78,62],{"size":166,"scale":1,"weight":0.23000000417232513},[254,206],{"size":75,"scale":1,"weight":0},[114,92],{"size":187,"scale":2,"weight":-0.800000011920929},[340,272],{"size":55,"scale":3,"weight":0.5600000023841858},[142,114],{"size":84,"scale":3,"weight":0.30000001192092896},[209,169],{"size":136,"scale":-1,"weight":0.23000000417232513},[262,212],{"size":71,"scale":1,"weight":-0.800000011920929},[102,81],{"size":26,"scale":2,"weight":0.30000001192092896},[52,42],{"size":14,"scale":3,"weight":0.30000001192092896},[35,28],{"size":181,"scale":3,"weight":0.6200000047683716},[472,382],{"size":46,"scale":1,"weight":0.30000001192092896},[72,58],{"size":34,"scale":1,"weight":0.30000001192092896},[53,43],{"size":104,"scale":2,"weight":0.5600000023841858},[210,170],{"size":103,"scale":3,"weight":-0.800000011920929},[241,193],{"size":73,"scale":1,"weight":0.5600000023841858},[117,94],{"size":169,"scale":3,"weight":-0.800000011920929},[396,317],{"size":167,"scale":2,"weight":-0.800000011920929},[304,243],{"size":189,"scale":-1,"weight":0.4000000059604645},[374,302],{"size":3,"scale":2,"weight":0.4000000059604645},[7,6],{"size":109,"scale":1,"weight":0.23000000417232513},[166,135],{"size":106,"scale":3,"weight":0.30000001192092896},[264,213],{"size":37,"scale":1,"weight":0.23000000417232513},[57,46],{"size":123,"scale":1,"weight":0},[186,150],{"size":51,"scale":1,"weight":0.5600000023841858},[81,66],{"size":31,"scale":3,"weight":0},[76,61],{"size":38,"scale":1,"weight":-0.6000000238418579},[56,44],{"size":43,"scale":-1,"weight":-0.6000000238418579},[79,63],{"size":93,"scale":-1,"weight":0},[177,140],{"size":43,"scale":2,"weight":0},[82,65],{"size":173,"scale":3,"weight":0.23000000417232513},[426,342],{"size":60,"scale":3,"weight":-0.4000000059604645},[144,115],{"size":175,"scale":2,"weight":0.4000000059604645},[346,280],{"size":170,"scale":3,"weight":-0.6000000238418579},[400,318],{"size":146,"scale":2,"weight":-0.800000011920929},[265,212],{"size":131,"scale":-1,"weight":0.5600000023841858},[264,214],{"size":169,"scale":3,"weight":0.30000001192092896},[421,338],{"size":39,"scale":1,"weight":0.23000000417232513},[59,48],{"size":46,"scale":2,"weight":0.6200000047683716},[94,77],{"size":36,"scale":-1,"weight":-0.6000000238418579},[66,52],{"size":54,"scale":-1,"weight":-0.800000011920929},[98,78],{"size":175,"scale":3,"weight":0.6200000047683716},[457,369],{"size":135,"scale":3,"weight":-0.6000000238418579},[318,252],{"size":63,"scale":3,"weight":0.5600000023841858},[162,131],{"size":147,"scale":2,"weight":-0.4000000059604645},[275,220],{"size":104,"scale":1,"weight":0.30000001192092896},[160,130],{"size":101,"scale":3,"weight":-0.800000011920929},[236,190],{"size":72,"scale":-1,"weight":0.30000001192092896},[140,114],{"size":57,"scale":-1,"weight":0.5600000023841858},[115,93],{"size":49,"scale":1,"weight":0.30000001192092896},[76,62],{"size":74,"scale":3,"weight":0.5600000023841858},[191,154],{"size":80,"scale":3,"weight":0.23000000417232513},[197,159],{"size":57,"scale":1,"weight":0.30000001192092896},[88,72],{"size":135,"scale":2,"weight":0.6200000047683716},[277,225],{"size":144,"scale":3,"weight":0.6200000047683716},[376,304],{"size":63,"scale":3,"weight":-0.6000000238418579},[149,118],{"size":128,"scale":3,"weight":0.4000000059604645},[323,260],{"size":94,"scale":3,"weight":0.30000001192092896},[234,188],{"size":188,"scale":3,"weight":-0.800000011920929},[440,353],{"size":170,"scale":1,"weight":0.4000000059604645},[266,215],{"size":184,"scale":3,"weight":0.4000000059604645},[464,374],{"size":81,"scale":1,"weight":0.6200000047683716},[131,106],{"size":198,"scale":2,"weight":0},[377,296],{"size":88,"scale":2,"weight":0.23000000417232513},[170,137],{"size":5,"scale":-1,"weight":-0.800000011920929},[9,8],{"size":24,"scale":1,"weight":-0.4000000059604645},[36,29],{"size":4,"scale":3,"weight":-0.4000000059604645},[10,8],{"size":153,"scale":3,"weight":0.30000001192092896},[380,306],{"size":130,"scale":1,"weight":0.30000001192092896},[200,163],{"size":26,"scale":-1,"weight":0},[50,40],{"size":138,"scale":2,"weight":0.30000001192092896},[269,217],{"size":89,"scale":1,"weight":0.30000001192092896},[138,111],{"size":196,"scale":2,"weight":0.5600000023841858},[395,319],{"size":192,"scale":-1,"weight":-0.6000000238418579},[352,278],{"size":81,"scale":1,"weight":-0.4000000059604645},[120,96],{"size":33,"scale":1,"weight":-0.4000000059604645},[50,40],{"size":117,"scale":3,"weight":0.6200000047683716},[305,247],{"size":28,"scale":-1,"weight":0},[54,42],{"size":152,"scale":3,"weight":0.23000000417232513},[374,301],{"size":164,"scale":-1,"weight":0.6200000047683716},[337,273],{"size":3,"scale":-1,"weight":-0.6000000238418579},[6,5],{"size":14,"scale":3,"weight":-0.4000000059604645},[34,27],{"size":22,"scale":3,"weight":0.30000001192092896},[55,45],{"size":156,"scale":2,"weight":0.23000000417232513},[301,243],{"size":187,"scale":2,"weight":-0.6000000238418579},[343,271],{"size":14,"scale":1,"weight":0.4000000059604645},[22,18],{"size":87,"scale":1,"weight":0.6200000047683716},[141,114],{"size":55,"scale":1,"weight":0.5600000023841858},[88,72],{"size":166,"scale":1,"weight":-0.4000000059604645},[245,197],{"size":154,"scale":-1,"weight":-0.4000000059604645},[288,231],{"size":165,"scale":-1,"weight":0.6200000047683716},[339,274],{"size":99,"scale":2,"weight":0.23000000417232513},[191,154],{"size":6,"scale":1,"weight":0.6200000047683716},[10,9],{"size":1,"scale":-1,"weight":0.30000001192092896},[2,2],{"size":17,"scale":-1,"weight":0.30000001192092896},[34,27],{"size":184,"scale":1,"weight":0.5600000023841858},[293,237],{"size":140,"scale":-1,"weight":0.30000001192092896},[273,220],{"size":18,"scale":3,"weight":0.4000000059604645},[46,37],{"size":57,"scale":3,"weight":0.6200000047683716},[149,121],{"size":99,"scale":-1,"weight":0.5600000023841858},[200,161],{"size":194,"scale":1,"weight":0.23000000417232513},[295,240],{"size":83,"scale":2,"weight":0.23000000417232513},[161,129],{"size":114,"scale":2,"weight":0.4000000059604645},[226,182],{"size":54,"scale":2,"weight":0.4000000059604645},[107,86],{"size":28,"scale":1,"weight":0.30000001192092896},[44,36],{"size":197,"scale":1,"weight":-0.6000000238418579},[285,225],{"size":32,"scale":-1,"weight":0.23000000417232513},[62,51],{"size":66,"scale":1,"weight":0.4000000059604645},[104,84],{"size":17,"scale":-1,"weight":-0.4000000059604645},[33,26],{"size":108,"scale":1,"weight":-0.4000000059604645},[160,129],{"size":122,"scale":1,"weight":0.6200000047683716},[198,160],{"size":171,"scale":1,"weight":-0.800000011920929},[244,194],{"size":21,"scale":3,"weight":-0.4000000059604645},[51,41],{"size":195,"scale":3,"weight":0},[473,380],{"size":160,"scale":2,"weight":0.5600000023841858},[323,261],{"size":152,"scale":1,"weight":0.23000000417232513},[232,188],{"size":181,"scale":2,"weight":0.6200000047683716},[372,301],{"size":192,"scale":2,"weight":-0.4000000059604645},[359,287],{"size":12,"scale":3,"weight":0.4000000059604645},[30,25],{"size":55,"scale":2,"weight":-0.800000011920929},[101,81],{"size":52,"scale":3,"weight":0.30000001192092896},[129,105],{"size":156,"scale":2,"weight":0.5600000023841858},[314,254],{"size":85,"scale":-1,"weight":0.5600000023841858},[172,139],{"size":78,"scale":-1,"weight":0.23000000417232513},[151,122],{"size":30,"scale":-1,"weight":0.4000000059604645},[59,48],{"size":130,"scale":1,"weight":-0.6000000238418579},[188,149],{"size":178,"scale":1,"weight":-0.6000000238418579},[257,203],{"size":64,"scale":2,"weight":0.4000000059604645},[126,102],{"size":75,"scale":-1,"weight":-0.6000000238418579},[138,109],{"size":6,"scale":-1,"weight":0.23000000417232513},[12,10],{"size":169,"scale":1,"weight":0.6200000047683716},[274,221],{"size":131,"scale":2,"weight":-0.6000000238418579},[240,190],{"size":107,"scale":1,"weight":-0.4000000059604645},[158,128],{"size":117,"scale":-1,"weight":-0.4000000059604645},[219,175],{"size":173,"scale":3,"weight":0.30000001192092896},[431,346],{"size":119,"scale":1,"weight":0.5600000023841858},[189,153],{"size":198,"scale":-1,"weight":0.6200000047683716},[406,329],{"size":7,"scale":3,"weight":-0.4000000059604645},[17,14],{"size":83,"scale":3,"weight":-0.800000011920929},[195,156],{"size":99,"scale":3,"weight":0.30000001192092896},[246,198],{"size":150,"scale":1,"weight":0.30000001192092896},[231,188],{"size":122,"scale":2,"weight":0.6200000047683716},[251,202],{"size":85,"scale":2,"weight":0},[162,128],{"size":56,"scale":-1,"weight":-0.4000000059604645},[105,84],{"size":16,"scale":-1,"weight":0.23000000417232513},[31,26],{"size":39,"scale":1,"weight":0.5600000023841858},[62,50],{"size":198,"scale":2,"weight":0.4000000059604645},[392,317],{"size":148,"scale":-1,"weight":0.5600000023841858},[299,242],{"size":172,"scale":2,"weight":0.6200000047683716},[353,286],{"size":25,"scale":-1,"weight":0.4000000059604645},[50,40],{"size":110,"scale":2,"weight":-0.6000000238418579},[202,159],{"size":8,"scale":-1,"weight":0.6200000047683716},[17,13],{"size":11,"scale":3,"weight":-0.6000000238418579},[27,21],{"size":8,"scale":3,"weight":-0.800000011920929},[20,16],{"size":186,"scale":-1,"weight":-0.800000011920929},[338,270],{"size":12,"scale":2,"weight":0},[24,19],{"size":120,"scale":-1,"weight":0.5600000023841858},[242,196],{"size":56,"scale":1,"weight":-0.4000000059604645},[83,67],{"size":154,"scale":-1,"weight":0.30000001192092896},[301,243],{"size":129,"scale":-1,"weight":0},[246,194],{"size":102,"scale":2,"weight":0},[194,153],{"size":92,"scale":-1,"weight":0},[175,138],{"size":14,"scale":3,"weight":0.5600000023841858},[37,29],{"size":111,"scale":1,"weight":0.6200000047683716},[180,145],{"size":67,"scale":2,"weight":-0.4000000059604645},[126,101],{"size":75,"scale":1,"weight":0.4000000059604645},[117,95],{"size":179,"scale":1,"weight":0.30000001192092896},[276,223],{"size":85,"scale":1,"weight":0},[128,104],{"size":80,"scale":2,"weight":0.4000000059604645},[159,128],{"size":15,"scale":3,"weight":0},[37,29],{"size":93,"scale":-1,"weight":0.5600000023841858},[188,152],{"size":62,"scale":2,"weight":0.30000001192092896},[121,98],{"size":87,"scale":3,"weight":-0.800000011920929},[204,164],{"size":19,"scale":3,"weight":0.23000000417232513},[47,38],{"size":38,"scale":2,"weight":-0.4000000059604645},[71,58],{"size":185,"scale":-1,"weight":0.6200000047683716},[380,307],{"size":107,"scale":3,"weight":0},[260,209],{"size":40,"scale":-1,"weight":-0.800000011920929},[73,59],{"size":25,"scale":2,"weight":0.30000001192092896},[49,39],{"size":12,"scale":2,"weight":-0.6000000238418579},[23,18],{"size":167,"scale":-1,"weight":0.5600000023841858},[337,272],{"size":103,"scale":3,"weight":0.23000000417232513},[254,204],{"size":164,"scale":-1,"weight":-0.4000000059604645},[307,246],{"size":16,"scale":-1,"weight":-0.4000000059604645},[30,25],{"size":106,"scale":3,"weight":0.5600000023841858},[273,221],{"size":88,"scale":1,"weight":-0.800000011920929},[126,100],{"size":119,"scale":1,"weight":0},[179,145],{"size":23,"scale":-1,"weight":-0.800000011920929},[42,34],{"size":48,"scale":1,"weight":0.5600000023841858},[77,63],{"size":113,"scale":3,"weight":0.30000001192092896},[281,226],{"size":84,"scale":2,"weight":-0.800000011920929},[153,123],{"size":114,"scale":-1,"weight":0.6200000047683716},[234,190],{"size":187,"scale":1,"weight":-0.4000000059604645},[277,223],{"size":89,"scale":2,"weight":-0.4000000059604645},[166,134],{"size":168,"scale":-1,"weight":-0.4000000059604645},[314,251],{"size":175,"scale":3,"weight":-0.800000011920929},[410,328],{"size":102,"scale":1,"weight":0},[154,125],{"size":107,"scale":1,"weight":-0.6000000238418579},[155,123],{"size":10,"scale":3,"weight":-0.4000000059604645},[25,19],{"size":89,"scale":2,"weight":0.5600000023841858},[179,146],{"size":143,"scale":1,"weight":0},[215,175],{"size":4,"scale":3,"weight":0},[10,8],{"size":107,"scale":1,"weight":-0.800000011920929},[153,122],{"size":182,"scale":3,"weight":0.6200000047683716},[475,384],{"size":6,"scale":-1,"weight":0.4000000059604645},[12,10],{"size":33,"scale":2,"weight":0.6200000047683716},[68,55],{"size":30,"scale":3,"weight":-0.800000011920929},[71,57],{"size":81,"scale":-1,"weight":0.30000001192092896},[158,128],{"size":188,"scale":-1,"weight":0.6200000047683716},[386,312],{"size":92,"scale":3,"weight":-0.4000000059604645},[221,176],{"size":181,"scale":1,"weight":0.5600000023841858},[288,233],{"size":97,"scale":-1,"weight":0.5600000023841858},[196,158],{"size":55,"scale":1,"weight":-0.6000000238418579},[80,64],{"size":132,"scale":2,"weight":0.6200000047683716},[271,219],{"size":6,"scale":-1,"weight":0},[12,10],{"size":21,"scale":-1,"weight":-0.800000011920929},[39,31],{"size":181,"scale":-1,"weight":0},[344,271],{"size":136,"scale":1,"weight":0.5600000023841858},[217,176],{"size":86,"scale":3,"weight":0},[209,167],{"size":179,"scale":3,"weight":0.6200000047683716},[467,378],{"size":76,"scale":2,"weight":0.4000000059604645},[151,121],{"size":189,"scale":2,"weight":0.4000000059604645},[374,302],{"size":155,"scale":3,"weight":-0.4000000059604645},[372,296],{"size":175,"scale":3,"weight":0},[425,341],{"size":179,"scale":-1,"weight":0.4000000059604645},[354,286],{"size":150,"scale":3,"weight":0.6200000047683716},[392,317],{"size":137,"scale":3,"weight":-0.6000000238418579},[322,257],{"size":186,"scale":-1,"weight":0.6200000047683716},[382,308],{"size":192,"scale":3,"weight":0.6200000047683716},[501,405],{"size":58,"scale":2,"weight":-0.800000011920929},[106,85],{"size":138,"scale":1,"weight":-0.800000011920929},[197,157],{"size":37,"scale":3,"weight":-0.4000000059604645},[89,71],{"size":171,"scale":2,"weight":0.30000001192092896},[333,269],{"size":78,"scale":3,"weight":0.5600000023841858},[201,163],{"size":63,"scale":1,"weight":0.6200000047683716},[102,83],{"size":84,"scale":2,"weight":0.30000001192092896},[164,133],{"size":179,"scale":3,"weight":-0.4000000059604645},[429,341],{"size":97,"scale":-1,"weight":-0.800000011920929},[177,141],{"size":142,"scale":-1,"weight":0},[270,212],{"size":6,"scale":1,"weight":-0.6000000238418579},[9,8],{"size":29,"scale":3,"weight":0.30000001192092896},[73,59],{"size":70,"scale":-1,"weight":-0.4000000059604645},[131,105],{"size":99,"scale":2,"weight":0.30000001192092896},[193,156],{"size":180,"scale":1,"weight":-0.4000000059604645},[266,214],{"size":48,"scale":1,"weight":0},[73,59],{"size":1,"scale":3,"weight":0.30000001192092896},[3,2],{"size":31,"scale":2,"weight":0},[60,47],{"size":73,"scale":-1,"weight":0},[139,110],{"size":55,"scale":1,"weight":0.4000000059604645},[86,70],{"size":198,"scale":-1,"weight":-0.800000011920929},[359,288],{"size":157,"scale":3,"weight":0.5600000023841858},[403,326],{"size":129,"scale":1,"weight":0},[195,158],{"size":199,"scale":2,"weight":-0.6000000238418579},[365,289],{"size":41,"scale":1,"weight":0.23000000417232513},[63,51],{"size":76,"scale":1,"weight":0.30000001192092896},[118,95],{"size":97,"scale":1,"weight":-0.6000000238418579},[141,111],{"size":131,"scale":-1,"weight":0.6200000047683716},[269,218],{"size":119,"scale":3,"weight":0},[289,232],{"size":67,"scale":3,"weight":-0.4000000059604645},[161,128],{"size":169,"scale":-1,"weight":0.5600000023841858},[341,275],{"size":174,"scale":-1,"weight":0.6200000047683716},[357,289],{"size":118,"scale":3,"weight":0},[287,231],{"size":59,"scale":3,"weight":-0.4000000059604645},[142,113],{"size":4,"scale":1,"weight":-0.4000000059604645},[7,6],{"size":21,"scale":2,"weight":0.4000000059604645},[42,34],{"size":80,"scale":-1,"weight":-0.800000011920929},[146,117],{"size":32,"scale":3,"weight":0.6200000047683716},[84,68],{"size":200,"scale":2,"weight":0.4000000059604645},[395,319],{"size":107,"scale":2,"weight":0.6200000047683716},[220,178],{"size":102,"scale":2,"weight":0.6200000047683716},[210,170],{"size":137,"scale":2,"weight":0.23000000417232513},[264,213],{"size":120,"scale":-1,"weight":0.4000000059604645},[237,192],{"size":153,"scale":-1,"weight":-0.4000000059604645},[286,229],{"size":142,"scale":3,"weight":0.5600000023841858},[365,295],{"size":70,"scale":2,"weight":0.6200000047683716},[144,116],{"size":165,"scale":3,"weight":0.6200000047683716},[431,348],{"size":63,"scale":-1,"weight":0.30000001192092896},[123,100],{"size":111,"scale":3,"weight":0.23000000417232513},[274,220],{"size":191,"scale":2,"weight":-0.800000011920929},[347,277],{"size":169,"scale":-1,"weight":-0.6000000238418579},[310,244],{"size":29,"scale":2,"weight":0.6200000047683716},[60,49],{"size":70,"scale":2,"weight":0.23000000417232513},[135,109],{"size":91,"scale":-1,"weight":0.23000000417232513},[175,142],{"size":123,"scale":-1,"weight":0.6200000047683716},[252,204],{"size":72,"scale":2,"weight":0.5600000023841858},[146,118],{"size":181,"scale":-1,"weight":-0.800000011920929},[329,263],{"size":96,"scale":2,"weight":0.30000001192092896},[187,152],{"size":52,"scale":-1,"weight":0.23000000417232513},[101,81],{"size":111,"scale":1,"weight":0.4000000059604645},[173,140],{"size":121,"scale":2,"weight":0.4000000059604645},[239,193],{"size":8,"scale":3,"weight":0.6200000047683716},[21,18],{"size":76,"scale":-1,"weight":0.5600000023841858},[154,124],{"size":85,"scale":2,"weight":0.30000001192092896},[166,134],{"size":153,"scale":2,"weight":0.23000000417232513},[295,239],{"size":109,"scale":2,"weight":-0.4000000059604645},[204,163],{"size":11,"scale":1,"weight":0.23000000417232513},[17,15],{"size":85,"scale":2,"weight":0.6200000047683716},[174,142],{"size":35,"scale":-1,"weight":0.30000001192092896},[68,55],{"size":119,"scale":3,"weight":-0.4000000059604645},[286,227],{"size":75,"scale":2,"weight":0},[143,112],{"size":123,"scale":3,"weight":-0.4000000059604645},[295,235],{"size":38,"scale":1,"weight":-0.4000000059604645},[56,45],{"size":59,"scale":3,"weight":0.23000000417232513},[145,117],{"size":46,"scale":3,"weight":0},[112,90],{"size":21,"scale":2,"weight":-0.800000011920929},[39,31],{"size":13,"scale":-1,"weight":0},[25,20],{"size":37,"scale":-1,"weight":0},[71,56],{"size":62,"scale":2,"weight":-0.800000011920929},[113,91],{"size":183,"scale":-1,"weight":0.5600000023841858},[369,298],{"size":48,"scale":2,"weight":-0.800000011920929},[88,70],{"size":133,"scale":-1,"weight":0.30000001192092896},[259,209],{"size":183,"scale":2,"weight":-0.800000011920929},[333,266],{"size":63,"scale":2,"weight":0.23000000417232513},[121,98],{"size":132,"scale":-1,"weight":0.23000000417232513},[254,206],{"size":31,"scale":3,"weight":0.5600000023841858},[80,65],{"size":153,"scale":-1,"weight":0.6200000047683716},[314,254],{"size":48,"scale":3,"weight":0.6200000047683716},[126,102],{"size":133,"scale":-1,"weight":0},[253,199],{"size":79,"scale":2,"weight":-0.4000000059604645},[148,119],{"size":116,"scale":-1,"weight":0.23000000417232513},[224,181],{"size":114,"scale":1,"weight":-0.4000000059604645},[168,136],{"size":16,"scale":1,"weight":-0.6000000238418579},[24,19],{"size":24,"scale":1,"weight":-0.6000000238418579},[35,28],{"size":107,"scale":1,"weight":0.23000000417232513},[164,133],{"size":56,"scale":3,"weight":0.23000000417232513},[139,112],{"size":82,"scale":3,"weight":0},[199,160],{"size":130,"scale":-1,"weight":0.6200000047683716},[267,216],{"size":100,"scale":1,"weight":0.4000000059604645},[156,127],{"size":94,"scale":2,"weight":-0.800000011920929},[171,136],{"size":93,"scale":3,"weight":0.5600000023841858},[239,193],{"size":23,"scale":2,"weight":0.23000000417232513},[45,36],{"size":21,"scale":3,"weight":-0.6000000238418579},[50,40],{"size":43,"scale":-1,"weight":0.6200000047683716},[89,72],{"size":154,"scale":1,"weight":0.4000000059604645},[240,195],{"size":96,"scale":1,"weight":0.4000000059604645},[150,122],{"size":194,"scale":3,"weight":-0.4000000059604645},[465,370],{"size":11,"scale":-1,"weight":-0.800000011920929},[21,17],{"size":178,"scale":2,"weight":-0.800000011920929},[323,259],{"size":45,"scale":2,"weight":0.5600000023841858},[91,74],{"size":61,"scale":1,"weight":-0.800000011920929},[88,69],{"size":87,"scale":1,"weight":0.5600000023841858},[139,112],{"size":55,"scale":1,"weight":0},[83,68],{"size":137,"scale":3,"weight":0},[333,267],{"size":118,"scale":-1,"weight":0.6200000047683716},[242,197],{"size":112,"scale":1,"weight":0},[169,137],{"size":98,"scale":3,"weight":0.23000000417232513},[241,194],{"size":135,"scale":2,"weight":-0.800000011920929},[246,197],{"size":38,"scale":-1,"weight":0.5600000023841858},[77,63],{"size":15,"scale":3,"weight":0.6200000047683716},[40,32],{"size":34,"scale":-1,"weight":0.30000001192092896},[66,54],{"size":67,"scale":-1,"weight":0},[127,100],{"size":55,"scale":-1,"weight":-0.4000000059604645},[103,83],{"size":85,"scale":3,"weight":0.5600000023841858},[219,177],{"size":152,"scale":3,"weight":0.5600000023841858},[391,316],{"size":7,"scale":2,"weight":-0.4000000059604645},[14,11],{"size":170,"scale":-1,"weight":0.23000000417232513},[327,265],{"size":160,"scale":-1,"weight":-0.800000011920929},[291,233],{"size":42,"scale":1,"weight":-0.800000011920929},[60,48],{"size":122,"scale":-1,"weight":-0.800000011920929},[221,177],{"size":62,"scale":2,"weight":0},[118,93],{"size":146,"scale":1,"weight":-0.800000011920929},[209,166],{"size":52,"scale":1,"weight":-0.4000000059604645},[77,62],{"size":174,"scale":-1,"weight":0.30000001192092896},[339,274],{"size":197,"scale":3,"weight":0.6200000047683716},[514,416],{"size":169,"scale":3,"weight":0.5600000023841858},[434,351],{"size":21,"scale":-1,"weight":0.5600000023841858},[42,35],{"size":111,"scale":2,"weight":-0.6000000238418579},[204,161],{"size":71,"scale":3,"weight":0.23000000417232513},[175,141],{"size":112,"scale":1,"weight":0.6200000047683716},[182,146],{"size":114,"scale":2,"weight":0.23000000417232513},[220,178],{"size":65,"scale":1,"weight":0.4000000059604645},[102,83],{"size":188,"scale":3,"weight":0.6200000047683716},[491,397],{"size":121,"scale":-1,"weight":0.30000001192092896},[236,191],{"size":82,"scale":-1,"weight":0},[156,123],{"size":53,"scale":-1,"weight":-0.800000011920929},[97,77],{"size":29,"scale":1,"weight":-0.4000000059604645},[43,35],{"size":71,"scale":2,"weight":0.6200000047683716},[146,118],{"size":151,"scale":3,"weight":-0.4000000059604645},[362,288],{"size":21,"scale":2,"weight":0.6200000047683716},[43,36],{"size":91,"scale":-1,"weight":-0.800000011920929},[166,133],{"size":127,"scale":-1,"weight":0.4000000059604645},[252,203],{"size":145,"scale":-1,"weight":0.4000000059604645},[286,231],{"size":176,"scale":3,"weight":0.4000000059604645},[444,358],{"size":150,"scale":2,"weight":-0.800000011920929},[272,218],{"size":140,"scale":3,"weight":0.30000001192092896},[349,281],{"size":59,"scale":2,"weight":0.6200000047683716},[121,98],{"size":179,"scale":2,"weight":0.23000000417232513},[345,278],{"size":57,"scale":3,"weight":0},[139,112],{"size":70,"scale":-1,"weight":0.23000000417232513},[135,109],{"size":191,"scale":2,"weight":-0.6000000238418579},[350,276],{"size":96,"scale":-1,"weight":0.6200000047683716},[198,160],{"size":47,"scale":2,"weight":-0.4000000059604645},[88,71],{"size":4,"scale":1,"weight":0.6200000047683716},[7,6],{"size":101,"scale":-1,"weight":0.23000000417232513},[195,158],{"size":120,"scale":3,"weight":0.4000000059604645},[303,244],{"size":185,"scale":1,"weight":0.5600000023841858},[295,238],{"size":174,"scale":2,"weight":0.23000000417232513},[335,271],{"size":193,"scale":-1,"weight":-0.6000000238418579},[354,280],{"size":145,"scale":2,"weight":-0.4000000059604645},[272,217],{"size":71,"scale":2,"weight":-0.4000000059604645},[133,106],{"size":100,"scale":1,"weight":0.23000000417232513},[153,124],{"size":117,"scale":3,"weight":0.30000001192092896},[291,234],{"size":133,"scale":1,"weight":-0.800000011920929},[190,151],{"size":127,"scale":1,"weight":-0.800000011920929},[181,144],{"size":148,"scale":3,"weight":0.5600000023841858},[381,307],{"size":124,"scale":3,"weight":0.4000000059604645},[313,252],{"size":42,"scale":1,"weight":0.6200000047683716},[69,56],{"size":26,"scale":3,"weight":0.4000000059604645},[66,53],{"size":189,"scale":2,"weight":-0.800000011920929},[343,275],{"size":161,"scale":1,"weight":0.30000001192092896},[248,201],{"size":152,"scale":-1,"weight":0.5600000023841858},[307,248],{"size":162,"scale":2,"weight":0.23000000417232513},[312,252],{"size":48,"scale":3,"weight":0.23000000417232513},[118,96],{"size":99,"scale":1,"weight":0.6200000047683716},[161,130],{"size":5,"scale":3,"weight":-0.800000011920929},[13,10],{"size":126,"scale":2,"weight":-0.6000000238418579},[231,183],{"size":167,"scale":-1,"weight":0.4000000059604645},[330,267],{"size":112,"scale":2,"weight":-0.4000000059604645},[210,168],{"size":200,"scale":2,"weight":0.30000001192092896},[389,315],{"size":134,"scale":2,"weight":-0.4000000059604645},[251,200],{"size":145,"scale":1,"weight":0.23000000417232513},[221,180],{"size":27,"scale":1,"weight":-0.4000000059604645},[41,33],{"size":141,"scale":-1,"weight":-0.6000000238418579},[258,205],{"size":75,"scale":-1,"weight":-0.800000011920929},[137,109],{"size":143,"scale":-1,"weight":0},[272,215],{"size":17,"scale":1,"weight":-0.6000000238418579},[25,20],{"size":18,"scale":3,"weight":-0.800000011920929},[43,34],{"size":98,"scale":2,"weight":0},[186,146],{"size":109,"scale":3,"weight":0.30000001192092896},[271,219],{"size":162,"scale":3,"weight":0.4000000059604645},[408,329],{"size":187,"scale":-1,"weight":0.23000000417232513},[361,291],{"size":75,"scale":1,"weight":-0.4000000059604645},[111,89],{"size":82,"scale":2,"weight":0.23000000417232513},[158,128],{"size":188,"scale":1,"weight":0.5600000023841858},[299,242],{"size":26,"scale":-1,"weight":0.30000001192092896},[52,42],{"size":55,"scale":-1,"weight":0.5600000023841858},[111,90],{"size":158,"scale":-1,"weight":-0.4000000059604645},[296,237],{"size":66,"scale":-1,"weight":0},[126,99],{"size":198,"scale":3,"weight":0.30000001192092896},[492,397],{"size":156,"scale":3,"weight":0.23000000417232513},[384,309],{"size":150,"scale":1,"weight":-0.800000011920929},[214,171],{"size":86,"scale":1,"weight":-0.6000000238418579},[125,99],{"size":53,"scale":1,"weight":0},[80,65],{"size":64,"scale":1,"weight":0.6200000047683716},[104,84],{"size":144,"scale":3,"weight":0},[350,280],{"size":23,"scale":1,"weight":0.30000001192092896},[36,29],{"size":154,"scale":1,"weight":0.6200000047683716},[249,202],{"size":85,"scale":3,"weight":-0.6000000238418579},[200,159],{"size":44,"scale":1,"weight":0},[66,54],{"size":178,"scale":2,"weight":0.30000001192092896},[347,280],{"size":124,"scale":2,"weight":0.6200000047683716},[254,206],{"size":37,"scale":-1,"weight":0.6200000047683716},[77,61],{"size":47,"scale":-1,"weight":0.23000000417232513},[91,73],{"size":47,"scale":-1,"weight":0.6200000047683716},[97,78],{"size":43,"scale":1,"weight":-0.6000000238418579},[62,50],{"size":27,"scale":-1,"weight":0.6200000047683716},[56,46],{"size":95,"scale":1,"weight":0.6200000047683716},[154,125],{"size":170,"scale":1,"weight":0.5600000023841858},[271,219],{"size":45,"scale":3,"weight":0.6200000047683716},[118,95],{"size":200,"scale":2,"weight":0.6200000047683716},[411,332],{"size":42,"scale":2,"weight":0.5600000023841858},[85,69],{"size":13,"scale":1,"weight":0.6200000047683716},[22,18],{"size":1,"scale":-1,"weight":0},[2,2],{"size":172,"scale":1,"weight":0},[259,210],{"size":54,"scale":1,"weight":-0.800000011920929},[78,61],{"size":110,"scale":-1,"weight":-0.800000011920929},[200,160],{"size":169,"scale":1,"weight":0.23000000417232513},[258,209],{"size":40,"scale":-1,"weight":0},[77,60],{"size":15,"scale":2,"weight":0.23000000417232513},[29,24],{"size":81,"scale":3,"weight":0.4000000059604645},[204,165],{"size":54,"scale":2,"weight":-0.4000000059604645},[102,81],{"size":48,"scale":2,"weight":0.5600000023841858},[97,78],{"size":95,"scale":1,"weight":0.5600000023841858},[151,123],{"size":141,"scale":3,"weight":0.6200000047683716},[368,298],{"size":111,"scale":-1,"weight":0},[211,166],{"size":157,"scale":3,"weight":0.4000000059604645},[396,319],{"size":64,"scale":-1,"weight":0},[122,96],{"size":187,"scale":2,"weight":0.23000000417232513},[361,291],{"size":83,"scale":-1,"weight":0.5600000023841858},[167,135],{"size":98,"scale":2,"weight":0.23000000417232513},[189,153],{"size":171,"scale":3,"weight":0.30000001192092896},[425,343],{"size":26,"scale":1,"weight":0.23000000417232513},[40,33],{"size":32,"scale":1,"weight":0.5600000023841858},[51,41],{"size":47,"scale":1,"weight":-0.800000011920929},[67,53],{"size":58,"scale":-1,"weight":0.6200000047683716},[120,97],{"size":127,"scale":-1,"weight":0.23000000417232513},[245,198],{"size":72,"scale":-1,"weight":0.23000000417232513},[139,113],{"size":200,"scale":1,"weight":0},[301,244],{"size":81,"scale":2,"weight":0},[154,121],{"size":155,"scale":1,"weight":-0.6000000238418579},[224,177],{"size":200,"scale":3,"weight":0.4000000059604645},[505,406],{"size":191,"scale":-1,"weight":0.5600000023841858},[385,311],{"size":182,"scale":2,"weight":0.6200000047683716},[373,302],{"size":26,"scale":-1,"weight":0.5600000023841858},[52,43],{"size":117,"scale":2,"weight":0.23000000417232513},[226,182],{"size":137,"scale":2,"weight":0.6200000047683716},[281,228],{"size":169,"scale":3,"weight":0.4000000059604645},[426,343],{"size":67,"scale":2,"weight":0.4000000059604645},[133,108],{"size":44,"scale":1,"weight":0.6200000047683716},[72,58],{"size":107,"scale":2,"weight":-0.6000000238418579},[197,156],{"size":100,"scale":2,"weight":-0.800000011920929},[182,145],{"size":113,"scale":1,"weight":0.6200000047683716},[183,148],{"size":65,"scale":-1,"weight":-0.800000011920929},[118,94],{"size":90,"scale":-1,"weight":0.23000000417232513},[174,141],{"size":55,"scale":-1,"weight":0.23000000417232513},[107,86],{"size":143,"scale":-1,"weight":0.4000000059604645},[283,229],{"size":159,"scale":-1,"weight":-0.4000000059604645},[298,238],{"size":134,"scale":-1,"weight":0.5600000023841858},[271,218],{"size":165,"scale":-1,"weight":0.30000001192092896},[322,260],{"size":132,"scale":-1,"weight":0.6200000047683716},[271,219],{"size":2,"scale":3,"weight":-0.6000000238418579},[6,4],{"size":192,"scale":2,"weight":0.6200000047683716},[394,318],{"size":156,"scale":2,"weight":-0.6000000238418579},[286,226],{"size":5,"scale":-1,"weight":0.30000001192092896},[10,8],{"size":81,"scale":3,"weight":0.23000000417232513},[200,160],{"size":11,"scale":3,"weight":-0.4000000059604645},[27,21],{"size":58,"scale":2,"weight":0},[111,87],{"size":159,"scale":1,"weight":0.30000001192092896},[245,199],{"size":33,"scale":3,"weight":0.5600000023841858},[85,69],{"size":36,"scale":3,"weight":-0.4000000059604645},[86,69],{"size":30,"scale":2,"weight":0.6200000047683716},[62,50],{"size":13,"scale":3,"weight":-0.4000000059604645},[32,25],{"size":76,"scale":1,"weight":0},[115,93],{"size":91,"scale":1,"weight":-0.4000000059604645},[135,108],{"size":189,"scale":3,"weight":-0.800000011920929},[443,355],{"size":69,"scale":3,"weight":0.5600000023841858},[178,144],{"size":50,"scale":-1,"weight":-0.800000011920929},[91,73],{"size":92,"scale":-1,"weight":-0.4000000059604645},[172,138],{"size":170,"scale":1,"weight":-0.800000011920929},[243,193],{"size":113,"scale":1,"weight":0},[170,138],{"size":114,"scale":1,"weight":0.5600000023841858},[181,147],{"size":26,"scale":2,"weight":0.4000000059604645},[51,42],{"size":120,"scale":1,"weight":0.6200000047683716},[194,157],{"size":86,"scale":1,"weight":-0.4000000059604645},[128,103],{"size":141,"scale":2,"weight":0.4000000059604645},[279,226],{"size":81,"scale":1,"weight":0.5600000023841858},[129,105],{"size":176,"scale":-1,"weight":-0.4000000059604645},[330,264],{"size":177,"scale":1,"weight":-0.4000000059604645},[262,210],{"size":172,"scale":-1,"weight":0.30000001192092896},[335,271],{"size":34,"scale":3,"weight":0},[83,67],{"size":89,"scale":1,"weight":-0.800000011920929},[127,101],{"size":82,"scale":1,"weight":0.6200000047683716},[133,107],{"size":6,"scale":3,"weight":-0.800000011920929},[15,11],{"size":152,"scale":1,"weight":-0.800000011920929},[217,173],{"size":48,"scale":1,"weight":0.23000000417232513},[74,60],{"size":160,"scale":2,"weight":-0.4000000059604645},[300,240],{"size":171,"scale":1,"weight":0},[258,208],{"size":19,"scale":3,"weight":0},[46,37],{"size":91,"scale":3,"weight":0.6200000047683716},[238,192],{"size":159,"scale":2,"weight":-0.800000011920929},[289,231],{"size":74,"scale":3,"weight":-0.800000011920929},[174,140],{"size":155,"scale":3,"weight":0.30000001192092896},[386,310],{"size":88,"scale":1,"weight":0.23000000417232513},[135,109],{"size":117,"scale":2,"weight":-0.6000000238418579},[215,169],{"size":106,"scale":2,"weight":-0.4000000059604645},[199,158],{"size":12,"scale":2,"weight":-0.800000011920929},[23,18],{"size":183,"scale":-1,"weight":0},[347,274],{"size":33,"scale":-1,"weight":0.30000001192092896},[65,53],{"size":66,"scale":3,"weight":0.6200000047683716},[173,140],{"size":179,"scale":1,"weight":0.6200000047683716},[290,234],{"size":63,"scale":-1,"weight":0},[121,95],{"size":105,"scale":-1,"weight":0.4000000059604645},[208,168],{"size":109,"scale":3,"weight":-0.800000011920929},[256,205],{"size":1,"scale":-1,"weight":0.23000000417232513},[2,2],{"size":11,"scale":2,"weight":0},[21,17],{"size":81,"scale":1,"weight":0},[123,99],{"size":2,"scale":1,"weight":-0.6000000238418579},[3,3],{"size":132,"scale":-1,"weight":0.30000001192092896},[257,208],{"size":178,"scale":2,"weight":0},[338,266],{"size":82,"scale":1,"weight":-0.4000000059604645},[122,97],{"size":162,"scale":3,"weight":-0.6000000238418579},[381,303],{"size":169,"scale":2,"weight":-0.4000000059604645},[317,252],{"size":18,"scale":2,"weight":0},[35,27],{"size":166,"scale":3,"weight":0.6200000047683716},[433,350],{"size":88,"scale":3,"weight":0.30000001192092896},[219,177],{"size":127,"scale":-1,"weight":0.30000001192092896},[248,200],{"size":125,"scale":2,"weight":-0.800000011920929},[227,182],{"size":110,"scale":-1,"weight":-0.6000000238418579},[202,159],{"size":56,"scale":-1,"weight":0.4000000059604645},[111,90],{"size":189,"scale":3,"weight":0},[459,369],{"size":14,"scale":-1,"weight":0.4000000059604645},[28,22],{"size":125,"scale":-1,"weight":-0.6000000238418579},[230,181],{"size":38,"scale":-1,"weight":-0.800000011920929},[69,56],{"size":109,"scale":1,"weight":-0.800000011920929},[156,124],{"size":168,"scale":2,"weight":-0.800000011920929},[305,244],{"size":65,"scale":2,"weight":0},[124,98],{"size":128,"scale":2,"weight":0.5600000023841858},[258,209],{"size":26,"scale":1,"weight":0.4000000059604645},[41,34],{"size":124,"scale":1,"weight":0.23000000417232513},[190,154],{"size":200,"scale":-1,"weight":0.6200000047683716},[411,332],{"size":96,"scale":-1,"weight":0.5600000023841858},[194,157],{"size":69,"scale":-1,"weight":0.23000000417232513},[134,108],{"size":143,"scale":3,"weight":0.5600000023841858},[368,297],{"size":101,"scale":-1,"weight":0},[192,152],{"size":136,"scale":3,"weight":0},[330,265],{"size":80,"scale":-1,"weight":0.5600000023841858},[162,131],{"size":191,"scale":-1,"weight":0},[363,286],{"size":159,"scale":2,"weight":0},[302,238],{"size":189,"scale":1,"weight":0.4000000059604645},[295,239],{"size":53,"scale":1,"weight":0.4000000059604645},[83,67],{"size":93,"scale":2,"weight":-0.800000011920929},[169,135],{"size":2,"scale":3,"weight":-0.4000000059604645},[6,4],{"size":191,"scale":-1,"weight":0.4000000059604645},[377,305],{"size":66,"scale":-1,"weight":0.30000001192092896},[129,105],{"size":23,"scale":-1,"weight":0.5600000023841858},[47,38],{"size":13,"scale":3,"weight":0},[32,26],{"size":143,"scale":2,"weight":-0.800000011920929},[260,208],{"size":72,"scale":-1,"weight":0.4000000059604645},[142,116],{"size":114,"scale":-1,"weight":0.5600000023841858},[230,186],{"size":191,"scale":1,"weight":0},[287,233],{"size":108,"scale":-1,"weight":-0.6000000238418579},[198,157],{"size":41,"scale":2,"weight":0.4000000059604645},[82,66],{"size":167,"scale":-1,"weight":0},[317,250],{"size":75,"scale":1,"weight":0.6200000047683716},[122,98],{"size":112,"scale":3,"weight":0.4000000059604645},[283,228],{"size":42,"scale":2,"weight":0.30000001192092896},[82,66],{"size":179,"scale":-1,"weight":0.5600000023841858},[361,292],{"size":64,"scale":-1,"weight":0.30000001192092896},[125,101],{"size":28,"scale":2,"weight":-0.4000000059604645},[53,42],{"size":75,"scale":2,"weight":-0.800000011920929},[137,109],{"size":196,"scale":2,"weight":-0.800000011920929},[356,285],{"size":126,"scale":1,"weight":0.4000000059604645},[197,159],{"size":109,"scale":1,"weight":0},[164,133],{"size":74,"scale":2,"weight":0.6200000047683716},[152,123],{"size":173,"scale":-1,"weight":0.6200000047683716},[355,287],{"size":65,"scale":2,"weight":0.23000000417232513},[126,101],{"size":103,"scale":2,"weight":0.30000001192092896},[201,162],{"size":175,"scale":2,"weight":0.23000000417232513},[337,273],{"size":133,"scale":1,"weight":0},[200,162],{"size":118,"scale":3,"weight":0.5600000023841858},[304,246],{"size":127,"scale":-1,"weight":0},[241,190],{"size":39,"scale":2,"weight":0.30000001192092896},[76,62],{"size":181,"scale":3,"weight":0},[440,353],{"size":45,"scale":-1,"weight":-0.6000000238418579},[83,66],{"size":136,"scale":3,"weight":0.6200000047683716},[355,288],{"size":176,"scale":1,"weight":0.23000000417232513},[268,218],{"size":152,"scale":2,"weight":0.5600000023841858},[307,248],{"size":196,"scale":3,"weight":0.6200000047683716},[511,414],{"size":4,"scale":-1,"weight":0.30000001192092896},[8,7],{"size":66,"scale":-1,"weight":0.5600000023841858},[134,108],{"size":183,"scale":1,"weight":-0.4000000059604645},[270,217],{"size":133,"scale":-1,"weight":-0.4000000059604645},[249,199],{"size":179,"scale":-1,"weight":0},[340,267],{"size":97,"scale":3,"weight":-0.4000000059604645},[233,185],{"size":97,"scale":2,"weight":-0.4000000059604645},[182,145],{"size":116,"scale":1,"weight":-0.4000000059604645},[172,138],{"size":199,"scale":3,"weight":0},[483,388],{"size":121,"scale":3,"weight":-0.4000000059604645},[290,231],{"size":161,"scale":-1,"weight":0.30000001192092896},[314,253],{"size":130,"scale":2,"weight":0.4000000059604645},[257,208],{"size":167,"scale":3,"weight":0.23000000417232513},[411,331],{"size":53,"scale":-1,"weight":-0.4000000059604645},[100,79],{"size":63,"scale":1,"weight":-0.4000000059604645},[94,76],{"size":75,"scale":1,"weight":-0.800000011920929},[108,85],{"size":15,"scale":-1,"weight":-0.800000011920929},[28,23],{"size":110,"scale":-1,"weight":0.5600000023841858},[222,179],{"size":196,"scale":2,"weight":0.6200000047683716},[402,325],{"size":121,"scale":3,"weight":0.4000000059604645},[305,246],{"size":133,"scale":2,"weight":-0.4000000059604645},[249,199],{"size":165,"scale":3,"weight":-0.800000011920929},[387,310],{"size":66,"scale":2,"weight":-0.800000011920929},[120,97],{"size":13,"scale":-1,"weight":0.23000000417232513},[26,20],{"size":111,"scale":-1,"weight":0.23000000417232513},[214,173],{"size":10,"scale":2,"weight":0.4000000059604645},[20,17],{"size":129,"scale":1,"weight":0.23000000417232513},[196,160],{"size":99,"scale":2,"weight":-0.6000000238418579},[182,143],{"size":32,"scale":1,"weight":-0.6000000238418579},[47,37],{"size":176,"scale":1,"weight":-0.6000000238418579},[254,201],{"size":38,"scale":1,"weight":0.6200000047683716},[62,50],{"size":168,"scale":-1,"weight":0},[319,251],{"size":189,"scale":1,"weight":0.30000001192092896},[291,236],{"size":132,"scale":2,"weight":-0.6000000238418579},[242,191],{"size":187,"scale":-1,"weight":0},[355,280],{"size":86,"scale":2,"weight":-0.4000000059604645},[161,129],{"size":146,"scale":-1,"weight":0.4000000059604645},[289,233],{"size":122,"scale":-1,"weight":-0.4000000059604645},[229,182],{"size":181,"scale":3,"weight":0.5600000023841858},[465,376],{"size":195,"scale":2,"weight":0.5600000023841858},[393,318],{"size":198,"scale":-1,"weight":0},[377,296],{"size":2,"scale":1,"weight":-0.800000011920929},[3,2],{"size":61,"scale":3,"weight":0.30000001192092896},[152,123],{"size":1,"scale":2,"weight":-0.800000011920929},[2,2],{"size":82,"scale":2,"weight":0.4000000059604645},[162,131],{"size":51,"scale":3,"weight":-0.800000011920929},[120,96],{"size":180,"scale":2,"weight":0.5600000023841858},[363,293],{"size":193,"scale":2,"weight":-0.800000011920929},[351,281],{"size":41,"scale":-1,"weight":-0.6000000238418579},[75,60],{"size":133,"scale":-1,"weight":0.4000000059604645},[263,212],{"size":32,"scale":1,"weight":0.4000000059604645},[50,41],{"size":69,"scale":1,"weight":0.5600000023841858},[110,89],{"size":35,"scale":3,"weight":0.30000001192092896},[88,71],{"size":48,"scale":2,"weight":-0.6000000238418579},[89,70],{"size":122,"scale":1,"weight":0.30000001192092896},[188,153],{"size":10,"scale":1,"weight":-0.800000011920929},[15,11],{"size":31,"scale":1,"weight":-0.800000011920929},[45,35],{"size":118,"scale":2,"weight":0.23000000417232513},[227,184],{"size":198,"scale":1,"weight":-0.800000011920929},[283,225],{"size":108,"scale":-1,"weight":0.6200000047683716},[222,180],{"size":186,"scale":-1,"weight":0.23000000417232513},[359,289],{"size":68,"scale":1,"weight":0.4000000059604645},[106,86],{"size":192,"scale":2,"weight":0.30000001192092896},[374,302],{"size":2,"scale":2,"weight":0.23000000417232513},[4,3],{"size":182,"scale":2,"weight":0.4000000059604645},[360,291],{"size":59,"scale":-1,"weight":-0.6000000238418579},[108,86],{"size":110,"scale":-1,"weight":0.4000000059604645},[218,176],{"size":120,"scale":2,"weight":0.4000000059604645},[237,192],{"size":99,"scale":-1,"weight":0},[188,149],{"size":91,"scale":1,"weight":0.23000000417232513},[139,112],{"size":98,"scale":-1,"weight":-0.6000000238418579},[180,142],{"size":180,"scale":-1,"weight":0.23000000417232513},[347,280],{"size":140,"scale":1,"weight":-0.4000000059604645},[207,166],{"size":25,"scale":3,"weight":0.6200000047683716},[66,54],{"size":183,"scale":2,"weight":0.4000000059604645},[361,292],{"size":114,"scale":1,"weight":0.30000001192092896},[176,143],{"size":103,"scale":-1,"weight":-0.4000000059604645},[193,154],{"size":138,"scale":2,"weight":0},[263,207],{"size":78,"scale":1,"weight":0},[118,96],{"size":103,"scale":1,"weight":0.5600000023841858},[164,133],{"size":75,"scale":3,"weight":0.23000000417232513},[185,149],{"size":127,"scale":3,"weight":0.5600000023841858},[326,264],{"size":103,"scale":-1,"weight":0},[196,154],{"size":32,"scale":1,"weight":-0.4000000059604645},[47,38],{"size":51,"scale":1,"weight":0.4000000059604645},[80,65],{"size":181,"scale":3,"weight":-0.800000011920929},[424,340],{"size":124,"scale":3,"weight":-0.6000000238418579},[292,232],{"size":197,"scale":3,"weight":0},[478,383],{"size":91,"scale":3,"weight":-0.4000000059604645},[219,173],{"size":9,"scale":3,"weight":0.4000000059604645},[23,19],{"size":156,"scale":1,"weight":0.5600000023841858},[248,201],{"size":122,"scale":-1,"weight":0.23000000417232513},[235,190],{"size":146,"scale":3,"weight":0.30000001192092896},[363,292],{"size":45,"scale":1,"weight":0.5600000023841858},[72,58],{"size":75,"scale":3,"weight":-0.6000000238418579},[177,141],{"size":163,"scale":-1,"weight":0.30000001192092896},[318,256],{"size":58,"scale":3,"weight":0},[141,113],{"size":170,"scale":1,"weight":0.6200000047683716},[275,222],{"size":70,"scale":2,"weight":0.4000000059604645},[139,112],{"size":74,"scale":1,"weight":-0.800000011920929},[106,84],{"size":138,"scale":-1,"weight":0.23000000417232513},[266,215],{"size":47,"scale":1,"weight":0.6200000047683716},[76,61],{"size":162,"scale":-1,"weight":0.4000000059604645},[320,259],{"size":98,"scale":-1,"weight":0.5600000023841858},[198,160],{"size":140,"scale":1,"weight":-0.6000000238418579},[202,160],{"size":59,"scale":-1,"weight":-0.800000011920929},[108,86],{"size":132,"scale":2,"weight":0.30000001192092896},[257,208],{"size":121,"scale":2,"weight":-0.4000000059604645},[226,181],{"size":167,"scale":1,"weight":0.23000000417232513},[255,207],{"size":103,"scale":2,"weight":-0.4000000059604645},[193,154],{"size":7,"scale":2,"weight":0.23000000417232513},[14,11],{"size":186,"scale":3,"weight":0.4000000059604645},[469,378],{"size":4,"scale":-1,"weight":-0.4000000059604645},[8,7],{"size":141,"scale":3,"weight":0.23000000417232513},[347,279],{"size":9,"scale":-1,"weight":0.30000001192092896},[18,15],{"size":74,"scale":1,"weight":0.6200000047683716},[120,97],{"size":25,"scale":3,"weight":0.4000000059604645},[64,52],{"size":53,"scale":-1,"weight":0.6200000047683716},[109,88],{"size":44,"scale":2,"weight":0.4000000059604645},[87,71],{"size":63,"scale":-1,"weight":0.4000000059604645},[125,101],{"size":32,"scale":3,"weight":0.4000000059604645},[81,65],{"size":168,"scale":2,"weight":-0.4000000059604645},[314,251],{"size":177,"scale":3,"weight":-0.6000000238418579},[417,332],{"size":96,"scale":3,"weight":0.5600000023841858},[247,200],{"size":18,"scale":-1,"weight":0.6200000047683716},[38,30],{"size":95,"scale":1,"weight":0.30000001192092896},[147,119],{"size":78,"scale":2,"weight":0.4000000059604645},[154,125],{"size":161,"scale":3,"weight":0.4000000059604645},[406,327],{"size":146,"scale":-1,"weight":-0.800000011920929},[265,212],{"size":84,"scale":-1,"weight":-0.800000011920929},[153,123],{"size":160,"scale":-1,"weight":0.6200000047683716},[329,266],{"size":24,"scale":1,"weight":0.23000000417232513},[37,30],{"size":110,"scale":2,"weight":-0.800000011920929},[200,160],{"size":149,"scale":3,"weight":-0.800000011920929},[349,280],{"size":138,"scale":2,"weight":-0.4000000059604645},[258,207],{"size":200,"scale":1,"weight":0.5600000023841858},[318,257],{"size":52,"scale":-1,"weight":0.6200000047683716},[107,87],{"size":82,"scale":1,"weight":0.30000001192092896},[127,102],{"size":72,"scale":2,"weight":-0.4000000059604645},[135,108],{"size":99,"scale":-1,"weight":-0.4000000059604645},[186,148],{"size":81,"scale":3,"weight":0.5600000023841858},[209,168],{"size":81,"scale":-1,"weight":-0.6000000238418579},[149,118],{"size":66,"scale":-1,"weight":0.23000000417232513},[127,104],{"size":185,"scale":3,"weight":0.5600000023841858},[476,385],{"size":57,"scale":3,"weight":0.5600000023841858},[146,119],{"size":169,"scale":-1,"weight":0.30000001192092896},[330,266],{"size":7,"scale":-1,"weight":0.23000000417232513},[14,11],{"size":199,"scale":-1,"weight":0.4000000059604645},[393,318],{"size":96,"scale":1,"weight":0.23000000417232513},[147,119],{"size":200,"scale":2,"weight":0.23000000417232513},[386,311],{"size":153,"scale":-1,"weight":0},[291,229],{"size":77,"scale":-1,"weight":0.5600000023841858},[156,125],{"size":72,"scale":2,"weight":0.4000000059604645},[142,116],{"size":48,"scale":-1,"weight":-0.800000011920929},[88,70],{"size":191,"scale":1,"weight":-0.800000011920929},[272,217],{"size":166,"scale":1,"weight":0},[250,203],{"size":8,"scale":2,"weight":0.4000000059604645},[17,13],{"size":195,"scale":1,"weight":0},[294,238],{"size":70,"scale":1,"weight":0},[106,86],{"size":107,"scale":-1,"weight":0},[204,161],{"size":2,"scale":1,"weight":-0.4000000059604645},[3,3],{"size":198,"scale":-1,"weight":0.23000000417232513},[381,309],{"size":5,"scale":1,"weight":-0.6000000238418579},[8,7],{"size":119,"scale":3,"weight":0.30000001192092896},[296,239],{"size":15,"scale":2,"weight":-0.4000000059604645},[28,23],{"size":75,"scale":2,"weight":0.6200000047683716},[154,125],{"size":113,"scale":1,"weight":0.4000000059604645},[176,143],{"size":4,"scale":3,"weight":0.23000000417232513},[10,9],{"size":77,"scale":1,"weight":-0.800000011920929},[110,88],{"size":154,"scale":-1,"weight":0.4000000059604645},[304,246],{"size":164,"scale":1,"weight":0.30000001192092896},[253,204],{"size":173,"scale":1,"weight":-0.800000011920929},[247,197],{"size":190,"scale":2,"weight":0},[361,284],{"size":20,"scale":1,"weight":-0.4000000059604645},[30,24],{"size":137,"scale":2,"weight":-0.800000011920929},[249,199],{"size":15,"scale":-1,"weight":-0.4000000059604645},[28,23],{"size":198,"scale":3,"weight":0.23000000417232513},[487,392],{"size":51,"scale":2,"weight":0.23000000417232513},[99,80],{"size":122,"scale":1,"weight":0.23000000417232513},[186,151],{"size":166,"scale":-1,"weight":0.23000000417232513},[320,258],{"size":23,"scale":3,"weight":0},[56,45],{"size":21,"scale":-1,"weight":0},[41,32],{"size":4,"scale":-1,"weight":-0.6000000238418579},[8,7],{"size":43,"scale":-1,"weight":0.5600000023841858},[87,71],{"size":55,"scale":2,"weight":-0.6000000238418579},[101,80],{"size":87,"scale":2,"weight":0.5600000023841858},[176,142],{"size":190,"scale":3,"weight":0.5600000023841858},[488,395],{"size":156,"scale":1,"weight":0},[235,190],{"size":136,"scale":1,"weight":0.23000000417232513},[208,169],{"size":75,"scale":3,"weight":0.6200000047683716},[196,159],{"size":191,"scale":-1,"weight":-0.6000000238418579},[350,276],{"size":172,"scale":-1,"weight":0.6200000047683716},[353,286],{"size":105,"scale":3,"weight":0.5600000023841858},[270,219],{"size":167,"scale":1,"weight":-0.800000011920929},[238,190],{"size":70,"scale":-1,"weight":0.6200000047683716},[144,116],{"size":64,"scale":-1,"weight":-0.6000000238418579},[118,93],{"size":196,"scale":2,"weight":-0.6000000238418579},[359,284],{"size":12,"scale":2,"weight":0.23000000417232513},[24,19],{"size":81,"scale":-1,"weight":-0.800000011920929},[147,118],{"size":72,"scale":1,"weight":-0.800000011920929},[104,82],{"size":160,"scale":2,"weight":-0.800000011920929},[291,233],{"size":140,"scale":1,"weight":0.4000000059604645},[219,177],{"size":149,"scale":-1,"weight":-0.800000011920929},[271,217],{"size":142,"scale":-1,"weight":0.23000000417232513},[274,221],{"size":102,"scale":2,"weight":0.30000001192092896},[199,161],{"size":190,"scale":2,"weight":0.30000001192092896},[370,299],{"size":175,"scale":2,"weight":0.30000001192092896},[341,276],{"size":132,"scale":1,"weight":-0.4000000059604645},[195,157],{"size":126,"scale":3,"weight":-0.4000000059604645},[302,240],{"size":124,"scale":-1,"weight":-0.4000000059604645},[232,186],{"size":113,"scale":-1,"weight":0},[215,169],{"size":195,"scale":2,"weight":0.4000000059604645},[385,311],{"size":198,"scale":-1,"weight":-0.6000000238418579},[363,287],{"size":25,"scale":2,"weight":-0.4000000059604645},[47,37],{"size":50,"scale":1,"weight":0.4000000059604645},[78,64],{"size":150,"scale":3,"weight":-0.800000011920929},[351,282],{"size":29,"scale":-1,"weight":0.30000001192092896},[57,46],{"size":121,"scale":-1,"weight":-0.4000000059604645},[226,181],{"size":153,"scale":3,"weight":0.5600000023841858},[393,317],{"size":102,"scale":-1,"weight":0.30000001192092896},[199,161],{"size":22,"scale":3,"weight":-0.800000011920929},[52,42],{"size":3,"scale":2,"weight":0.23000000417232513},[7,6],{"size":139,"scale":3,"weight":-0.4000000059604645},[333,265],{"size":33,"scale":1,"weight":0.4000000059604645},[52,43],{"size":136,"scale":3,"weight":-0.4000000059604645},[326,260],{"size":142,"scale":3,"weight":0.23000000417232513},[350,281],{"size":189,"scale":2,"weight":0.23000000417232513},[364,294],{"size":34,"scale":3,"weight":0.23000000417232513},[84,68],{"size":39,"scale":-1,"weight":0.30000001192092896},[76,62],{"size":17,"scale":-1,"weight":0.23000000417232513},[34,27],{"size":82,"scale":3,"weight":-0.4000000059604645},[197,156],{"size":28,"scale":1,"weight":0},[43,35],{"size":2,"scale":-1,"weight":0.23000000417232513},[4,3],{"size":54,"scale":2,"weight":-0.800000011920929},[98,78],{"size":172,"scale":3,"weight":0.23000000417232513},[424,341],{"size":115,"scale":3,"weight":0.30000001192092896},[287,231],{"size":89,"scale":1,"weight":0.6200000047683716},[144,117],{"size":34,"scale":3,"weight":-0.4000000059604645},[82,66],{"size":180,"scale":3,"weight":0.30000001192092896},[448,361],{"size":143,"scale":2,"weight":-0.6000000238418579},[263,207],{"size":198,"scale":1,"weight":0.6200000047683716},[320,259],{"size":79,"scale":1,"weight":0.4000000059604645},[124,100],{"size":12,"scale":-1,"weight":0.5600000023841858},[24,20],{"size":98,"scale":3,"weight":-0.6000000238418579},[231,184],{"size":148,"scale":2,"weight":-0.6000000238418579},[272,215],{"size":137,"scale":2,"weight":-0.4000000059604645},[257,205],{"size":29,"scale":1,"weight":-0.800000011920929},[42,33],{"size":72,"scale":1,"weight":-0.4000000059604645},[107,86],{"size":143,"scale":1,"weight":0.30000001192092896},[221,179],{"size":144,"scale":-1,"weight":-0.4000000059604645},[270,215],{"size":195,"scale":3,"weight":-0.800000011920929},[457,366],{"size":132,"scale":1,"weight":-0.800000011920929},[189,150],{"size":110,"scale":3,"weight":0.5600000023841858},[283,229],{"size":118,"scale":2,"weight":0},[224,177],{"size":122,"scale":3,"weight":0.23000000417232513},[301,241],{"size":134,"scale":2,"weight":0.30000001192092896},[261,211],{"size":23,"scale":2,"weight":0.6200000047683716},[48,39],{"size":37,"scale":-1,"weight":-0.4000000059604645},[70,55],{"size":29,"scale":3,"weight":0.23000000417232513},[72,58],{"size":90,"scale":2,"weight":0},[171,135],{"size":55,"scale":1,"weight":0.30000001192092896},[85,70],{"size":197,"scale":3,"weight":-0.6000000238418579},[464,368],{"size":174,"scale":2,"weight":-0.800000011920929},[316,253],{"size":99,"scale":2,"weight":0.5600000023841858},[200,161],{"size":178,"scale":-1,"weight":0.4000000059604645},[351,284],{"size":77,"scale":-1,"weight":0.4000000059604645},[152,123],{"size":109,"scale":3,"weight":0.6200000047683716},[285,231],{"size":186,"scale":2,"weight":0.30000001192092896},[362,292],{"size":50,"scale":1,"weight":0.5600000023841858},[80,65],{"size":196,"scale":1,"weight":-0.4000000059604645},[289,233],{"size":161,"scale":1,"weight":-0.6000000238418579},[233,184],{"size":127,"scale":3,"weight":0.23000000417232513},[313,252],{"size":145,"scale":3,"weight":-0.6000000238418579},[341,272],{"size":17,"scale":-1,"weight":0.6200000047683716},[35,29],{"size":185,"scale":3,"weight":0.4000000059604645},[466,376],{"size":122,"scale":2,"weight":0.5600000023841858},[246,199],{"size":37,"scale":2,"weight":-0.800000011920929},[67,54],{"size":72,"scale":-1,"weight":0.5600000023841858},[146,118],{"size":187,"scale":1,"weight":0.5600000023841858},[297,241],{"size":80,"scale":-1,"weight":-0.6000000238418579},[147,116],{"size":139,"scale":-1,"weight":0.6200000047683716},[286,231],{"size":170,"scale":3,"weight":-0.4000000059604645},[407,324],{"size":56,"scale":-1,"weight":0.30000001192092896},[110,89],{"size":28,"scale":3,"weight":0.6200000047683716},[73,59],{"size":84,"scale":1,"weight":0.23000000417232513},[128,104],{"size":140,"scale":1,"weight":-0.800000011920929},[200,159],{"size":52,"scale":3,"weight":0.5600000023841858},[134,109],{"size":98,"scale":1,"weight":0.6200000047683716},[159,128],{"size":34,"scale":1,"weight":-0.800000011920929},[49,39],{"size":46,"scale":3,"weight":0.30000001192092896},[115,92],{"size":123,"scale":1,"weight":0.23000000417232513},[187,152],{"size":76,"scale":-1,"weight":0.6200000047683716},[156,126],{"size":101,"scale":-1,"weight":-0.800000011920929},[184,147],{"size":175,"scale":-1,"weight":0},[333,262],{"size":192,"scale":3,"weight":0.23000000417232513},[472,380],{"size":93,"scale":1,"weight":0.4000000059604645},[145,118],{"size":29,"scale":1,"weight":0.23000000417232513},[45,36],{"size":185,"scale":1,"weight":0},[278,225],{"size":181,"scale":1,"weight":0.6200000047683716},[293,237],{"size":16,"scale":1,"weight":0.30000001192092896},[25,20],{"size":40,"scale":1,"weight":-0.6000000238418579},[58,46],{"size":116,"scale":2,"weight":0.23000000417232513},[224,181],{"size":27,"scale":2,"weight":0.23000000417232513},[53,43],{"size":120,"scale":3,"weight":-0.800000011920929},[282,225],{"size":122,"scale":3,"weight":-0.6000000238418579},[287,228],{"size":183,"scale":2,"weight":-0.6000000238418579},[336,265],{"size":104,"scale":1,"weight":0},[156,127],{"size":96,"scale":1,"weight":0},[145,117],{"size":92,"scale":3,"weight":0.23000000417232513},[227,183],{"size":133,"scale":-1,"weight":0.6200000047683716},[273,221],{"size":96,"scale":-1,"weight":0.30000001192092896},[187,152],{"size":119,"scale":3,"weight":0.6200000047683716},[311,252],{"size":178,"scale":-1,"weight":0.5600000023841858},[359,290],{"size":151,"scale":1,"weight":0.23000000417232513},[230,187],{"size":194,"scale":1,"weight":0.6200000047683716},[314,254],{"size":36,"scale":2,"weight":0.5600000023841858},[73,59],{"size":191,"scale":-1,"weight":0.6200000047683716},[392,317],{"size":3,"scale":1,"weight":0.23000000417232513},[5,4],{"size":88,"scale":-1,"weight":0},[168,132],{"size":34,"scale":3,"weight":0.6200000047683716},[89,73],{"size":112,"scale":1,"weight":-0.800000011920929},[160,127],{"size":19,"scale":-1,"weight":-0.4000000059604645},[36,29],{"size":47,"scale":2,"weight":-0.6000000238418579},[86,68],{"size":174,"scale":2,"weight":-0.6000000238418579},[319,252],{"size":29,"scale":2,"weight":0.30000001192092896},[57,46],{"size":98,"scale":3,"weight":0.4000000059604645},[248,199],{"size":78,"scale":-1,"weight":0.30000001192092896},[153,123],{"size":194,"scale":3,"weight":0.4000000059604645},[489,395],{"size":1,"scale":2,"weight":0.30000001192092896},[2,2],{"size":189,"scale":-1,"weight":0.5600000023841858},[381,308],{"size":66,"scale":-1,"weight":-0.6000000238418579},[122,96],{"size":170,"scale":3,"weight":0.30000001192092896},[423,340],{"size":86,"scale":2,"weight":0.5600000023841858},[174,140],{"size":67,"scale":3,"weight":-0.6000000238418579},[158,126],{"size":32,"scale":2,"weight":-0.4000000059604645},[60,49],{"size":189,"scale":3,"weight":0.6200000047683716},[493,400],{"size":23,"scale":-1,"weight":0.4000000059604645},[46,37],{"size":72,"scale":3,"weight":0.4000000059604645},[182,146],{"size":129,"scale":-1,"weight":-0.800000011920929},[234,188],{"size":18,"scale":-1,"weight":0.30000001192092896},[36,29],{"size":189,"scale":3,"weight":0.30000001192092896},[470,379],{"size":101,"scale":1,"weight":0.30000001192092896},[156,127],{"size":102,"scale":2,"weight":-0.800000011920929},[186,149],{"size":107,"scale":3,"weight":0.30000001192092896},[266,214],{"size":133,"scale":1,"weight":0.30000001192092896},[205,166],{"size":105,"scale":2,"weight":0},[200,157],{"size":2,"scale":2,"weight":0.4000000059604645},[4,3],{"size":115,"scale":-1,"weight":-0.4000000059604645},[215,172],{"size":90,"scale":3,"weight":0.23000000417232513},[222,178],{"size":93,"scale":1,"weight":0.23000000417232513},[142,116],{"size":112,"scale":3,"weight":-0.800000011920929},[263,210],{"size":118,"scale":-1,"weight":0.30000001192092896},[230,186],{"size":198,"scale":3,"weight":-0.800000011920929},[464,372],{"size":134,"scale":2,"weight":0.4000000059604645},[265,214],{"size":155,"scale":2,"weight":0.23000000417232513},[299,241],{"size":190,"scale":2,"weight":0.23000000417232513},[366,296],{"size":118,"scale":-1,"weight":0.23000000417232513},[227,184],{"size":192,"scale":2,"weight":-0.800000011920929},[349,279],{"size":176,"scale":-1,"weight":0.30000001192092896},[343,277],{"size":143,"scale":2,"weight":-0.4000000059604645},[268,214],{"size":190,"scale":-1,"weight":0.23000000417232513},[366,296],{"size":196,"scale":2,"weight":0.30000001192092896},[382,308],{"size":13,"scale":1,"weight":-0.4000000059604645},[20,16],{"size":91,"scale":1,"weight":0.6200000047683716},[148,119],{"size":105,"scale":3,"weight":-0.6000000238418579},[247,197],{"size":179,"scale":-1,"weight":-0.6000000238418579},[328,259],{"size":5,"scale":2,"weight":0.5600000023841858},[11,9],{"size":68,"scale":-1,"weight":0.23000000417232513},[131,106],{"size":85,"scale":2,"weight":0.5600000023841858},[172,139],{"size":125,"scale":1,"weight":0.4000000059604645},[195,158],{"size":112,"scale":1,"weight":0.5600000023841858},[178,144],{"size":99,"scale":1,"weight":0},[150,122],{"size":4,"scale":3,"weight":-0.800000011920929},[10,8],{"size":183,"scale":-1,"weight":0.23000000417232513},[353,285],{"size":10,"scale":2,"weight":-0.6000000238418579},[19,15],{"size":152,"scale":-1,"weight":0.4000000059604645},[301,243],{"size":162,"scale":3,"weight":-0.4000000059604645},[388,308],{"size":96,"scale":2,"weight":0.5600000023841858},[194,157],{"size":13,"scale":3,"weight":-0.800000011920929},[31,25],{"size":12,"scale":1,"weight":0.6200000047683716},[20,17],{"size":54,"scale":3,"weight":0.23000000417232513},[133,107],{"size":11,"scale":-1,"weight":0.5600000023841858},[23,18],{"size":184,"scale":-1,"weight":0.4000000059604645},[364,294],{"size":115,"scale":3,"weight":0.5600000023841858},[296,239],{"size":81,"scale":-1,"weight":0.6200000047683716},[166,135],{"size":174,"scale":2,"weight":0.4000000059604645},[344,278],{"size":42,"scale":3,"weight":-0.6000000238418579},[99,79],{"size":186,"scale":2,"weight":-0.6000000238418579},[341,269],{"size":46,"scale":-1,"weight":-0.800000011920929},[84,67],{"size":113,"scale":1,"weight":0.5600000023841858},[180,145],{"size":104,"scale":2,"weight":0.30000001192092896},[203,164],{"size":61,"scale":2,"weight":-0.800000011920929},[111,89],{"size":151,"scale":3,"weight":0.5600000023841858},[388,314],{"size":169,"scale":-1,"weight":-0.4000000059604645},[317,252],{"size":32,"scale":1,"weight":-0.800000011920929},[47,36],{"size":168,"scale":1,"weight":-0.6000000238418579},[243,192],{"size":170,"scale":-1,"weight":0},[324,254],{"size":196,"scale":1,"weight":0.30000001192092896},[302,245],{"size":152,"scale":-1,"weight":0.30000001192092896},[296,240],{"size":155,"scale":2,"weight":-0.4000000059604645},[290,232],{"size":152,"scale":-1,"weight":0},[289,228],{"size":95,"scale":1,"weight":-0.4000000059604645},[141,113],{"size":69,"scale":1,"weight":-0.4000000059604645},[103,82],{"size":112,"scale":3,"weight":0.6200000047683716},[293,236],{"size":103,"scale":1,"weight":-0.6000000238418579},[149,118],{"size":165,"scale":-1,"weight":-0.800000011920929},[300,240],{"size":109,"scale":-1,"weight":0},[207,163],{"size":76,"scale":3,"weight":-0.6000000238418579},[179,142],{"size":120,"scale":2,"weight":0.6200000047683716},[246,200],{"size":116,"scale":3,"weight":0.23000000417232513},[286,230],{"size":14,"scale":3,"weight":0.23000000417232513},[35,28],{"size":196,"scale":-1,"weight":-0.4000000059604645},[367,293],{"size":188,"scale":1,"weight":0.6200000047683716},[304,246],{"size":39,"scale":2,"weight":0.5600000023841858},[79,64],{"size":38,"scale":2,"weight":0.5600000023841858},[77,63],{"size":27,"scale":-1,"weight":-0.6000000238418579},[50,40],{"size":52,"scale":1,"weight":0.5600000023841858},[83,67],{"size":132,"scale":-1,"weight":0.4000000059604645},[261,211],{"size":94,"scale":-1,"weight":0},[179,141],{"size":45,"scale":2,"weight":0.6200000047683716},[93,75],{"size":147,"scale":3,"weight":0.30000001192092896},[366,294],{"size":13,"scale":2,"weight":-0.6000000238418579},[24,19],{"size":92,"scale":1,"weight":0.5600000023841858},[147,119],{"size":92,"scale":1,"weight":0.30000001192092896},[142,116],{"size":200,"scale":-1,"weight":-0.800000011920929},[364,291],{"size":36,"scale":3,"weight":0.30000001192092896},[90,72],{"size":107,"scale":2,"weight":-0.800000011920929},[195,156],{"size":27,"scale":3,"weight":0.23000000417232513},[67,54],{"size":57,"scale":1,"weight":-0.6000000238418579},[83,66],{"size":79,"scale":1,"weight":-0.6000000238418579},[115,91],{"size":158,"scale":3,"weight":-0.800000011920929},[370,297],{"size":32,"scale":-1,"weight":0},[61,48],{"size":113,"scale":-1,"weight":-0.800000011920929},[205,165],{"size":61,"scale":-1,"weight":0},[116,91],{"size":77,"scale":1,"weight":-0.6000000238418579},[111,89],{"size":152,"scale":1,"weight":0.4000000059604645},[238,193],{"size":44,"scale":-1,"weight":0.6200000047683716},[91,74],{"size":17,"scale":2,"weight":0.5600000023841858},[35,28],{"size":126,"scale":1,"weight":0.6200000047683716},[204,165],{"size":124,"scale":2,"weight":0.23000000417232513},[239,194],{"size":90,"scale":3,"weight":-0.6000000238418579},[212,168],{"size":42,"scale":-1,"weight":0.5600000023841858},[85,69],{"size":120,"scale":-1,"weight":0.6200000047683716},[246,200],{"size":189,"scale":1,"weight":0.6200000047683716},[306,248],{"size":151,"scale":3,"weight":0.6200000047683716},[394,319],{"size":43,"scale":1,"weight":0.4000000059604645},[67,55],{"size":46,"scale":2,"weight":0},[88,69],{"size":87,"scale":3,"weight":0.23000000417232513},[214,173],{"size":171,"scale":3,"weight":0.4000000059604645},[431,348],{"size":62,"scale":-1,"weight":0.30000001192092896},[121,98],{"size":46,"scale":1,"weight":0.4000000059604645},[73,58],{"size":68,"scale":1,"weight":0.23000000417232513},[104,84],{"size":58,"scale":3,"weight":0.4000000059604645},[147,118],{"size":40,"scale":3,"weight":-0.4000000059604645},[96,77],{"size":178,"scale":1,"weight":0.23000000417232513},[272,220],{"size":174,"scale":1,"weight":0.30000001192092896},[268,217],{"size":30,"scale":3,"weight":0.4000000059604645},[76,62],{"size":151,"scale":3,"weight":0},[367,294],{"size":116,"scale":2,"weight":0.6200000047683716},[239,193],{"size":178,"scale":3,"weight":0.5600000023841858},[458,370],{"size":71,"scale":-1,"weight":0},[135,107],{"size":143,"scale":-1,"weight":0.30000001192092896},[278,225],{"size":97,"scale":2,"weight":0},[185,145],{"size":146,"scale":-1,"weight":0.23000000417232513},[281,227],{"size":168,"scale":1,"weight":0.30000001192092896},[259,210],{"size":112,"scale":-1,"weight":-0.800000011920929},[204,163],{"size":137,"scale":2,"weight":-0.6000000238418579},[251,199],{"size":21,"scale":1,"weight":-0.800000011920929},[31,24],{"size":170,"scale":2,"weight":-0.800000011920929},[309,247],{"size":49,"scale":3,"weight":-0.800000011920929},[115,92],{"size":98,"scale":-1,"weight":0.30000001192092896},[191,154],{"size":157,"scale":3,"weight":0.6200000047683716},[410,331],{"size":186,"scale":2,"weight":0.4000000059604645},[368,297],{"size":91,"scale":1,"weight":0.5600000023841858},[145,117],{"size":15,"scale":1,"weight":0.4000000059604645},[23,19],{"size":134,"scale":3,"weight":0.5600000023841858},[344,278],{"size":2,"scale":1,"weight":0.4000000059604645},[3,3],{"size":136,"scale":2,"weight":-0.800000011920929},[247,198],{"size":64,"scale":1,"weight":-0.800000011920929},[92,73],{"size":59,"scale":1,"weight":0},[89,72],{"size":77,"scale":-1,"weight":-0.6000000238418579},[141,111],{"size":175,"scale":2,"weight":0},[333,262],{"size":12,"scale":3,"weight":-0.4000000059604645},[29,24],{"size":71,"scale":1,"weight":-0.6000000238418579},[103,82],{"size":83,"scale":2,"weight":-0.4000000059604645},[156,124],{"size":64,"scale":3,"weight":0.30000001192092896},[160,128],{"size":63,"scale":2,"weight":0},[121,95],{"size":123,"scale":2,"weight":-0.800000011920929},[224,178],{"size":110,"scale":1,"weight":0.5600000023841858},[175,142],{"size":193,"scale":3,"weight":0.23000000417232513},[475,381],{"size":194,"scale":2,"weight":0.5600000023841858},[391,316],{"size":8,"scale":3,"weight":0.5600000023841858},[21,17],{"size":55,"scale":3,"weight":-0.800000011920929},[130,103],{"size":36,"scale":-1,"weight":0.6200000047683716},[74,60],{"size":198,"scale":1,"weight":0.5600000023841858},[315,255],{"size":194,"scale":2,"weight":0.4000000059604645},[384,310],{"size":130,"scale":3,"weight":0},[316,253],{"size":113,"scale":-1,"weight":-0.4000000059604645},[212,170],{"size":138,"scale":3,"weight":0.6200000047683716},[361,291],{"size":31,"scale":1,"weight":-0.4000000059604645},[46,37],{"size":182,"scale":3,"weight":-0.4000000059604645},[436,347],{"size":34,"scale":2,"weight":-0.6000000238418579},[63,50],{"size":70,"scale":-1,"weight":0.4000000059604645},[139,112],{"size":46,"scale":2,"weight":0.4000000059604645},[92,74],{"size":155,"scale":2,"weight":-0.800000011920929},[282,225],{"size":46,"scale":-1,"weight":0},[88,69],{"size":192,"scale":2,"weight":0.23000000417232513},[370,298],{"size":36,"scale":3,"weight":-0.800000011920929},[85,68],{"size":60,"scale":3,"weight":0.23000000417232513},[148,120],{"size":138,"scale":1,"weight":0.5600000023841858},[219,178],{"size":50,"scale":2,"weight":0.30000001192092896},[98,79],{"size":190,"scale":2,"weight":-0.800000011920929},[345,276],{"size":5,"scale":3,"weight":0},[13,10],{"size":85,"scale":-1,"weight":-0.4000000059604645},[159,128],{"size":159,"scale":3,"weight":0},[386,310],{"size":114,"scale":-1,"weight":-0.6000000238418579},[209,166],{"size":28,"scale":-1,"weight":-0.6000000238418579},[52,41],{"size":56,"scale":1,"weight":0},[84,69],{"size":76,"scale":2,"weight":0.6200000047683716},[156,126],{"size":176,"scale":-1,"weight":0.4000000059604645},[348,281],{"size":55,"scale":-1,"weight":0.4000000059604645},[110,89],{"size":65,"scale":1,"weight":-0.800000011920929},[93,74],{"size":115,"scale":2,"weight":-0.6000000238418579},[211,167],{"size":169,"scale":-1,"weight":0.6200000047683716},[347,280],{"size":80,"scale":-1,"weight":0.23000000417232513},[154,125],{"size":78,"scale":2,"weight":-0.6000000238418579},[143,114],{"size":95,"scale":1,"weight":0.4000000059604645},[149,120],{"size":106,"scale":-1,"weight":0},[202,158],{"size":67,"scale":-1,"weight":0.6200000047683716},[138,112],{"size":115,"scale":-1,"weight":0},[219,173],{"size":154,"scale":3,"weight":0.23000000417232513},[379,305],{"size":52,"scale":2,"weight":0.4000000059604645},[103,83],{"size":152,"scale":2,"weight":0.30000001192092896},[296,240],{"size":104,"scale":-1,"weight":0.23000000417232513},[201,162],{"size":160,"scale":-1,"weight":0.4000000059604645},[317,256],{"size":70,"scale":3,"weight":0.5600000023841858},[180,146],{"size":137,"scale":3,"weight":0.6200000047683716},[358,290],{"size":14,"scale":2,"weight":0.5600000023841858},[29,23],{"size":88,"scale":2,"weight":-0.6000000238418579},[162,127],{"size":177,"scale":3,"weight":0.5600000023841858},[455,368],{"size":182,"scale":3,"weight":0.5600000023841858},[468,378],{"size":115,"scale":3,"weight":-0.6000000238418579},[271,216],{"size":200,"scale":-1,"weight":0.30000001192092896},[389,315],{"size":185,"scale":1,"weight":0.30000001192092896},[285,231],{"size":49,"scale":-1,"weight":-0.4000000059604645},[92,74],{"size":63,"scale":3,"weight":-0.4000000059604645},[151,120],{"size":76,"scale":2,"weight":0.30000001192092896},[148,120],{"size":127,"scale":1,"weight":0.23000000417232513},[194,157],{"size":119,"scale":1,"weight":-0.6000000238418579},[173,136],{"size":7,"scale":2,"weight":0.6200000047683716},[15,12],{"size":31,"scale":2,"weight":0.5600000023841858},[63,51],{"size":173,"scale":-1,"weight":0.4000000059604645},[342,276],{"size":158,"scale":1,"weight":0.30000001192092896},[243,198],{"size":156,"scale":1,"weight":0.30000001192092896},[241,195],{"size":129,"scale":2,"weight":0.30000001192092896},[251,204],{"size":173,"scale":1,"weight":0.23000000417232513},[264,214],{"size":88,"scale":2,"weight":0.4000000059604645},[174,140],{"size":33,"scale":3,"weight":0.30000001192092896},[82,66],{"size":84,"scale":2,"weight":0.5600000023841858},[169,138],{"size":127,"scale":-1,"weight":-0.6000000238418579},[233,184],{"size":148,"scale":2,"weight":0.23000000417232513},[286,231],{"size":16,"scale":1,"weight":0.5600000023841858},[26,21],{"size":92,"scale":3,"weight":0.4000000059604645},[232,188],{"size":47,"scale":2,"weight":0.4000000059604645},[93,75],{"size":162,"scale":2,"weight":-0.6000000238418579},[297,235],{"size":176,"scale":3,"weight":0.23000000417232513},[433,349],{"size":21,"scale":1,"weight":0},[33,26],{"size":145,"scale":3,"weight":0.4000000059604645},[366,295],{"size":118,"scale":-1,"weight":-0.4000000059604645},[221,177],{"size":185,"scale":-1,"weight":0},[352,277],{"size":166,"scale":2,"weight":-0.6000000238418579},[305,241],{"size":125,"scale":1,"weight":-0.6000000238418579},[181,143],{"size":58,"scale":-1,"weight":0},[111,87],{"size":90,"scale":1,"weight":-0.4000000059604645},[133,107],{"size":67,"scale":2,"weight":0},[127,100],{"size":71,"scale":-1,"weight":0.23000000417232513},[137,110],{"size":102,"scale":3,"weight":0.23000000417232513},[251,202],{"size":94,"scale":1,"weight":-0.4000000059604645},[139,112],{"size":172,"scale":1,"weight":-0.6000000238418579},[249,197],{"size":88,"scale":3,"weight":0.4000000059604645},[222,179],{"size":106,"scale":1,"weight":0.23000000417232513},[162,131],{"size":108,"scale":2,"weight":-0.4000000059604645},[202,162],{"size":123,"scale":3,"weight":0.4000000059604645},[311,250],{"size":143,"scale":1,"weight":-0.6000000238418579},[207,164],{"size":183,"scale":1,"weight":0},[276,223],{"size":60,"scale":3,"weight":0.5600000023841858},[154,125],{"size":149,"scale":2,"weight":-0.4000000059604645},[279,223],{"size":165,"scale":-1,"weight":0.5600000023841858},[333,269],{"size":163,"scale":3,"weight":0.5600000023841858},[419,339],{"size":67,"scale":3,"weight":0.5600000023841858},[172,139],{"size":97,"scale":-1,"weight":0.4000000059604645},[192,155],{"size":115,"scale":2,"weight":0.30000001192092896},[224,181],{"size":58,"scale":-1,"weight":0.23000000417232513},[112,91],{"size":98,"scale":1,"weight":-0.6000000238418579},[142,112],{"size":77,"scale":-1,"weight":0.30000001192092896},[150,121],{"size":154,"scale":3,"weight":0.30000001192092896},[383,309],{"size":98,"scale":2,"weight":0.5600000023841858},[198,160],{"size":175,"scale":1,"weight":-0.6000000238418579},[253,200],{"size":58,"scale":2,"weight":0.5600000023841858},[117,95],{"size":23,"scale":3,"weight":-0.4000000059604645},[56,44],{"size":4,"scale":1,"weight":0},[7,6],{"size":53,"scale":2,"weight":0},[101,79],{"size":138,"scale":-1,"weight":0.30000001192092896},[269,217],{"size":149,"scale":1,"weight":0.5600000023841858},[237,192],{"size":113,"scale":1,"weight":-0.800000011920929},[162,128],{"size":177,"scale":2,"weight":0.23000000417232513},[341,276],{"size":170,"scale":2,"weight":0.30000001192092896},[331,268],{"size":77,"scale":2,"weight":0.30000001192092896},[150,121],{"size":10,"scale":-1,"weight":0.23000000417232513},[20,16],{"size":93,"scale":2,"weight":0.6200000047683716},[191,154],{"size":30,"scale":-1,"weight":-0.800000011920929},[55,44],{"size":151,"scale":3,"weight":-0.800000011920929},[354,284],{"size":194,"scale":2,"weight":0.30000001192092896},[378,305],{"size":69,"scale":-1,"weight":0.30000001192092896},[135,109],{"size":130,"scale":1,"weight":-0.800000011920929},[186,148],{"size":155,"scale":2,"weight":0.6200000047683716},[319,257],{"size":16,"scale":-1,"weight":-0.800000011920929},[30,24],{"size":147,"scale":-1,"weight":0.23000000417232513},[283,229],{"size":128,"scale":-1,"weight":0.6200000047683716},[263,212],{"size":60,"scale":1,"weight":0.4000000059604645},[94,76],{"size":3,"scale":-1,"weight":0.4000000059604645},[7,6],{"size":80,"scale":1,"weight":0.23000000417232513},[122,99],{"size":169,"scale":1,"weight":-0.800000011920929},[241,192],{"size":85,"scale":3,"weight":0.30000001192092896},[211,170],{"size":113,"scale":1,"weight":0.30000001192092896},[175,141],{"size":146,"scale":3,"weight":-0.4000000059604645},[350,279],{"size":5,"scale":3,"weight":0.4000000059604645},[13,11],{"size":2,"scale":-1,"weight":-0.4000000059604645},[4,3],{"size":182,"scale":-1,"weight":0.5600000023841858},[367,297],{"size":14,"scale":-1,"weight":-0.800000011920929},[26,20],{"size":45,"scale":1,"weight":0.6200000047683716},[73,59],{"size":91,"scale":2,"weight":0.5600000023841858},[184,149],{"size":130,"scale":1,"weight":-0.4000000059604645},[192,155],{"size":59,"scale":1,"weight":0.5600000023841858},[94,76],{"size":31,"scale":-1,"weight":-0.6000000238418579},[57,45],{"size":141,"scale":2,"weight":0.30000001192092896},[275,222],{"size":167,"scale":1,"weight":0.5600000023841858},[266,215],{"size":154,"scale":1,"weight":-0.4000000059604645},[228,183],{"size":64,"scale":2,"weight":0},[122,96],{"size":122,"scale":1,"weight":0},[184,149],{"size":93,"scale":1,"weight":0},[141,114],{"size":149,"scale":3,"weight":0},[362,291],{"size":76,"scale":-1,"weight":0.23000000417232513},[147,118],{"size":83,"scale":3,"weight":0.30000001192092896},[207,167],{"size":149,"scale":2,"weight":-0.800000011920929},[271,217],{"size":152,"scale":-1,"weight":-0.6000000238418579},[279,221],{"size":39,"scale":-1,"weight":0.4000000059604645},[77,63],{"size":155,"scale":3,"weight":0.4000000059604645},[391,315],{"size":60,"scale":3,"weight":0},[146,118],{"size":30,"scale":3,"weight":0.5600000023841858},[77,63],{"size":88,"scale":-1,"weight":0.23000000417232513},[170,137],{"size":170,"scale":2,"weight":0.4000000059604645},[336,272],{"size":38,"scale":2,"weight":0.6200000047683716},[79,64],{"size":59,"scale":2,"weight":-0.4000000059604645},[111,88],{"size":196,"scale":3,"weight":0.30000001192092896},[487,392],{"size":120,"scale":1,"weight":0},[181,146],{"size":68,"scale":2,"weight":0.23000000417232513},[131,106],{"size":18,"scale":1,"weight":0},[28,22],{"size":58,"scale":1,"weight":0.23000000417232513},[89,72],{"size":91,"scale":-1,"weight":0.4000000059604645},[180,146],{"size":146,"scale":2,"weight":-0.4000000059604645},[274,218],{"size":121,"scale":2,"weight":0.5600000023841858},[244,197],{"size":20,"scale":3,"weight":0.4000000059604645},[50,42],{"size":47,"scale":1,"weight":-0.4000000059604645},[70,56],{"size":187,"scale":2,"weight":0.4000000059604645},[369,299],{"size":69,"scale":2,"weight":0.4000000059604645},[136,110],{"size":55,"scale":3,"weight":-0.4000000059604645},[133,105],{"size":77,"scale":-1,"weight":0},[147,116],{"size":83,"scale":-1,"weight":-0.4000000059604645},[156,124],{"size":49,"scale":2,"weight":0.4000000059604645},[97,79],{"size":69,"scale":1,"weight":0.4000000059604645},[108,87],{"size":105,"scale":2,"weight":0.30000001192092896},[205,165],{"size":145,"scale":3,"weight":0.5600000023841858},[373,302],{"size":18,"scale":1,"weight":-0.4000000059604645},[27,21],{"size":120,"scale":2,"weight":-0.4000000059604645},[225,180],{"size":96,"scale":3,"weight":0.4000000059604645},[242,196],{"size":40,"scale":-1,"weight":0.30000001192092896},[78,63],{"size":161,"scale":3,"weight":-0.6000000238418579},[379,301],{"size":165,"scale":1,"weight":0.23000000417232513},[251,204],{"size":179,"scale":2,"weight":0.5600000023841858},[361,292],{"size":113,"scale":2,"weight":-0.800000011920929},[205,165],{"size":54,"scale":2,"weight":0.6200000047683716},[111,90],{"size":156,"scale":1,"weight":-0.800000011920929},[223,177],{"size":48,"scale":-1,"weight":0.5600000023841858},[97,78],{"size":159,"scale":1,"weight":0.6200000047683716},[257,208],{"size":117,"scale":2,"weight":-0.800000011920929},[213,170],{"size":53,"scale":1,"weight":-0.4000000059604645},[79,63],{"size":100,"scale":1,"weight":0.30000001192092896},[154,125],{"size":34,"scale":1,"weight":0},[52,42],{"size":173,"scale":2,"weight":0.30000001192092896},[338,272],{"size":97,"scale":-1,"weight":-0.6000000238418579},[178,141],{"size":94,"scale":3,"weight":0.23000000417232513},[232,186],{"size":184,"scale":2,"weight":0.23000000417232513},[354,286],{"size":188,"scale":2,"weight":-0.6000000238418579},[345,273],{"size":32,"scale":-1,"weight":-0.800000011920929},[59,47],{"size":111,"scale":2,"weight":0.6200000047683716},[228,184],{"size":98,"scale":3,"weight":-0.4000000059604645},[235,187],{"size":26,"scale":2,"weight":-0.800000011920929},[48,39],{"size":188,"scale":1,"weight":-0.4000000059604645},[278,224],{"size":50,"scale":3,"weight":0.5600000023841858},[128,104],{"size":59,"scale":-1,"weight":0.5600000023841858},[119,96],{"size":126,"scale":-1,"weight":-0.4000000059604645},[236,189],{"size":132,"scale":1,"weight":0},[199,161],{"size":166,"scale":1,"weight":0.30000001192092896},[255,208],{"size":43,"scale":2,"weight":0.30000001192092896},[84,69],{"size":163,"scale":2,"weight":0.30000001192092896},[318,256],{"size":73,"scale":1,"weight":0},[110,89],{"size":45,"scale":-1,"weight":0.4000000059604645},[89,72],{"size":170,"scale":1,"weight":-0.6000000238418579},[246,194],{"size":83,"scale":2,"weight":0.4000000059604645},[164,132],{"size":109,"scale":3,"weight":0},[265,213],{"size":105,"scale":-1,"weight":-0.4000000059604645},[197,157],{"size":174,"scale":2,"weight":0.5600000023841858},[351,283],{"size":70,"scale":1,"weight":0.5600000023841858},[111,91],{"size":70,"scale":1,"weight":0.4000000059604645},[109,89],{"size":196,"scale":3,"weight":0.4000000059604645},[494,398],{"size":158,"scale":2,"weight":-0.6000000238418579},[290,229],{"size":51,"scale":2,"weight":0.5600000023841858},[104,84],{"size":66,"scale":1,"weight":0.23000000417232513},[101,82],{"size":170,"scale":2,"weight":-0.4000000059604645},[318,255],{"size":176,"scale":2,"weight":0.5600000023841858},[355,287],{"size":45,"scale":3,"weight":0.5600000023841858},[116,94],{"size":115,"scale":2,"weight":0.6200000047683716},[236,191],{"size":88,"scale":2,"weight":0.6200000047683716},[181,146],{"size":40,"scale":-1,"weight":0.23000000417232513},[78,63],{"size":72,"scale":-1,"weight":0},[137,108],{"size":195,"scale":1,"weight":0.6200000047683716},[315,256],{"size":34,"scale":2,"weight":0.6200000047683716},[70,57],{"size":69,"scale":3,"weight":0.30000001192092896},[172,139],{"size":144,"scale":-1,"weight":0.5600000023841858},[291,235],{"size":38,"scale":2,"weight":0},[72,57],{"size":44,"scale":2,"weight":0.5600000023841858},[89,72],{"size":76,"scale":3,"weight":0.6200000047683716},[198,161],{"size":18,"scale":-1,"weight":-0.800000011920929},[33,26],{"size":26,"scale":-1,"weight":-0.4000000059604645},[49,40],{"size":25,"scale":2,"weight":0},[48,37],{"size":27,"scale":2,"weight":0.4000000059604645},[54,44],{"size":96,"scale":-1,"weight":-0.6000000238418579},[176,140],{"size":141,"scale":2,"weight":-0.800000011920929},[256,205],{"size":132,"scale":-1,"weight":0.5600000023841858},[266,215],{"size":171,"scale":-1,"weight":0.23000000417232513},[330,266],{"size":6,"scale":-1,"weight":-0.800000011920929},[11,9],{"size":135,"scale":3,"weight":0.5600000023841858},[347,280],{"size":139,"scale":2,"weight":0.4000000059604645},[275,222],{"size":121,"scale":1,"weight":0},[182,148],{"size":117,"scale":3,"weight":-0.4000000059604645},[280,223],{"size":13,"scale":2,"weight":0.23000000417232513},[26,20],{"size":67,"scale":-1,"weight":0.30000001192092896},[131,106],{"size":142,"scale":2,"weight":0.6200000047683716},[292,236],{"size":44,"scale":3,"weight":0.23000000417232513},[108,88],{"size":41,"scale":-1,"weight":-0.800000011920929},[75,60],{"size":171,"scale":1,"weight":0.5600000023841858},[273,220],{"size":134,"scale":-1,"weight":0.4000000059604645},[265,214],{"size":95,"scale":3,"weight":-0.6000000238418579},[224,178],{"size":121,"scale":1,"weight":0.30000001192092896},[187,152],{"size":157,"scale":3,"weight":-0.800000011920929},[368,294],{"size":133,"scale":2,"weight":0.6200000047683716},[273,221],{"size":46,"scale":3,"weight":0.23000000417232513},[114,91],{"size":23,"scale":1,"weight":-0.4000000059604645},[35,28],{"size":70,"scale":1,"weight":0.23000000417232513},[107,87],{"size":113,"scale":1,"weight":0.23000000417232513},[173,139],{"size":18,"scale":-1,"weight":0},[35,27],{"size":84,"scale":3,"weight":0.5600000023841858},[217,175],{"size":175,"scale":3,"weight":0.4000000059604645},[441,355],{"size":195,"scale":3,"weight":0.23000000417232513},[480,386],{"size":138,"scale":2,"weight":-0.6000000238418579},[253,200],{"size":15,"scale":2,"weight":0.4000000059604645},[30,25],{"size":136,"scale":-1,"weight":-0.800000011920929},[247,198],{"size":198,"scale":-1,"weight":0.5600000023841858},[399,323],{"size":166,"scale":2,"weight":0.4000000059604645},[328,265],{"size":76,"scale":3,"weight":-0.800000011920929},[178,143],{"size":57,"scale":2,"weight":-0.6000000238418579},[105,83],{"size":2,"scale":-1,"weight":0.6200000047683716},[4,3],{"size":35,"scale":2,"weight":-0.800000011920929},[64,51],{"size":71,"scale":2,"weight":0.30000001192092896},[139,112],{"size":66,"scale":2,"weight":0.23000000417232513},[127,104],{"size":13,"scale":-1,"weight":-0.800000011920929},[24,19],{"size":94,"scale":1,"weight":0.6200000047683716},[152,123],{"size":50,"scale":2,"weight":-0.6000000238418579},[92,73],{"size":86,"scale":3,"weight":0.30000001192092896},[214,172],{"size":10,"scale":1,"weight":-0.6000000238418579},[15,12],{"size":190,"scale":1,"weight":-0.800000011920929},[271,216],{"size":162,"scale":2,"weight":0.5600000023841858},[327,264],{"size":15,"scale":2,"weight":-0.800000011920929},[28,23],{"size":118,"scale":1,"weight":0.23000000417232513},[180,146],{"size":170,"scale":-1,"weight":0.5600000023841858},[343,278],{"size":140,"scale":2,"weight":0.5600000023841858},[282,228],{"size":13,"scale":3,"weight":0.30000001192092896},[33,27],{"size":191,"scale":2,"weight":0.5600000023841858},[385,311],{"size":168,"scale":2,"weight":-0.6000000238418579},[308,243],{"size":143,"scale":-1,"weight":-0.4000000059604645},[268,214],{"size":123,"scale":2,"weight":0.23000000417232513},[237,191],{"size":100,"scale":2,"weight":0.6200000047683716},[206,166],{"size":116,"scale":1,"weight":0.5600000023841858},[185,150],{"size":161,"scale":-1,"weight":0.6200000047683716},[331,267],{"size":150,"scale":3,"weight":-0.6000000238418579},[353,281],{"size":140,"scale":-1,"weight":0.5600000023841858},[282,228],{"size":107,"scale":3,"weight":0.6200000047683716},[279,226],{"size":1,"scale":-1,"weight":0.6200000047683716},[2,2],{"size":101,"scale":1,"weight":-0.4000000059604645},[149,120],{"size":152,"scale":1,"weight":-0.6000000238418579},[219,174],{"size":60,"scale":1,"weight":-0.6000000238418579},[87,69],{"size":58,"scale":-1,"weight":0.30000001192092896},[113,92],{"size":188,"scale":3,"weight":-0.6000000238418579},[443,352],{"size":51,"scale":-1,"weight":-0.800000011920929},[93,75],{"size":145,"scale":2,"weight":0.4000000059604645},[286,231],{"size":57,"scale":1,"weight":-0.800000011920929},[82,65],{"size":165,"scale":1,"weight":0.5600000023841858},[263,213],{"size":85,"scale":1,"weight":-0.6000000238418579},[123,98],{"size":151,"scale":1,"weight":-0.4000000059604645},[224,180],{"size":165,"scale":2,"weight":0.30000001192092896},[322,260],{"size":174,"scale":1,"weight":-0.800000011920929},[248,198],{"size":58,"scale":2,"weight":-0.4000000059604645},[109,87],{"size":20,"scale":3,"weight":0.6200000047683716},[52,43],{"size":82,"scale":1,"weight":0.23000000417232513},[126,101],{"size":56,"scale":-1,"weight":0.5600000023841858},[114,92],{"size":89,"scale":-1,"weight":0.6200000047683716},[183,149],{"size":143,"scale":-1,"weight":0.23000000417232513},[276,223],{"size":165,"scale":1,"weight":0.30000001192092896},[254,207],{"size":102,"scale":-1,"weight":-0.4000000059604645},[191,153],{"size":92,"scale":2,"weight":0.6200000047683716},[189,153],{"size":142,"scale":2,"weight":0.23000000417232513},[274,221],{"size":23,"scale":2,"weight":0},[44,35],{"size":95,"scale":3,"weight":0.23000000417232513},[234,188],{"size":14,"scale":2,"weight":0.4000000059604645},[28,22],{"size":102,"scale":3,"weight":0.30000001192092896},[254,204],{"size":110,"scale":1,"weight":0.4000000059604645},[172,139],{"size":115,"scale":1,"weight":0},[173,141],{"size":52,"scale":3,"weight":-0.800000011920929},[122,98],{"size":64,"scale":1,"weight":0},[97,79],{"size":112,"scale":-1,"weight":0.30000001192092896},[219,177],{"size":32,"scale":2,"weight":-0.800000011920929},[59,47],{"size":117,"scale":1,"weight":0.6200000047683716},[190,153],{"size":51,"scale":3,"weight":0.30000001192092896},[127,102],{"size":196,"scale":1,"weight":0.6200000047683716},[317,257],{"size":54,"scale":3,"weight":0.4000000059604645},[137,110],{"size":20,"scale":-1,"weight":-0.800000011920929},[37,29],{"size":173,"scale":-1,"weight":0.30000001192092896},[338,272],{"size":82,"scale":2,"weight":0},[156,123],{"size":153,"scale":2,"weight":-0.800000011920929},[278,223],{"size":190,"scale":-1,"weight":0.30000001192092896},[370,299],{"size":39,"scale":1,"weight":-0.4000000059604645},[58,46],{"size":166,"scale":2,"weight":0.5600000023841858},[334,271],{"size":67,"scale":1,"weight":-0.800000011920929},[96,76],{"size":20,"scale":3,"weight":-0.800000011920929},[47,38],{"size":165,"scale":3,"weight":-0.6000000238418579},[389,309],{"size":50,"scale":2,"weight":0.23000000417232513},[97,78],{"size":153,"scale":-1,"weight":0.4000000059604645},[302,245],{"size":146,"scale":3,"weight":0.6200000047683716},[381,309],{"size":2,"scale":3,"weight":0},[6,4],{"size":172,"scale":1,"weight":0.23000000417232513},[263,213],{"size":60,"scale":-1,"weight":0.5600000023841858},[121,98],{"size":117,"scale":-1,"weight":0.6200000047683716},[240,194],{"size":45,"scale":-1,"weight":0.30000001192092896},[89,71],{"size":25,"scale":2,"weight":-0.6000000238418579},[47,36],{"size":70,"scale":3,"weight":0.23000000417232513},[172,139],{"size":104,"scale":2,"weight":0.23000000417232513},[201,162],{"size":116,"scale":-1,"weight":0.5600000023841858},[234,189],{"size":60,"scale":1,"weight":0.5600000023841858},[96,77],{"size":93,"scale":2,"weight":0.23000000417232513},[180,145],{"size":126,"scale":3,"weight":0.6200000047683716},[329,266],{"size":121,"scale":-1,"weight":0.23000000417232513},[234,188],{"size":109,"scale":3,"weight":0.5600000023841858},[280,227],{"size":66,"scale":1,"weight":0.30000001192092896},[102,83],{"size":103,"scale":1,"weight":-0.800000011920929},[147,117],{"size":100,"scale":1,"weight":-0.4000000059604645},[148,119],{"size":190,"scale":-1,"weight":-0.6000000238418579},[348,275],{"size":86,"scale":3,"weight":0.5600000023841858},[221,179],{"size":142,"scale":1,"weight":-0.6000000238418579},[205,162],{"size":44,"scale":3,"weight":-0.800000011920929},[103,83],{"size":96,"scale":3,"weight":0.23000000417232513},[237,191],{"size":49,"scale":3,"weight":0.23000000417232513},[121,97],{"size":39,"scale":1,"weight":-0.6000000238418579},[57,45],{"size":101,"scale":-1,"weight":-0.4000000059604645},[189,152],{"size":121,"scale":-1,"weight":0.6200000047683716},[249,201],{"size":184,"scale":1,"weight":0.30000001192092896},[283,230],{"size":76,"scale":1,"weight":0.4000000059604645},[119,96],{"size":115,"scale":-1,"weight":0.6200000047683716},[236,191],{"size":105,"scale":3,"weight":0},[255,205],{"size":148,"scale":1,"weight":0.6200000047683716},[239,194],{"size":165,"scale":1,"weight":0.4000000059604645},[258,209],{"size":60,"scale":2,"weight":0.30000001192092896},[118,94],{"size":9,"scale":-1,"weight":0.4000000059604645},[18,15],{"size":142,"scale":3,"weight":0},[345,277],{"size":67,"scale":2,"weight":0.30000001192092896},[131,106],{"size":135,"scale":1,"weight":-0.800000011920929},[193,153],{"size":190,"scale":-1,"weight":0},[361,284],{"size":197,"scale":1,"weight":0.23000000417232513},[301,244],{"size":196,"scale":1,"weight":-0.800000011920929},[280,223],{"size":40,"scale":3,"weight":0.6200000047683716},[105,85],{"size":99,"scale":-1,"weight":0.4000000059604645},[196,158],{"size":152,"scale":-1,"weight":0.23000000417232513},[293,237],{"size":45,"scale":2,"weight":-0.800000011920929},[82,66],{"size":26,"scale":2,"weight":-0.4000000059604645},[49,40],{"size":155,"scale":1,"weight":-0.800000011920929},[221,176],{"size":166,"scale":-1,"weight":0.6200000047683716},[341,276],{"size":134,"scale":-1,"weight":-0.4000000059604645},[251,200],{"size":26,"scale":-1,"weight":-0.6000000238418579},[48,39],{"size":20,"scale":1,"weight":0},[30,25],{"size":168,"scale":-1,"weight":-0.800000011920929},[305,244],{"size":115,"scale":3,"weight":0.4000000059604645},[290,234],{"size":144,"scale":-1,"weight":0.30000001192092896},[281,227],{"size":185,"scale":3,"weight":0},[449,361],{"size":145,"scale":-1,"weight":0.5600000023841858},[292,236],{"size":3,"scale":3,"weight":0.30000001192092896},[8,7],{"size":32,"scale":-1,"weight":0.4000000059604645},[64,52],{"size":160,"scale":-1,"weight":0.23000000417232513},[308,249],{"size":24,"scale":-1,"weight":0.5600000023841858},[49,39],{"size":8,"scale":-1,"weight":-0.6000000238418579},[15,12],{"size":115,"scale":1,"weight":-0.800000011920929},[164,131],{"size":187,"scale":-1,"weight":-0.800000011920929},[340,272],{"size":79,"scale":-1,"weight":0.6200000047683716},[162,132],{"size":195,"scale":1,"weight":0.4000000059604645},[304,247],{"size":19,"scale":2,"weight":0.6200000047683716},[40,32],{"size":62,"scale":1,"weight":-0.6000000238418579},[90,71],{"size":177,"scale":3,"weight":0},[430,345],{"size":49,"scale":2,"weight":0.23000000417232513},[94,77],{"size":29,"scale":3,"weight":0.5600000023841858},[75,61],{"size":149,"scale":2,"weight":0.23000000417232513},[288,232],{"size":30,"scale":3,"weight":0.6200000047683716},[79,64],{"size":1,"scale":2,"weight":0.5600000023841858},[2,2],{"size":43,"scale":1,"weight":0.23000000417232513},[66,54],{"size":100,"scale":2,"weight":-0.4000000059604645},[188,149],{"size":195,"scale":2,"weight":0},[371,292],{"size":168,"scale":1,"weight":-0.800000011920929},[240,191],{"size":107,"scale":3,"weight":-0.4000000059604645},[256,204],{"size":72,"scale":3,"weight":0.30000001192092896},[180,144],{"size":74,"scale":-1,"weight":-0.6000000238418579},[136,108],{"size":158,"scale":2,"weight":-0.4000000059604645},[296,237],{"size":106,"scale":-1,"weight":0.30000001192092896},[206,167],{"size":125,"scale":1,"weight":0},[188,153],{"size":141,"scale":1,"weight":-0.6000000238418579},[203,161],{"size":143,"scale":1,"weight":-0.4000000059604645},[211,170],{"size":148,"scale":-1,"weight":0.6200000047683716},[304,246],{"size":53,"scale":3,"weight":0.23000000417232513},[131,105],{"size":130,"scale":3,"weight":0.30000001192092896},[324,260],{"size":168,"scale":-1,"weight":0.4000000059604645},[332,268],{"size":20,"scale":1,"weight":0.30000001192092896},[31,26],{"size":181,"scale":2,"weight":-0.4000000059604645},[339,271],{"size":13,"scale":3,"weight":0.4000000059604645},[34,27],{"size":73,"scale":-1,"weight":-0.800000011920929},[133,107],{"size":27,"scale":2,"weight":0.30000001192092896},[53,43],{"size":190,"scale":-1,"weight":-0.800000011920929},[345,276],{"size":100,"scale":3,"weight":-0.6000000238418579},[236,188],{"size":102,"scale":3,"weight":-0.4000000059604645},[245,195],{"size":143,"scale":3,"weight":0.30000001192092896},[355,286],{"size":111,"scale":-1,"weight":-0.800000011920929},[202,161],{"size":199,"scale":3,"weight":0.30000001192092896},[495,399],{"size":173,"scale":3,"weight":0.5600000023841858},[445,359],{"size":141,"scale":2,"weight":0.5600000023841858},[284,230],{"size":161,"scale":2,"weight":-0.800000011920929},[292,234],{"size":85,"scale":1,"weight":0.6200000047683716},[138,112],{"size":134,"scale":3,"weight":0.6200000047683716},[350,283],{"size":83,"scale":1,"weight":0.4000000059604645},[130,105],{"size":186,"scale":-1,"weight":0.4000000059604645},[368,297],{"size":159,"scale":-1,"weight":0.6200000047683716},[326,264],{"size":194,"scale":2,"weight":-0.6000000238418579},[356,281],{"size":151,"scale":-1,"weight":-0.4000000059604645},[283,226],{"size":151,"scale":2,"weight":-0.4000000059604645},[283,226],{"size":119,"scale":2,"weight":0.5600000023841858},[241,194],{"size":141,"scale":1,"weight":0.6200000047683716},[228,184],{"size":145,"scale":-1,"weight":0.30000001192092896},[283,228],{"size":129,"scale":2,"weight":-0.6000000238418579},[237,188],{"size":100,"scale":2,"weight":0.5600000023841858},[202,163],{"size":91,"scale":2,"weight":-0.6000000238418579},[167,132],{"size":156,"scale":1,"weight":0.4000000059604645},[244,197],{"size":44,"scale":2,"weight":0.6200000047683716},[91,74],{"size":167,"scale":-1,"weight":-0.6000000238418579},[306,242],{"size":160,"scale":2,"weight":0.23000000417232513},[308,249],{"size":136,"scale":1,"weight":-0.4000000059604645},[201,162],{"size":143,"scale":2,"weight":0.23000000417232513},[276,223],{"size":41,"scale":-1,"weight":0.6200000047683716},[84,68],{"size":1,"scale":3,"weight":-0.800000011920929},[3,2],{"size":128,"scale":3,"weight":0.30000001192092896},[318,257],{"size":39,"scale":-1,"weight":-0.800000011920929},[72,57],{"size":75,"scale":3,"weight":-0.800000011920929},[176,141],{"size":49,"scale":1,"weight":-0.800000011920929},[71,56],{"size":53,"scale":1,"weight":-0.6000000238418579},[77,61],{"size":180,"scale":3,"weight":0.23000000417232513},[443,357],{"size":114,"scale":1,"weight":0.6200000047683716},[184,150],{"size":73,"scale":1,"weight":0.4000000059604645},[114,93],{"size":181,"scale":3,"weight":0.4000000059604645},[456,368],{"size":176,"scale":-1,"weight":0.23000000417232513},[339,274],{"size":108,"scale":2,"weight":0.6200000047683716},[222,180],{"size":115,"scale":-1,"weight":-0.800000011920929},[209,167],{"size":64,"scale":-1,"weight":0.5600000023841858},[129,105],{"size":6,"scale":3,"weight":0},[15,12],{"size":79,"scale":-1,"weight":-0.4000000059604645},[148,119],{"size":123,"scale":2,"weight":0.30000001192092896},[240,193],{"size":81,"scale":-1,"weight":0.5600000023841858},[164,132],{"size":130,"scale":-1,"weight":0.5600000023841858},[262,212],{"size":32,"scale":-1,"weight":0.5600000023841858},[65,53],{"size":98,"scale":2,"weight":0.6200000047683716},[201,163],{"size":55,"scale":-1,"weight":0},[105,83],{"size":187,"scale":-1,"weight":0.30000001192092896},[365,295],{"size":54,"scale":3,"weight":0},[131,105],{"size":108,"scale":2,"weight":0.5600000023841858},[218,176],{"size":148,"scale":3,"weight":0.30000001192092896},[368,296],{"size":138,"scale":-1,"weight":0.5600000023841858},[278,225],{"size":149,"scale":1,"weight":0.6200000047683716},[241,195],{"size":101,"scale":2,"weight":-0.4000000059604645},[189,152],{"size":197,"scale":1,"weight":-0.800000011920929},[281,224],{"size":13,"scale":1,"weight":0.23000000417232513},[20,17],{"size":62,"scale":2,"weight":0.6200000047683716},[128,103],{"size":70,"scale":2,"weight":-0.800000011920929},[128,102],{"size":95,"scale":2,"weight":0.23000000417232513},[183,149],{"size":98,"scale":2,"weight":0.30000001192092896},[191,154],{"size":34,"scale":2,"weight":0},[65,52],{"size":30,"scale":2,"weight":-0.800000011920929},[55,44],{"size":93,"scale":3,"weight":0.30000001192092896},[232,186],{"size":137,"scale":3,"weight":0.5600000023841858},[352,285],{"size":199,"scale":-1,"weight":-0.6000000238418579},[365,289],{"size":183,"scale":3,"weight":0.5600000023841858},[470,380],{"size":127,"scale":3,"weight":-0.4000000059604645},[305,243],{"size":15,"scale":2,"weight":0.30000001192092896},[30,24],{"size":123,"scale":1,"weight":0.4000000059604645},[192,156],{"size":149,"scale":-1,"weight":-0.6000000238418579},[273,216],{"size":6,"scale":1,"weight":0.23000000417232513},[10,8],{"size":42,"scale":3,"weight":0.5600000023841858},[108,87],{"size":70,"scale":-1,"weight":0.5600000023841858},[141,114],{"size":177,"scale":1,"weight":-0.800000011920929},[253,201],{"size":50,"scale":3,"weight":-0.6000000238418579},[118,94],{"size":186,"scale":1,"weight":0},[280,227],{"size":92,"scale":2,"weight":-0.6000000238418579},[169,134],{"size":38,"scale":-1,"weight":0},[72,57],{"size":185,"scale":1,"weight":0.23000000417232513},[282,228],{"size":84,"scale":1,"weight":0.4000000059604645},[132,106],{"size":126,"scale":-1,"weight":-0.6000000238418579},[231,183],{"size":45,"scale":-1,"weight":0.6200000047683716},[93,75],{"size":47,"scale":2,"weight":0},[90,70],{"size":28,"scale":1,"weight":-0.4000000059604645},[42,34],{"size":74,"scale":1,"weight":-0.4000000059604645},[110,88],{"size":82,"scale":3,"weight":0.4000000059604645},[207,166],{"size":82,"scale":-1,"weight":-0.800000011920929},[149,119],{"size":104,"scale":3,"weight":0.6200000047683716},[272,219],{"size":145,"scale":1,"weight":0.5600000023841858},[230,187],{"size":11,"scale":3,"weight":0.6200000047683716},[29,23],{"size":24,"scale":2,"weight":-0.4000000059604645},[45,36],{"size":46,"scale":-1,"weight":0.5600000023841858},[93,75],{"size":164,"scale":2,"weight":0.5600000023841858},[331,268],{"size":41,"scale":2,"weight":0.6200000047683716},[84,68],{"size":180,"scale":-1,"weight":-0.800000011920929},[327,261],{"size":37,"scale":1,"weight":-0.6000000238418579},[53,43],{"size":122,"scale":2,"weight":0},[232,183],{"size":68,"scale":2,"weight":0},[130,102],{"size":123,"scale":3,"weight":-0.6000000238418579},[289,231],{"size":185,"scale":3,"weight":-0.6000000238418579},[435,347],{"size":38,"scale":1,"weight":-0.800000011920929},[55,43],{"size":130,"scale":1,"weight":0.4000000059604645},[203,165],{"size":110,"scale":-1,"weight":0.6200000047683716},[226,183],{"size":106,"scale":1,"weight":-0.6000000238418579},[153,121],{"size":199,"scale":2,"weight":0.30000001192092896},[388,313],{"size":162,"scale":3,"weight":0.30000001192092896},[403,324],{"size":109,"scale":2,"weight":0},[207,163],{"size":198,"scale":3,"weight":0},[481,386],{"size":62,"scale":3,"weight":-0.4000000059604645},[149,119],{"size":158,"scale":-1,"weight":-0.800000011920929},[287,230],{"size":70,"scale":2,"weight":0},[133,105],{"size":176,"scale":3,"weight":0.5600000023841858},[452,366],{"size":198,"scale":3,"weight":-0.4000000059604645},[474,378],{"size":105,"scale":1,"weight":-0.4000000059604645},[156,125],{"size":131,"scale":2,"weight":0.23000000417232513},[253,204],{"size":148,"scale":-1,"weight":-0.800000011920929},[269,215],{"size":86,"scale":1,"weight":0.30000001192092896},[133,108],{"size":152,"scale":3,"weight":-0.800000011920929},[356,285],{"size":4,"scale":1,"weight":0.23000000417232513},[7,6],{"size":62,"scale":2,"weight":-0.4000000059604645},[116,93],{"size":110,"scale":3,"weight":0.6200000047683716},[287,233],{"size":167,"scale":1,"weight":-0.4000000059604645},[247,199],{"size":80,"scale":2,"weight":0},[152,120],{"size":196,"scale":-1,"weight":0.5600000023841858},[395,319],{"size":109,"scale":1,"weight":0.5600000023841858},[174,141],{"size":116,"scale":1,"weight":0.6200000047683716},[188,152],{"size":193,"scale":-1,"weight":0},[367,288],{"size":178,"scale":2,"weight":0.23000000417232513},[343,277],{"size":139,"scale":3,"weight":0},[338,271],{"size":59,"scale":-1,"weight":0.4000000059604645},[117,94],{"size":28,"scale":2,"weight":-0.800000011920929},[51,41],{"size":55,"scale":1,"weight":0.23000000417232513},[84,69],{"size":30,"scale":3,"weight":-0.4000000059604645},[72,58],{"size":154,"scale":-1,"weight":-0.800000011920929},[280,224],{"size":47,"scale":3,"weight":0},[114,92],{"size":88,"scale":3,"weight":0},[214,172],{"size":3,"scale":3,"weight":0.5600000023841858},[8,7],{"size":146,"scale":-1,"weight":-0.6000000238418579},[268,211],{"size":143,"scale":2,"weight":0.4000000059604645},[283,229],{"size":140,"scale":1,"weight":0.5600000023841858},[223,180],{"size":145,"scale":3,"weight":-0.800000011920929},[340,273],{"size":62,"scale":2,"weight":0.5600000023841858},[126,102],{"size":183,"scale":1,"weight":0.30000001192092896},[282,228],{"size":156,"scale":3,"weight":0.4000000059604645},[394,317],{"size":17,"scale":-1,"weight":0.5600000023841858},[35,28],{"size":155,"scale":1,"weight":0.4000000059604645},[242,196],{"size":105,"scale":1,"weight":0.5600000023841858},[167,135],{"size":155,"scale":-1,"weight":-0.6000000238418579},[284,225],{"size":97,"scale":-1,"weight":-0.4000000059604645},[182,145],{"size":68,"scale":1,"weight":-0.4000000059604645},[101,81],{"size":62,"scale":1,"weight":-0.800000011920929},[89,70],{"size":71,"scale":-1,"weight":0.4000000059604645},[141,113],{"size":39,"scale":-1,"weight":0},[74,58],{"size":41,"scale":3,"weight":0.5600000023841858},[106,85],{"size":139,"scale":2,"weight":0.23000000417232513},[268,216],{"size":41,"scale":2,"weight":-0.800000011920929},[75,60],{"size":35,"scale":2,"weight":0},[67,53],{"size":10,"scale":-1,"weight":0.30000001192092896},[20,16],{"size":124,"scale":2,"weight":0.4000000059604645},[245,199],{"size":69,"scale":3,"weight":-0.4000000059604645},[166,132],{"size":58,"scale":3,"weight":0.6200000047683716},[151,123],{"size":196,"scale":1,"weight":0.5600000023841858},[312,253],{"size":131,"scale":2,"weight":-0.4000000059604645},[245,196],{"size":128,"scale":2,"weight":0.23000000417232513},[247,199],{"size":15,"scale":3,"weight":-0.6000000238418579},[36,28],{"size":39,"scale":1,"weight":0.4000000059604645},[61,49],{"size":87,"scale":3,"weight":0.5600000023841858},[223,181],{"size":30,"scale":2,"weight":0},[57,45],{"size":75,"scale":-1,"weight":-0.4000000059604645},[140,112],{"size":60,"scale":3,"weight":-0.800000011920929},[141,113],{"size":96,"scale":-1,"weight":0},[183,144],{"size":126,"scale":1,"weight":0.30000001192092896},[194,157],{"size":122,"scale":1,"weight":-0.4000000059604645},[181,145],{"size":131,"scale":-1,"weight":0.30000001192092896},[256,206],{"size":40,"scale":1,"weight":0.6200000047683716},[65,52],{"size":25,"scale":-1,"weight":0.6200000047683716},[52,42],{"size":44,"scale":3,"weight":-0.4000000059604645},[106,84],{"size":97,"scale":1,"weight":0},[146,118],{"size":145,"scale":1,"weight":0.6200000047683716},[235,190],{"size":13,"scale":3,"weight":0.5600000023841858},[34,28],{"size":66,"scale":-1,"weight":0.4000000059604645},[131,106],{"size":23,"scale":3,"weight":-0.800000011920929},[54,43],{"size":29,"scale":1,"weight":0.5600000023841858},[47,38],{"size":67,"scale":2,"weight":-0.800000011920929},[122,98],{"size":48,"scale":1,"weight":0.4000000059604645},[75,62],{"size":63,"scale":1,"weight":-0.6000000238418579},[91,73],{"size":57,"scale":2,"weight":0.4000000059604645},[113,91],{"size":94,"scale":3,"weight":-0.6000000238418579},[222,176],{"size":103,"scale":3,"weight":0.4000000059604645},[260,209],{"size":47,"scale":-1,"weight":-0.6000000238418579},[86,68],{"size":192,"scale":-1,"weight":0.23000000417232513},[370,298],{"size":112,"scale":3,"weight":0.5600000023841858},[288,233],{"size":93,"scale":1,"weight":0.5600000023841858},[148,120],{"size":86,"scale":2,"weight":0},[164,129],{"size":123,"scale":2,"weight":0},[234,184],{"size":25,"scale":3,"weight":0},[61,50],{"size":183,"scale":2,"weight":0.23000000417232513},[353,285],{"size":44,"scale":1,"weight":0.4000000059604645},[69,56],{"size":150,"scale":3,"weight":0},[364,293],{"size":45,"scale":3,"weight":0.23000000417232513},[111,89],{"size":116,"scale":-1,"weight":-0.800000011920929},[211,169],{"size":6,"scale":3,"weight":-0.4000000059604645},[15,12],{"size":59,"scale":3,"weight":0.6200000047683716},[155,125],{"size":186,"scale":-1,"weight":-0.6000000238418579},[341,269],{"size":182,"scale":1,"weight":-0.6000000238418579},[263,208],{"size":153,"scale":2,"weight":-0.4000000059604645},[286,229],{"size":80,"scale":-1,"weight":0.4000000059604645},[159,128],{"size":97,"scale":3,"weight":-0.6000000238418579},[229,182],{"size":174,"scale":-1,"weight":0.23000000417232513},[335,271],{"size":193,"scale":3,"weight":0.4000000059604645},[487,392],{"size":114,"scale":-1,"weight":0.30000001192092896},[222,180],{"size":129,"scale":1,"weight":-0.6000000238418579},[186,148],{"size":17,"scale":1,"weight":0.4000000059604645},[27,22],{"size":62,"scale":3,"weight":0.6200000047683716},[162,131],{"size":73,"scale":3,"weight":-0.6000000238418579},[172,137],{"size":184,"scale":2,"weight":-0.6000000238418579},[338,267],{"size":35,"scale":3,"weight":0.6200000047683716},[91,74],{"size":173,"scale":-1,"weight":0},[329,259],{"size":50,"scale":1,"weight":0.23000000417232513},[76,62],{"size":138,"scale":1,"weight":0},[208,169],{"size":61,"scale":2,"weight":0.30000001192092896},[119,97],{"size":134,"scale":1,"weight":0.6200000047683716},[217,175],{"size":192,"scale":1,"weight":-0.6000000238418579},[277,219],{"size":190,"scale":3,"weight":0.30000001192092896},[472,381],{"size":33,"scale":1,"weight":0.6200000047683716},[54,44],{"size":186,"scale":-1,"weight":0},[353,278],{"size":175,"scale":1,"weight":0.4000000059604645},[274,221],{"size":65,"scale":1,"weight":0},[98,80],{"size":84,"scale":3,"weight":-0.4000000059604645},[202,161],{"size":125,"scale":2,"weight":0.30000001192092896},[244,197],{"size":180,"scale":2,"weight":0.6200000047683716},[370,299],{"size":40,"scale":-1,"weight":-0.6000000238418579},[74,58],{"size":149,"scale":3,"weight":0.4000000059604645},[376,303],{"size":144,"scale":2,"weight":-0.4000000059604645},[270,215],{"size":78,"scale":1,"weight":0.5600000023841858},[125,101],{"size":83,"scale":3,"weight":-0.4000000059604645},[199,159],{"size":189,"scale":3,"weight":0.5600000023841858},[486,393],{"size":65,"scale":2,"weight":0.30000001192092896},[127,102],{"size":107,"scale":-1,"weight":0.5600000023841858},[216,175],{"size":57,"scale":-1,"weight":-0.6000000238418579},[105,83],{"size":160,"scale":2,"weight":0.4000000059604645},[317,256],{"size":181,"scale":3,"weight":0.23000000417232513},[445,358],{"size":132,"scale":3,"weight":0.4000000059604645},[333,269],{"size":94,"scale":1,"weight":0.30000001192092896},[145,118],{"size":4,"scale":1,"weight":0.5600000023841858},[7,6],{"size":157,"scale":1,"weight":-0.4000000059604645},[233,186],{"size":36,"scale":1,"weight":0.5600000023841858},[58,47],{"size":133,"scale":2,"weight":-0.800000011920929},[242,193],{"size":199,"scale":1,"weight":0.5600000023841858},[316,256],{"size":27,"scale":-1,"weight":0.4000000059604645},[54,44],{"size":87,"scale":3,"weight":0.30000001192092896},[217,175],{"size":46,"scale":3,"weight":-0.800000011920929},[108,86],{"size":78,"scale":1,"weight":-0.800000011920929},[112,89],{"size":78,"scale":2,"weight":-0.4000000059604645},[146,117],{"size":26,"scale":2,"weight":0.6200000047683716},[53,44],{"size":124,"scale":3,"weight":-0.4000000059604645},[297,237],{"size":177,"scale":1,"weight":-0.6000000238418579},[256,202],{"size":200,"scale":-1,"weight":0.23000000417232513},[386,311],{"size":60,"scale":-1,"weight":0.30000001192092896},[118,94],{"size":140,"scale":2,"weight":0.6200000047683716},[287,232],{"size":29,"scale":2,"weight":0},[55,44],{"size":95,"scale":1,"weight":-0.6000000238418579},[137,109],{"size":47,"scale":3,"weight":0.6200000047683716},[123,100],{"size":155,"scale":3,"weight":0.5600000023841858},[399,322],{"size":184,"scale":2,"weight":0.6200000047683716},[378,305],{"size":54,"scale":3,"weight":-0.800000011920929},[127,102],{"size":193,"scale":3,"weight":-0.4000000059604645},[462,368],{"size":85,"scale":-1,"weight":-0.6000000238418579},[156,124],{"size":116,"scale":3,"weight":0.30000001192092896},[289,232],{"size":168,"scale":3,"weight":0.23000000417232513},[414,333],{"size":2,"scale":3,"weight":0.30000001192092896},[6,4],{"size":145,"scale":2,"weight":-0.6000000238418579},[266,210],{"size":93,"scale":2,"weight":-0.6000000238418579},[171,135],{"size":22,"scale":2,"weight":0.30000001192092896},[44,35],{"size":37,"scale":-1,"weight":0.5600000023841858},[75,60],{"size":155,"scale":-1,"weight":0.30000001192092896},[302,244],{"size":20,"scale":2,"weight":0.23000000417232513},[39,31],{"size":86,"scale":2,"weight":0.30000001192092896},[168,136],{"size":74,"scale":2,"weight":-0.4000000059604645},[139,111],{"size":98,"scale":2,"weight":-0.6000000238418579},[180,142],{"size":138,"scale":3,"weight":0.4000000059604645},[348,281],{"size":3,"scale":2,"weight":0.6200000047683716},[7,6],{"size":14,"scale":1,"weight":-0.800000011920929},[21,16],{"size":152,"scale":2,"weight":0.4000000059604645},[301,243],{"size":31,"scale":1,"weight":0.4000000059604645},[49,39],{"size":61,"scale":-1,"weight":0.23000000417232513},[118,96],{"size":178,"scale":2,"weight":0.5600000023841858},[359,290],{"size":93,"scale":-1,"weight":0.23000000417232513},[180,145],{"size":37,"scale":2,"weight":0.30000001192092896},[73,58],{"size":163,"scale":1,"weight":-0.6000000238418579},[235,186],{"size":28,"scale":1,"weight":0.4000000059604645},[45,36],{"size":40,"scale":2,"weight":-0.4000000059604645},[76,60],{"size":177,"scale":-1,"weight":-0.800000011920929},[322,257],{"size":9,"scale":1,"weight":0.4000000059604645},[14,12],{"size":35,"scale":1,"weight":0.23000000417232513},[54,44],{"size":110,"scale":-1,"weight":-0.4000000059604645},[206,165],{"size":3,"scale":-1,"weight":0.6200000047683716},[7,6],{"size":157,"scale":2,"weight":0.23000000417232513},[303,244],{"size":68,"scale":3,"weight":0.4000000059604645},[172,138],{"size":27,"scale":1,"weight":0.30000001192092896},[42,34],{"size":140,"scale":2,"weight":0.30000001192092896},[273,220],{"size":30,"scale":-1,"weight":0.23000000417232513},[58,47],{"size":185,"scale":2,"weight":0},[352,277],{"size":62,"scale":3,"weight":0.5600000023841858},[160,129],{"size":171,"scale":1,"weight":0.23000000417232513},[260,211],{"size":90,"scale":-1,"weight":0.4000000059604645},[178,144],{"size":183,"scale":3,"weight":-0.4000000059604645},[439,349],{"size":129,"scale":1,"weight":0.5600000023841858},[206,167],{"size":42,"scale":3,"weight":0.23000000417232513},[104,83],{"size":170,"scale":2,"weight":-0.6000000238418579},[312,247],{"size":112,"scale":3,"weight":0.30000001192092896},[279,224],{"size":24,"scale":-1,"weight":-0.800000011920929},[44,35],{"size":55,"scale":3,"weight":0.6200000047683716},[144,116],{"size":164,"scale":1,"weight":0.4000000059604645},[256,207],{"size":69,"scale":-1,"weight":-0.4000000059604645},[129,104],{"size":87,"scale":3,"weight":0.6200000047683716},[227,184],{"size":123,"scale":-1,"weight":0.5600000023841858},[248,200],{"size":56,"scale":2,"weight":0.23000000417232513},[108,88],{"size":174,"scale":-1,"weight":-0.4000000059604645},[326,260],{"size":68,"scale":-1,"weight":0.30000001192092896},[132,107],{"size":97,"scale":2,"weight":0.4000000059604645},[192,155],{"size":159,"scale":3,"weight":-0.4000000059604645},[381,303],{"size":197,"scale":1,"weight":0},[296,240],{"size":144,"scale":1,"weight":-0.800000011920929},[206,164],{"size":177,"scale":3,"weight":-0.800000011920929},[415,332],{"size":69,"scale":-1,"weight":-0.6000000238418579},[127,100],{"size":190,"scale":1,"weight":0.6200000047683716},[307,249],{"size":46,"scale":-1,"weight":-0.6000000238418579},[85,67],{"size":125,"scale":1,"weight":0.23000000417232513},[191,155],{"size":63,"scale":-1,"weight":0.5600000023841858},[127,103],{"size":94,"scale":2,"weight":-0.4000000059604645},[176,141],{"size":51,"scale":1,"weight":0.23000000417232513},[78,63],{"size":121,"scale":2,"weight":-0.6000000238418579},[222,175],{"size":7,"scale":1,"weight":-0.4000000059604645},[11,9],{"size":17,"scale":3,"weight":0.30000001192092896},[43,35],{"size":16,"scale":1,"weight":0.4000000059604645},[26,21],{"size":162,"scale":-1,"weight":0.5600000023841858},[327,264],{"size":31,"scale":-1,"weight":-0.4000000059604645},[59,46],{"size":4,"scale":2,"weight":0},[8,7],{"size":175,"scale":3,"weight":-0.6000000238418579},[412,327],{"size":129,"scale":3,"weight":0.30000001192092896},[321,258],{"size":167,"scale":-1,"weight":0.23000000417232513},[322,260],{"size":55,"scale":2,"weight":0.30000001192092896},[108,87],{"size":141,"scale":1,"weight":0.23000000417232513},[215,174],{"size":12,"scale":3,"weight":-0.6000000238418579},[29,23],{"size":109,"scale":1,"weight":0.6200000047683716},[176,143],{"size":105,"scale":3,"weight":-0.800000011920929},[246,198],{"size":13,"scale":-1,"weight":0.5600000023841858},[27,21],{"size":89,"scale":3,"weight":-0.800000011920929},[209,167],{"size":59,"scale":3,"weight":-0.6000000238418579},[139,111],{"size":59,"scale":1,"weight":0.30000001192092896},[91,74],{"size":22,"scale":-1,"weight":-0.4000000059604645},[42,34],{"size":101,"scale":3,"weight":0.30000001192092896},[252,203],{"size":130,"scale":3,"weight":0.23000000417232513},[320,257],{"size":4,"scale":1,"weight":0.30000001192092896},[7,6],{"size":164,"scale":-1,"weight":-0.800000011920929},[298,239],{"size":101,"scale":3,"weight":0.23000000417232513},[249,200],{"size":5,"scale":3,"weight":-0.4000000059604645},[13,10],{"size":131,"scale":2,"weight":0},[249,196],{"size":5,"scale":1,"weight":0},[8,7],{"size":132,"scale":1,"weight":0.4000000059604645},[207,167],{"size":176,"scale":3,"weight":0.30000001192092896},[438,353],{"size":156,"scale":2,"weight":-0.4000000059604645},[292,233],{"size":157,"scale":1,"weight":0.23000000417232513},[239,194],{"size":27,"scale":2,"weight":-0.800000011920929},[50,40],{"size":50,"scale":-1,"weight":0.23000000417232513},[97,78],{"size":9,"scale":2,"weight":0.5600000023841858},[19,16],{"size":23,"scale":1,"weight":0},[35,28],{"size":143,"scale":2,"weight":0.30000001192092896},[278,225],{"size":193,"scale":2,"weight":0.4000000059604645},[381,309],{"size":83,"scale":-1,"weight":0.4000000059604645},[164,132],{"size":30,"scale":3,"weight":0.23000000417232513},[74,60],{"size":182,"scale":2,"weight":-0.800000011920929},[330,265],{"size":63,"scale":2,"weight":0.6200000047683716},[130,105],{"size":102,"scale":-1,"weight":0},[194,153],{"size":199,"scale":-1,"weight":0.6200000047683716},[408,331],{"size":191,"scale":-1,"weight":0.30000001192092896},[372,300],{"size":34,"scale":3,"weight":-0.6000000238418579},[81,64],{"size":97,"scale":2,"weight":0.30000001192092896},[190,153],{"size":37,"scale":3,"weight":0.6200000047683716},[97,78],{"size":56,"scale":3,"weight":0.4000000059604645},[141,115],{"size":171,"scale":-1,"weight":0.30000001192092896},[333,269],{"size":135,"scale":3,"weight":0.6200000047683716},[352,285],{"size":12,"scale":2,"weight":0.4000000059604645},[25,20],{"size":33,"scale":-1,"weight":-0.800000011920929},[60,49],{"size":2,"scale":3,"weight":0.4000000059604645},[6,4],{"size":118,"scale":2,"weight":-0.6000000238418579},[216,172],{"size":181,"scale":-1,"weight":0.5600000023841858},[365,296],{"size":87,"scale":-1,"weight":-0.4000000059604645},[163,130],{"size":14,"scale":2,"weight":0.23000000417232513},[27,22],{"size":51,"scale":-1,"weight":0.30000001192092896},[100,81],{"size":8,"scale":2,"weight":-0.4000000059604645},[16,12],{"size":81,"scale":-1,"weight":0.23000000417232513},[156,126],{"size":116,"scale":3,"weight":0.4000000059604645},[293,236],{"size":60,"scale":3,"weight":0.4000000059604645},[151,123],{"size":163,"scale":3,"weight":-0.6000000238418579},[384,306],{"size":195,"scale":-1,"weight":0.4000000059604645},[385,311],{"size":117,"scale":-1,"weight":0},[222,175],{"size":40,"scale":1,"weight":0.4000000059604645},[63,51],{"size":27,"scale":3,"weight":-0.6000000238418579},[64,51],{"size":104,"scale":1,"weight":-0.4000000059604645},[154,124],{"size":112,"scale":2,"weight":0.4000000059604645},[222,180],{"size":151,"scale":1,"weight":0.6200000047683716},[244,198],{"size":31,"scale":1,"weight":0},[47,38],{"size":9,"scale":1,"weight":-0.800000011920929},[14,10],{"size":85,"scale":2,"weight":-0.800000011920929},[155,124],{"size":66,"scale":2,"weight":0.5600000023841858},[134,108],{"size":156,"scale":3,"weight":0.30000001192092896},[388,312],{"size":64,"scale":3,"weight":0.5600000023841858},[165,133],{"size":60,"scale":2,"weight":-0.800000011920929},[109,87],{"size":176,"scale":2,"weight":0.6200000047683716},[361,293],{"size":148,"scale":-1,"weight":0.4000000059604645},[293,237],{"size":57,"scale":1,"weight":0.23000000417232513},[87,71],{"size":164,"scale":-1,"weight":0.5600000023841858},[331,268],{"size":162,"scale":-1,"weight":0},[308,242],{"size":109,"scale":-1,"weight":-0.4000000059604645},[204,163],{"size":62,"scale":3,"weight":-0.6000000238418579},[147,116],{"size":197,"scale":2,"weight":0.23000000417232513},[380,306],{"size":53,"scale":1,"weight":0.6200000047683716},[86,69],{"size":155,"scale":1,"weight":0.5600000023841858},[247,200],{"size":62,"scale":1,"weight":0.4000000059604645},[97,78],{"size":96,"scale":2,"weight":0.4000000059604645},[190,154],{"size":189,"scale":1,"weight":0},[285,231],{"size":187,"scale":1,"weight":0.6200000047683716},[303,245],{"size":177,"scale":2,"weight":0.4000000059604645},[350,283],{"size":66,"scale":3,"weight":-0.800000011920929},[155,124],{"size":156,"scale":2,"weight":0.4000000059604645},[309,249],{"size":98,"scale":-1,"weight":0.23000000417232513},[189,153],{"size":139,"scale":-1,"weight":-0.800000011920929},[253,202],{"size":161,"scale":1,"weight":-0.4000000059604645},[238,191],{"size":163,"scale":1,"weight":-0.800000011920929},[233,185],{"size":47,"scale":3,"weight":-0.6000000238418579},[111,89],{"size":138,"scale":2,"weight":0.6200000047683716},[283,229],{"size":159,"scale":-1,"weight":0.4000000059604645},[314,254],{"size":178,"scale":3,"weight":0.30000001192092896},[443,356],{"size":10,"scale":2,"weight":-0.800000011920929},[18,15],{"size":31,"scale":3,"weight":-0.6000000238418579},[74,58],{"size":169,"scale":1,"weight":0.4000000059604645},[264,214],{"size":142,"scale":2,"weight":0},[270,212],{"size":110,"scale":3,"weight":-0.800000011920929},[258,207],{"size":191,"scale":3,"weight":-0.800000011920929},[447,358],{"size":127,"scale":2,"weight":0.6200000047683716},[261,211],{"size":184,"scale":-1,"weight":-0.800000011920929},[334,267],{"size":178,"scale":3,"weight":0.4000000059604645},[449,362],{"size":101,"scale":1,"weight":-0.6000000238418579},[146,116],{"size":41,"scale":-1,"weight":0},[78,62],{"size":23,"scale":1,"weight":-0.6000000238418579},[34,27],{"size":98,"scale":2,"weight":0.4000000059604645},[194,157],{"size":135,"scale":3,"weight":-0.800000011920929},[316,253],{"size":159,"scale":2,"weight":0.6200000047683716},[326,264],{"size":165,"scale":3,"weight":0.4000000059604645},[416,335],{"size":17,"scale":3,"weight":0},[42,34],{"size":12,"scale":1,"weight":0},[19,15],{"size":21,"scale":2,"weight":0},[41,32],{"size":60,"scale":3,"weight":0.6200000047683716},[157,128],{"size":178,"scale":-1,"weight":-0.4000000059604645},[333,266],{"size":76,"scale":1,"weight":0.6200000047683716},[123,99],{"size":34,"scale":-1,"weight":-0.6000000238418579},[63,50],{"size":99,"scale":1,"weight":-0.6000000238418579},[143,114],{"size":31,"scale":1,"weight":0.6200000047683716},[51,41],{"size":160,"scale":-1,"weight":0.30000001192092896},[312,252],{"size":29,"scale":3,"weight":0.4000000059604645},[74,60],{"size":113,"scale":3,"weight":-0.800000011920929},[265,212],{"size":34,"scale":-1,"weight":0.23000000417232513},[66,53],{"size":121,"scale":-1,"weight":-0.800000011920929},[220,176],{"size":37,"scale":1,"weight":0.30000001192092896},[57,47],{"size":43,"scale":-1,"weight":-0.800000011920929},[79,63],{"size":20,"scale":1,"weight":0.6200000047683716},[33,27],{"size":71,"scale":3,"weight":0.5600000023841858},[183,148],{"size":154,"scale":2,"weight":0.5600000023841858},[311,251],{"size":82,"scale":2,"weight":0.5600000023841858},[166,134],{"size":52,"scale":2,"weight":-0.6000000238418579},[96,76],{"size":100,"scale":-1,"weight":0.30000001192092896},[195,157],{"size":65,"scale":2,"weight":-0.6000000238418579},[119,94],{"size":191,"scale":3,"weight":0.4000000059604645},[481,388],{"size":163,"scale":-1,"weight":-0.6000000238418579},[299,236],{"size":16,"scale":2,"weight":-0.800000011920929},[30,24],{"size":12,"scale":-1,"weight":0.4000000059604645},[25,20],{"size":149,"scale":1,"weight":-0.6000000238418579},[216,170],{"size":171,"scale":3,"weight":0.6200000047683716},[446,362],{"size":23,"scale":1,"weight":-0.800000011920929},[33,26],{"size":135,"scale":-1,"weight":0.4000000059604645},[267,216],{"size":108,"scale":2,"weight":0.4000000059604645},[214,173],{"size":34,"scale":2,"weight":0.4000000059604645},[67,55],{"size":140,"scale":1,"weight":0.30000001192092896},[216,175],{"size":141,"scale":2,"weight":-0.4000000059604645},[264,212],{"size":25,"scale":1,"weight":0.23000000417232513},[38,31],{"size":147,"scale":1,"weight":0.6200000047683716},[238,192],{"size":132,"scale":-1,"weight":-0.6000000238418579},[242,191],{"size":94,"scale":-1,"weight":-0.800000011920929},[171,136],{"size":163,"scale":-1,"weight":0.4000000059604645},[322,260],{"size":161,"scale":3,"weight":0.30000001192092896},[400,322],{"size":129,"scale":1,"weight":0.4000000059604645},[201,164],{"size":6,"scale":1,"weight":0.30000001192092896},[10,8],{"size":194,"scale":3,"weight":0.30000001192092896},[483,389],{"size":64,"scale":2,"weight":0.30000001192092896},[125,101],{"size":153,"scale":2,"weight":0},[291,229],{"size":11,"scale":1,"weight":-0.800000011920929},[16,13],{"size":32,"scale":3,"weight":-0.800000011920929},[75,60],{"size":127,"scale":-1,"weight":-0.800000011920929},[231,185],{"size":194,"scale":2,"weight":0.6200000047683716},[398,322],{"size":140,"scale":3,"weight":0.23000000417232513},[345,278],{"size":190,"scale":3,"weight":0.6200000047683716},[496,401],{"size":112,"scale":1,"weight":0.4000000059604645},[175,142],{"size":159,"scale":3,"weight":0.6200000047683716},[415,336],{"size":189,"scale":-1,"weight":-0.6000000238418579},[347,274],{"size":186,"scale":2,"weight":0},[353,278],{"size":94,"scale":-1,"weight":0.5600000023841858},[189,153],{"size":106,"scale":1,"weight":0.6200000047683716},[172,138],{"size":74,"scale":1,"weight":0.30000001192092896},[114,93],{"size":115,"scale":1,"weight":0.4000000059604645},[180,146],{"size":27,"scale":3,"weight":0},[66,53],{"size":188,"scale":3,"weight":-0.4000000059604645},[450,358],{"size":91,"scale":-1,"weight":-0.6000000238418579},[167,132],{"size":117,"scale":2,"weight":0.4000000059604645},[232,187],{"size":23,"scale":-1,"weight":0.23000000417232513},[45,36],{"size":50,"scale":3,"weight":0.6200000047683716},[131,106],{"size":194,"scale":1,"weight":0.5600000023841858},[308,250],{"size":198,"scale":2,"weight":0.30000001192092896},[386,312],{"size":168,"scale":2,"weight":0.5600000023841858},[339,274],{"size":30,"scale":1,"weight":0.4000000059604645},[47,38],{"size":116,"scale":1,"weight":0},[175,142],{"size":141,"scale":3,"weight":0.30000001192092896},[351,283],{"size":178,"scale":2,"weight":-0.4000000059604645},[333,266],{"size":84,"scale":2,"weight":0.4000000059604645},[167,135],{"size":119,"scale":2,"weight":0.4000000059604645},[235,190],{"size":11,"scale":1,"weight":0},[17,14],{"size":67,"scale":3,"weight":0},[163,131],{"size":65,"scale":-1,"weight":0.30000001192092896},[127,102],{"size":139,"scale":2,"weight":0},[264,208],{"size":81,"scale":2,"weight":0.5600000023841858},[164,132],{"size":166,"scale":1,"weight":0.5600000023841858},[264,214],{"size":20,"scale":1,"weight":0.4000000059604645},[31,26],{"size":175,"scale":-1,"weight":-0.4000000059604645},[327,262],{"size":146,"scale":2,"weight":0.4000000059604645},[289,233],{"size":2,"scale":1,"weight":0},[3,3],{"size":66,"scale":3,"weight":0},[161,129],{"size":191,"scale":1,"weight":0.30000001192092896},[294,238],{"size":5,"scale":-1,"weight":0},[10,8],{"size":83,"scale":2,"weight":0},[158,124],{"size":114,"scale":-1,"weight":-0.800000011920929},[207,166],{"size":175,"scale":3,"weight":-0.4000000059604645},[419,333],{"size":10,"scale":3,"weight":0.5600000023841858},[26,21],{"size":161,"scale":1,"weight":-0.800000011920929},[230,183],{"size":33,"scale":-1,"weight":-0.4000000059604645},[62,50],{"size":57,"scale":2,"weight":-0.800000011920929},[104,83],{"size":119,"scale":3,"weight":-0.800000011920929},[279,224],{"size":49,"scale":2,"weight":0.5600000023841858},[99,81],{"size":23,"scale":2,"weight":0.30000001192092896},[45,37],{"size":33,"scale":2,"weight":-0.800000011920929},[60,49],{"size":85,"scale":1,"weight":-0.800000011920929},[122,97],{"size":112,"scale":1,"weight":-0.4000000059604645},[166,133],{"size":116,"scale":3,"weight":0.6200000047683716},[303,245],{"size":65,"scale":1,"weight":-0.4000000059604645},[96,78],{"size":80,"scale":3,"weight":0.4000000059604645},[202,163],{"size":36,"scale":3,"weight":0.4000000059604645},[91,73],{"size":30,"scale":1,"weight":-0.6000000238418579},[44,35],{"size":137,"scale":2,"weight":0.4000000059604645},[271,219],{"size":120,"scale":-1,"weight":-0.800000011920929},[218,175],{"size":138,"scale":2,"weight":0.4000000059604645},[273,220],{"size":121,"scale":2,"weight":-0.800000011920929},[220,176],{"size":39,"scale":2,"weight":-0.800000011920929},[72,57],{"size":136,"scale":3,"weight":0.5600000023841858},[350,283],{"size":65,"scale":3,"weight":0.4000000059604645},[164,133],{"size":109,"scale":-1,"weight":-0.800000011920929},[198,159],{"size":47,"scale":2,"weight":0.5600000023841858},[95,77],{"size":76,"scale":2,"weight":0.23000000417232513},[147,118],{"size":50,"scale":-1,"weight":-0.6000000238418579},[92,73],{"size":29,"scale":2,"weight":-0.800000011920929},[53,43],{"size":59,"scale":2,"weight":-0.6000000238418579},[108,86],{"size":119,"scale":1,"weight":-0.800000011920929},[170,135],{"size":107,"scale":3,"weight":-0.800000011920929},[250,201],{"size":150,"scale":1,"weight":-0.6000000238418579},[217,172],{"size":39,"scale":2,"weight":-0.4000000059604645},[73,59],{"size":103,"scale":2,"weight":0.23000000417232513},[199,161],{"size":15,"scale":-1,"weight":0},[29,23],{"size":131,"scale":2,"weight":0.4000000059604645},[259,210],{"size":109,"scale":1,"weight":-0.4000000059604645},[161,130],{"size":14,"scale":-1,"weight":-0.6000000238418579},[26,20],{"size":62,"scale":3,"weight":0},[151,121],{"size":27,"scale":2,"weight":0.6200000047683716},[56,46],{"size":168,"scale":1,"weight":0.4000000059604645},[262,213],{"size":157,"scale":3,"weight":0},[381,306],{"size":168,"scale":-1,"weight":0.23000000417232513},[324,261],{"size":195,"scale":2,"weight":0.23000000417232513},[376,303],{"size":170,"scale":1,"weight":0.30000001192092896},[262,212],{"size":98,"scale":3,"weight":0.6200000047683716},[256,207],{"size":193,"scale":-1,"weight":0.23000000417232513},[372,301],{"size":181,"scale":-1,"weight":-0.4000000059604645},[339,271],{"size":21,"scale":-1,"weight":0.6200000047683716},[43,36],{"size":60,"scale":-1,"weight":0.4000000059604645},[119,96],{"size":11,"scale":-1,"weight":0},[21,17],{"size":40,"scale":1,"weight":-0.4000000059604645},[60,47],{"size":151,"scale":1,"weight":-0.800000011920929},[215,172],{"size":15,"scale":1,"weight":0},[24,19],{"size":197,"scale":-1,"weight":0.6200000047683716},[404,327],{"size":162,"scale":1,"weight":0.23000000417232513},[247,200],{"size":136,"scale":2,"weight":0.4000000059604645},[269,218],{"size":151,"scale":2,"weight":0.30000001192092896},[294,237],{"size":84,"scale":1,"weight":0.5600000023841858},[134,108],{"size":116,"scale":-1,"weight":0},[221,174],{"size":184,"scale":1,"weight":-0.4000000059604645},[272,218],{"size":110,"scale":2,"weight":0.4000000059604645},[218,176],{"size":1,"scale":-1,"weight":0.4000000059604645},[2,2],{"size":163,"scale":3,"weight":-0.4000000059604645},[391,311],{"size":79,"scale":3,"weight":0},[192,154],{"size":192,"scale":-1,"weight":0.4000000059604645},[379,306],{"size":8,"scale":3,"weight":-0.6000000238418579},[20,16],{"size":174,"scale":1,"weight":0.5600000023841858},[277,224],{"size":63,"scale":2,"weight":0.30000001192092896},[123,100],{"size":147,"scale":2,"weight":-0.800000011920929},[268,214],{"size":126,"scale":1,"weight":0},[190,154],{"size":21,"scale":-1,"weight":0.4000000059604645},[42,34],{"size":193,"scale":2,"weight":-0.6000000238418579},[354,280],{"size":177,"scale":2,"weight":0.30000001192092896},[345,279],{"size":147,"scale":3,"weight":0.23000000417232513},[362,291],{"size":44,"scale":3,"weight":0.30000001192092896},[110,89],{"size":64,"scale":1,"weight":-0.4000000059604645},[95,77],{"size":116,"scale":1,"weight":0.30000001192092896},[179,145],{"size":37,"scale":2,"weight":0.5600000023841858},[75,60],{"size":156,"scale":2,"weight":0.30000001192092896},[304,245],{"size":83,"scale":3,"weight":0.5600000023841858},[213,173],{"size":19,"scale":2,"weight":-0.6000000238418579},[35,28],{"size":187,"scale":-1,"weight":-0.6000000238418579},[343,271],{"size":135,"scale":1,"weight":0.5600000023841858},[215,174],{"size":16,"scale":1,"weight":-0.4000000059604645},[24,19],{"size":154,"scale":2,"weight":0.4000000059604645},[304,246],{"size":114,"scale":1,"weight":0.23000000417232513},[174,142],{"size":15,"scale":2,"weight":0.5600000023841858},[31,25],{"size":191,"scale":3,"weight":-0.4000000059604645},[458,364],{"size":21,"scale":-1,"weight":0.30000001192092896},[41,34],{"size":63,"scale":2,"weight":0.5600000023841858},[127,103],{"size":31,"scale":3,"weight":0.23000000417232513},[77,62],{"size":198,"scale":2,"weight":-0.800000011920929},[359,288],{"size":149,"scale":2,"weight":0.30000001192092896},[291,235],{"size":100,"scale":2,"weight":-0.6000000238418579},[183,145],{"size":104,"scale":2,"weight":0.6200000047683716},[213,173],{"size":2,"scale":1,"weight":0.23000000417232513},[3,3],{"size":8,"scale":-1,"weight":0.5600000023841858},[17,13],{"size":26,"scale":1,"weight":0.30000001192092896},[40,33],{"size":18,"scale":-1,"weight":0.5600000023841858},[37,30],{"size":56,"scale":-1,"weight":-0.800000011920929},[102,82],{"size":176,"scale":1,"weight":-0.800000011920929},[252,200],{"size":111,"scale":3,"weight":0.5600000023841858},[286,231],{"size":23,"scale":2,"weight":0.4000000059604645},[46,37],{"size":39,"scale":3,"weight":0.30000001192092896},[98,79],{"size":180,"scale":3,"weight":-0.6000000238418579},[424,337],{"size":138,"scale":1,"weight":-0.6000000238418579},[200,158],{"size":166,"scale":-1,"weight":0.4000000059604645},[328,265],{"size":26,"scale":1,"weight":0.6200000047683716},[42,35],{"size":38,"scale":1,"weight":0},[57,47],{"size":149,"scale":2,"weight":0.4000000059604645},[294,238],{"size":87,"scale":2,"weight":0.23000000417232513},[168,136],{"size":166,"scale":2,"weight":-0.800000011920929},[301,241],{"size":120,"scale":1,"weight":-0.6000000238418579},[174,137],{"size":74,"scale":2,"weight":0.5600000023841858},[149,121],{"size":107,"scale":-1,"weight":-0.800000011920929},[195,156],{"size":118,"scale":-1,"weight":0.4000000059604645},[234,189],{"size":186,"scale":3,"weight":0.6200000047683716},[485,393],{"size":107,"scale":3,"weight":-0.6000000238418579},[252,200],{"size":65,"scale":2,"weight":-0.4000000059604645},[122,97],{"size":5,"scale":3,"weight":0.5600000023841858},[13,11],{"size":78,"scale":-1,"weight":0},[149,117],{"size":52,"scale":-1,"weight":0},[99,78],{"size":24,"scale":1,"weight":0},[37,29],{"size":129,"scale":1,"weight":-0.800000011920929},[184,147],{"size":140,"scale":-1,"weight":-0.4000000059604645},[262,209],{"size":130,"scale":2,"weight":-0.4000000059604645},[243,195],{"size":187,"scale":3,"weight":0.23000000417232513},[460,370],{"size":91,"scale":-1,"weight":0.5600000023841858},[184,149],{"size":34,"scale":2,"weight":0.23000000417232513},[66,53],{"size":81,"scale":2,"weight":-0.6000000238418579},[149,118],{"size":172,"scale":-1,"weight":-0.4000000059604645},[322,257],{"size":35,"scale":-1,"weight":-0.800000011920929},[64,51],{"size":165,"scale":3,"weight":0.30000001192092896},[411,330],{"size":60,"scale":1,"weight":0.30000001192092896},[93,75],{"size":178,"scale":3,"weight":-0.4000000059604645},[427,339],{"size":158,"scale":1,"weight":0},[238,193],{"size":21,"scale":3,"weight":0.4000000059604645},[54,43],{"size":3,"scale":-1,"weight":-0.4000000059604645},[6,5],{"size":182,"scale":3,"weight":0.30000001192092896},[453,364],{"size":48,"scale":3,"weight":-0.6000000238418579},[114,90],{"size":99,"scale":2,"weight":-0.800000011920929},[180,144],{"size":184,"scale":3,"weight":-0.800000011920929},[431,345],{"size":18,"scale":1,"weight":-0.6000000238418579},[27,21],{"size":199,"scale":-1,"weight":0.23000000417232513},[384,310],{"size":137,"scale":-1,"weight":0.23000000417232513},[264,213],{"size":196,"scale":1,"weight":0},[295,239],{"size":55,"scale":-1,"weight":-0.800000011920929},[101,81],{"size":191,"scale":1,"weight":0.4000000059604645},[298,241],{"size":154,"scale":2,"weight":-0.6000000238418579},[282,223],{"size":42,"scale":3,"weight":-0.4000000059604645},[101,80],{"size":24,"scale":3,"weight":0.30000001192092896},[61,48],{"size":111,"scale":-1,"weight":0.6200000047683716},[228,184],{"size":171,"scale":1,"weight":0.6200000047683716},[276,223],{"size":180,"scale":2,"weight":0.30000001192092896},[351,283],{"size":166,"scale":-1,"weight":0.5600000023841858},[334,271],{"size":186,"scale":1,"weight":0.23000000417232513},[284,230],{"size":91,"scale":2,"weight":0.23000000417232513},[175,142],{"size":139,"scale":1,"weight":-0.4000000059604645},[206,165],{"size":89,"scale":-1,"weight":0},[169,133],{"size":18,"scale":2,"weight":-0.800000011920929},[33,26],{"size":176,"scale":-1,"weight":-0.6000000238418579},[323,255],{"size":79,"scale":3,"weight":0.5600000023841858},[203,165],{"size":171,"scale":2,"weight":-0.800000011920929},[311,249],{"size":72,"scale":3,"weight":0.23000000417232513},[178,143],{"size":77,"scale":-1,"weight":0.23000000417232513},[148,120],{"size":105,"scale":1,"weight":0},[159,128],{"size":45,"scale":3,"weight":0},[110,88],{"size":149,"scale":2,"weight":0},[283,223],{"size":127,"scale":2,"weight":0.30000001192092896},[248,200],{"size":69,"scale":3,"weight":-0.6000000238418579},[163,130],{"size":10,"scale":3,"weight":0.23000000417232513},[25,20],{"size":81,"scale":1,"weight":0.23000000417232513},[123,100],{"size":44,"scale":1,"weight":-0.4000000059604645},[65,53],{"size":64,"scale":-1,"weight":0.6200000047683716},[132,106],{"size":106,"scale":2,"weight":-0.800000011920929},[193,154],{"size":46,"scale":-1,"weight":0.6200000047683716},[94,77],{"size":90,"scale":1,"weight":-0.800000011920929},[129,102],{"size":49,"scale":2,"weight":0.6200000047683716},[101,82],{"size":110,"scale":1,"weight":-0.6000000238418579},[159,126],{"size":49,"scale":3,"weight":0.4000000059604645},[124,100],{"size":16,"scale":2,"weight":0.4000000059604645},[32,26],{"size":147,"scale":1,"weight":-0.6000000238418579},[213,168],{"size":37,"scale":-1,"weight":-0.6000000238418579},[68,54],{"size":178,"scale":3,"weight":0.6200000047683716},[465,376],{"size":27,"scale":3,"weight":-0.4000000059604645},[65,52],{"size":148,"scale":3,"weight":-0.800000011920929},[347,278],{"size":195,"scale":1,"weight":-0.6000000238418579},[282,223],{"size":171,"scale":2,"weight":-0.4000000059604645},[320,256],{"size":138,"scale":1,"weight":0.30000001192092896},[213,173],{"size":79,"scale":2,"weight":0},[150,119],{"size":38,"scale":2,"weight":0.4000000059604645},[76,61],{"size":175,"scale":2,"weight":-0.6000000238418579},[321,254],{"size":147,"scale":-1,"weight":0.5600000023841858},[296,240],{"size":32,"scale":3,"weight":-0.4000000059604645},[77,61],{"size":133,"scale":2,"weight":0.23000000417232513},[256,207],{"size":74,"scale":-1,"weight":-0.800000011920929},[135,108],{"size":10,"scale":1,"weight":-0.4000000059604645},[16,12],{"size":195,"scale":2,"weight":-0.800000011920929},[355,283],{"size":93,"scale":3,"weight":0},[226,181],{"size":191,"scale":1,"weight":-0.4000000059604645},[282,227],{"size":184,"scale":-1,"weight":0.5600000023841858},[371,300],{"size":78,"scale":-1,"weight":0.4000000059604645},[154,125],{"size":95,"scale":-1,"weight":0.30000001192092896},[185,150],{"size":54,"scale":3,"weight":-0.6000000238418579},[127,101],{"size":75,"scale":2,"weight":0.5600000023841858},[152,123],{"size":41,"scale":3,"weight":-0.4000000059604645},[99,78],{"size":99,"scale":3,"weight":-0.800000011920929},[232,186],{"size":88,"scale":-1,"weight":-0.800000011920929},[160,128],{"size":120,"scale":3,"weight":0},[292,234],{"size":188,"scale":-1,"weight":-0.800000011920929},[342,273],{"size":37,"scale":3,"weight":0.5600000023841858},[96,77],{"size":51,"scale":2,"weight":0.30000001192092896},[100,81],{"size":89,"scale":2,"weight":-0.6000000238418579},[164,130],{"size":153,"scale":3,"weight":-0.800000011920929},[358,287],{"size":10,"scale":3,"weight":0.6200000047683716},[27,21],{"size":14,"scale":-1,"weight":0.30000001192092896},[28,22],{"size":141,"scale":1,"weight":-0.4000000059604645},[209,167],{"size":141,"scale":-1,"weight":-0.4000000059604645},[264,212],{"size":120,"scale":1,"weight":0.23000000417232513},[183,148],{"size":157,"scale":1,"weight":0.4000000059604645},[245,198],{"size":160,"scale":3,"weight":0.6200000047683716},[418,338],{"size":48,"scale":3,"weight":0},[117,94],{"size":113,"scale":2,"weight":0.23000000417232513},[218,176],{"size":186,"scale":1,"weight":-0.6000000238418579},[269,212],{"size":48,"scale":1,"weight":0.6200000047683716},[78,64],{"size":173,"scale":1,"weight":0.5600000023841858},[275,223],{"size":148,"scale":1,"weight":-0.800000011920929},[212,168],{"size":116,"scale":-1,"weight":-0.4000000059604645},[217,174],{"size":193,"scale":3,"weight":0.6200000047683716},[504,407],{"size":113,"scale":3,"weight":-0.4000000059604645},[271,215],{"size":185,"scale":2,"weight":0.30000001192092896},[360,291],{"size":37,"scale":1,"weight":0.5600000023841858},[59,48],{"size":133,"scale":3,"weight":0.6200000047683716},[347,281],{"size":129,"scale":-1,"weight":-0.4000000059604645},[241,194],{"size":86,"scale":-1,"weight":0.6200000047683716},[177,143],{"size":52,"scale":1,"weight":0.6200000047683716},[84,68],{"size":79,"scale":1,"weight":-0.800000011920929},[113,90],{"size":182,"scale":1,"weight":0.23000000417232513},[277,225],{"size":131,"scale":1,"weight":0.4000000059604645},[204,166],{"size":151,"scale":1,"weight":0},[227,185],{"size":161,"scale":-1,"weight":-0.6000000238418579},[296,233],{"size":159,"scale":3,"weight":0.23000000417232513},[391,315],{"size":1,"scale":-1,"weight":-0.800000011920929},[2,2],{"size":86,"scale":-1,"weight":0.30000001192092896},[168,136],{"size":89,"scale":-1,"weight":0.30000001192092896},[174,141],{"size":187,"scale":2,"weight":0.5600000023841858},[377,305],{"size":190,"scale":-1,"weight":0.6200000047683716},[390,315],{"size":180,"scale":2,"weight":-0.800000011920929},[327,261],{"size":144,"scale":3,"weight":0.30000001192092896},[359,288],{"size":77,"scale":2,"weight":0},[147,116],{"size":130,"scale":3,"weight":-0.800000011920929},[305,244],{"size":23,"scale":2,"weight":0.5600000023841858},[47,38],{"size":146,"scale":-1,"weight":0},[277,219],{"size":195,"scale":1,"weight":-0.4000000059604645},[288,232],{"size":128,"scale":-1,"weight":-0.800000011920929},[233,186],{"size":176,"scale":2,"weight":0.30000001192092896},[343,277],{"size":191,"scale":2,"weight":-0.4000000059604645},[357,285],{"size":82,"scale":3,"weight":0.23000000417232513},[202,162],{"size":70,"scale":1,"weight":-0.800000011920929},[100,80],{"size":180,"scale":-1,"weight":0.6200000047683716},[370,299],{"size":94,"scale":1,"weight":0.5600000023841858},[150,121],{"size":9,"scale":3,"weight":-0.800000011920929},[22,17],{"size":69,"scale":2,"weight":-0.4000000059604645},[129,104],{"size":69,"scale":1,"weight":-0.6000000238418579},[100,79],{"size":35,"scale":1,"weight":0.30000001192092896},[55,44],{"size":96,"scale":-1,"weight":-0.4000000059604645},[180,144],{"size":58,"scale":-1,"weight":0.5600000023841858},[117,95],{"size":34,"scale":3,"weight":-0.800000011920929},[80,65],{"size":186,"scale":3,"weight":-0.4000000059604645},[446,355],{"size":180,"scale":1,"weight":0.6200000047683716},[292,236],{"size":99,"scale":-1,"weight":0.6200000047683716},[203,164],{"size":51,"scale":-1,"weight":0.6200000047683716},[105,85],{"size":59,"scale":2,"weight":0.4000000059604645},[117,94],{"size":125,"scale":3,"weight":0.23000000417232513},[308,247],{"size":27,"scale":2,"weight":0},[52,41],{"size":96,"scale":3,"weight":-0.6000000238418579},[226,180],{"size":169,"scale":1,"weight":0.5600000023841858},[269,218],{"size":39,"scale":1,"weight":0.30000001192092896},[60,49],{"size":75,"scale":2,"weight":0.4000000059604645},[149,120],{"size":158,"scale":3,"weight":0.30000001192092896},[393,317],{"size":11,"scale":-1,"weight":0.4000000059604645},[22,18],{"size":116,"scale":2,"weight":0.5600000023841858},[234,189],{"size":115,"scale":-1,"weight":0.30000001192092896},[224,181],{"size":164,"scale":3,"weight":0},[398,320],{"size":76,"scale":3,"weight":0.5600000023841858},[195,158],{"size":24,"scale":3,"weight":-0.4000000059604645},[58,46],{"size":69,"scale":1,"weight":0.30000001192092896},[106,86],{"size":153,"scale":1,"weight":-0.800000011920929},[219,174],{"size":31,"scale":3,"weight":-0.800000011920929},[73,59],{"size":195,"scale":-1,"weight":0.23000000417232513},[376,303],{"size":135,"scale":2,"weight":0.23000000417232513},[261,211],{"size":25,"scale":-1,"weight":0.23000000417232513},[48,39],{"size":86,"scale":-1,"weight":0.23000000417232513},[166,134],{"size":25,"scale":1,"weight":0.5600000023841858},[40,32],{"size":43,"scale":2,"weight":-0.4000000059604645},[80,65],{"size":195,"scale":-1,"weight":0.5600000023841858},[393,318],{"size":2,"scale":-1,"weight":0},[4,3],{"size":79,"scale":1,"weight":0.6200000047683716},[129,104],{"size":139,"scale":2,"weight":-0.800000011920929},[253,202],{"size":194,"scale":3,"weight":-0.6000000238418579},[457,364],{"size":91,"scale":-1,"weight":0},[174,136],{"size":32,"scale":2,"weight":0.4000000059604645},[64,52],{"size":27,"scale":1,"weight":-0.6000000238418579},[40,32],{"size":151,"scale":2,"weight":0.5600000023841858},[304,246],{"size":176,"scale":1,"weight":0.4000000059604645},[275,223],{"size":152,"scale":2,"weight":-0.4000000059604645},[284,228],{"size":77,"scale":1,"weight":0.30000001192092896},[119,97],{"size":70,"scale":-1,"weight":-0.6000000238418579},[129,102],{"size":53,"scale":3,"weight":0.6200000047683716},[139,112],{"size":3,"scale":1,"weight":-0.800000011920929},[5,3],{"size":115,"scale":1,"weight":-0.6000000238418579},[166,132],{"size":46,"scale":3,"weight":0.4000000059604645},[117,94],{"size":182,"scale":-1,"weight":0},[346,272],{"size":54,"scale":-1,"weight":0.23000000417232513},[104,84],{"size":78,"scale":-1,"weight":0.6200000047683716},[160,130],{"size":189,"scale":2,"weight":0.5600000023841858},[381,308],{"size":58,"scale":3,"weight":-0.4000000059604645},[139,111],{"size":145,"scale":3,"weight":-0.4000000059604645},[348,277],{"size":4,"scale":1,"weight":-0.6000000238418579},[7,6],{"size":176,"scale":1,"weight":0.6200000047683716},[285,230],{"size":39,"scale":-1,"weight":0.5600000023841858},[79,64],{"size":71,"scale":-1,"weight":0.6200000047683716},[146,118],{"size":138,"scale":1,"weight":0.23000000417232513},[211,171],{"size":97,"scale":2,"weight":-0.800000011920929},[177,141],{"size":118,"scale":3,"weight":0.4000000059604645},[297,240],{"size":148,"scale":3,"weight":0.4000000059604645},[373,301],{"size":131,"scale":1,"weight":0.5600000023841858},[208,169],{"size":133,"scale":3,"weight":-0.6000000238418579},[313,249],{"size":137,"scale":3,"weight":0.23000000417232513},[337,271],{"size":80,"scale":3,"weight":-0.800000011920929},[188,150],{"size":22,"scale":-1,"weight":0},[43,33],{"size":66,"scale":-1,"weight":0.6200000047683716},[136,110],{"size":131,"scale":1,"weight":-0.6000000238418579},[190,150],{"size":179,"scale":3,"weight":0.5600000023841858},[460,371],{"size":133,"scale":2,"weight":0},[253,199],{"size":40,"scale":2,"weight":-0.6000000238418579},[74,58],{"size":36,"scale":2,"weight":0},[69,54],{"size":39,"scale":2,"weight":0.6200000047683716},[80,65],{"size":59,"scale":3,"weight":0},[144,115],{"size":120,"scale":-1,"weight":-0.6000000238418579},[220,174],{"size":92,"scale":2,"weight":0.5600000023841858},[186,150],{"size":29,"scale":-1,"weight":-0.6000000238418579},[53,42],{"size":62,"scale":-1,"weight":0.5600000023841858},[126,102],{"size":177,"scale":-1,"weight":0.30000001192092896},[345,279],{"size":169,"scale":2,"weight":0.23000000417232513},[326,263],{"size":54,"scale":1,"weight":0.5600000023841858},[87,70],{"size":2,"scale":2,"weight":0.30000001192092896},[4,3],{"size":46,"scale":-1,"weight":0.30000001192092896},[90,73],{"size":168,"scale":1,"weight":0.23000000417232513},[256,208],{"size":1,"scale":3,"weight":-0.6000000238418579},[3,2],{"size":106,"scale":3,"weight":-0.4000000059604645},[254,202],{"size":163,"scale":1,"weight":0.6200000047683716},[264,213],{"size":60,"scale":3,"weight":0.30000001192092896},[150,121],{"size":40,"scale":2,"weight":0.23000000417232513},[78,63],{"size":89,"scale":1,"weight":-0.6000000238418579},[128,102],{"size":55,"scale":2,"weight":0.4000000059604645},[110,89],{"size":56,"scale":2,"weight":0.6200000047683716},[115,94],{"size":22,"scale":-1,"weight":0.4000000059604645},[44,36],{"size":169,"scale":1,"weight":0},[254,206],{"size":3,"scale":1,"weight":0.4000000059604645},[5,4],{"size":53,"scale":-1,"weight":0},[101,79],{"size":103,"scale":2,"weight":-0.6000000238418579},[189,150],{"size":78,"scale":3,"weight":0.4000000059604645},[197,159],{"size":195,"scale":-1,"weight":0},[371,292],{"size":140,"scale":-1,"weight":0.4000000059604645},[276,223],{"size":71,"scale":3,"weight":-0.800000011920929},[167,134],{"size":141,"scale":3,"weight":-0.800000011920929},[330,265],{"size":173,"scale":-1,"weight":0.5600000023841858},[349,282],{"size":88,"scale":-1,"weight":0.30000001192092896},[172,138],{"size":22,"scale":-1,"weight":0.5600000023841858},[45,36],{"size":34,"scale":-1,"weight":-0.800000011920929},[63,50],{"size":191,"scale":2,"weight":0.6200000047683716},[392,317],{"size":119,"scale":2,"weight":-0.6000000238418579},[218,173],{"size":50,"scale":1,"weight":0},[75,62],{"size":91,"scale":2,"weight":0.30000001192092896},[177,144],{"size":60,"scale":-1,"weight":-0.4000000059604645},[113,90],{"size":152,"scale":-1,"weight":0.6200000047683716},[312,253],{"size":114,"scale":2,"weight":0.30000001192092896},[222,180],{"size":19,"scale":2,"weight":0.5600000023841858},[39,31],{"size":151,"scale":-1,"weight":0},[287,226],{"size":22,"scale":3,"weight":0},[54,43],{"size":56,"scale":-1,"weight":-0.6000000238418579},[103,82],{"size":28,"scale":-1,"weight":-0.800000011920929},[51,41],{"size":199,"scale":3,"weight":0.23000000417232513},[490,394],{"size":97,"scale":1,"weight":0.30000001192092896},[150,121],{"size":64,"scale":-1,"weight":0.23000000417232513},[124,100],{"size":167,"scale":3,"weight":0},[406,326],{"size":70,"scale":3,"weight":-0.4000000059604645},[168,134],{"size":89,"scale":1,"weight":0.4000000059604645},[140,113],{"size":63,"scale":1,"weight":0},[96,78],{"size":161,"scale":-1,"weight":-0.4000000059604645},[301,241],{"size":28,"scale":2,"weight":0.30000001192092896},[55,45],{"size":82,"scale":-1,"weight":-0.4000000059604645},[154,123],{"size":41,"scale":1,"weight":0},[62,51],{"size":187,"scale":-1,"weight":-0.4000000059604645},[350,280],{"size":78,"scale":-1,"weight":-0.4000000059604645},[146,117],{"size":88,"scale":3,"weight":0.5600000023841858},[227,183],{"size":99,"scale":1,"weight":0.4000000059604645},[155,126],{"size":21,"scale":1,"weight":0.30000001192092896},[32,27],{"size":49,"scale":1,"weight":0.6200000047683716},[80,65],{"size":152,"scale":1,"weight":0.5600000023841858},[242,196],{"size":200,"scale":1,"weight":0.6200000047683716},[324,261],{"size":158,"scale":3,"weight":0.6200000047683716},[412,334],{"size":77,"scale":3,"weight":0},[187,150],{"size":37,"scale":2,"weight":0.23000000417232513},[72,58],{"size":69,"scale":1,"weight":0},[105,84],{"size":15,"scale":1,"weight":0.23000000417232513},[23,19],{"size":41,"scale":-1,"weight":-0.4000000059604645},[77,62],{"size":146,"scale":2,"weight":0.5600000023841858},[294,238],{"size":75,"scale":3,"weight":-0.4000000059604645},[180,143],{"size":146,"scale":3,"weight":0.23000000417232513},[360,289],{"size":90,"scale":3,"weight":-0.4000000059604645},[216,172],{"size":29,"scale":2,"weight":-0.4000000059604645},[54,44],{"size":146,"scale":-1,"weight":0.6200000047683716},[300,242],{"size":145,"scale":-1,"weight":-0.4000000059604645},[272,217],{"size":12,"scale":3,"weight":0},[29,24],{"size":71,"scale":-1,"weight":-0.800000011920929},[130,103],{"size":2,"scale":2,"weight":-0.4000000059604645},[4,3],{"size":61,"scale":1,"weight":-0.6000000238418579},[89,70],{"size":27,"scale":-1,"weight":0},[52,41],{"size":173,"scale":3,"weight":-0.4000000059604645},[415,330],{"size":141,"scale":-1,"weight":0.6200000047683716},[290,235],{"size":158,"scale":2,"weight":-0.800000011920929},[287,230],{"size":80,"scale":3,"weight":-0.6000000238418579},[189,150],{"size":31,"scale":2,"weight":-0.4000000059604645},[59,46],{"size":46,"scale":1,"weight":-0.800000011920929},[66,52],{"size":119,"scale":3,"weight":0.23000000417232513},[293,236],{"size":72,"scale":3,"weight":-0.6000000238418579},[170,135],{"size":35,"scale":2,"weight":0.23000000417232513},[67,55],{"size":171,"scale":2,"weight":-0.6000000238418579},[314,248],{"size":79,"scale":1,"weight":0},[119,97],{"size":167,"scale":1,"weight":0},[251,204],{"size":16,"scale":3,"weight":0.30000001192092896},[40,33],{"size":148,"scale":1,"weight":-0.6000000238418579},[214,169],{"size":169,"scale":2,"weight":0.30000001192092896},[330,266],{"size":191,"scale":1,"weight":0.6200000047683716},[309,250],{"size":104,"scale":-1,"weight":0.4000000059604645},[206,166],{"size":178,"scale":2,"weight":0.6200000047683716},[365,296],{"size":57,"scale":-1,"weight":0.4000000059604645},[113,91],{"size":17,"scale":1,"weight":0.23000000417232513},[27,21],{"size":85,"scale":1,"weight":0.4000000059604645},[133,108],{"size":162,"scale":1,"weight":-0.800000011920929},[231,184],{"size":187,"scale":3,"weight":-0.4000000059604645},[448,356],{"size":103,"scale":-1,"weight":-0.6000000238418579},[189,150],{"size":108,"scale":2,"weight":-0.800000011920929},[197,157],{"size":163,"scale":-1,"weight":-0.4000000059604645},[305,244],{"size":56,"scale":2,"weight":0},[107,84],{"size":50,"scale":3,"weight":0.23000000417232513},[124,99],{"size":175,"scale":2,"weight":0.5600000023841858},[353,286],{"size":146,"scale":1,"weight":0.5600000023841858},[232,188],{"size":144,"scale":2,"weight":0.6200000047683716},[296,239],{"size":28,"scale":3,"weight":0.5600000023841858},[73,58],{"size":16,"scale":3,"weight":0},[39,32],{"size":163,"scale":2,"weight":-0.800000011920929},[297,237],{"size":135,"scale":1,"weight":-0.6000000238418579},[195,154],{"size":50,"scale":-1,"weight":-0.4000000059604645},[94,75],{"size":133,"scale":2,"weight":0.4000000059604645},[263,212],{"size":7,"scale":2,"weight":0.5600000023841858},[15,12],{"size":130,"scale":2,"weight":0},[247,195],{"size":93,"scale":2,"weight":-0.4000000059604645},[174,139],{"size":175,"scale":1,"weight":-0.4000000059604645},[259,208],{"size":135,"scale":1,"weight":0.6200000047683716},[219,176],{"size":22,"scale":1,"weight":0},[34,27],{"size":189,"scale":3,"weight":-0.6000000238418579},[445,354],{"size":131,"scale":1,"weight":-0.800000011920929},[187,149],{"size":57,"scale":1,"weight":0},[87,70],{"size":177,"scale":-1,"weight":0.6200000047683716},[363,294],{"size":143,"scale":-1,"weight":-0.6000000238418579},[263,207],{"size":20,"scale":3,"weight":-0.6000000238418579},[48,38],{"size":84,"scale":1,"weight":0},[127,102],{"size":198,"scale":3,"weight":-0.6000000238418579},[466,371],{"size":187,"scale":3,"weight":0.4000000059604645},[471,380],{"size":102,"scale":1,"weight":0.6200000047683716},[165,134],{"size":4,"scale":-1,"weight":0.4000000059604645},[9,7],{"size":175,"scale":-1,"weight":0.5600000023841858},[353,286],{"size":126,"scale":-1,"weight":0.6200000047683716},[259,209],{"size":87,"scale":-1,"weight":0},[166,131],{"size":48,"scale":1,"weight":-0.6000000238418579},[69,56],{"size":35,"scale":2,"weight":-0.6000000238418579},[65,51],{"size":2,"scale":3,"weight":-0.800000011920929},[6,4],{"size":35,"scale":-1,"weight":-0.4000000059604645},[66,53],{"size":50,"scale":3,"weight":0},[122,98],{"size":137,"scale":3,"weight":-0.4000000059604645},[329,262],{"size":60,"scale":-1,"weight":0},[114,90],{"size":78,"scale":2,"weight":0},[149,117],{"size":93,"scale":2,"weight":0.5600000023841858},[188,152],{"size":138,"scale":1,"weight":0.4000000059604645},[216,175],{"size":176,"scale":2,"weight":0},[335,263],{"size":150,"scale":1,"weight":0.6200000047683716},[243,197],{"size":45,"scale":-1,"weight":0.5600000023841858},[91,74],{"size":120,"scale":1,"weight":0.30000001192092896},[185,150],{"size":118,"scale":-1,"weight":0.5600000023841858},[238,193],{"size":7,"scale":-1,"weight":0.4000000059604645},[14,11],{"size":40,"scale":2,"weight":0.30000001192092896},[78,63],{"size":62,"scale":1,"weight":0},[93,76],{"size":67,"scale":2,"weight":-0.6000000238418579},[123,98],{"size":73,"scale":1,"weight":0.6200000047683716},[119,96],{"size":113,"scale":3,"weight":0.23000000417232513},[278,223],{"size":90,"scale":2,"weight":-0.800000011920929},[163,131],{"size":110,"scale":3,"weight":0},[268,215],{"size":149,"scale":-1,"weight":0.4000000059604645},[294,238],{"size":139,"scale":2,"weight":0.6200000047683716},[286,231],{"size":190,"scale":3,"weight":0.23000000417232513},[468,376],{"size":106,"scale":1,"weight":0.4000000059604645},[165,134],{"size":27,"scale":3,"weight":-0.800000011920929},[64,51],{"size":71,"scale":-1,"weight":0.30000001192092896},[139,112],{"size":10,"scale":3,"weight":-0.6000000238418579},[24,19],{"size":49,"scale":1,"weight":-0.6000000238418579},[71,57],{"size":135,"scale":2,"weight":0.5600000023841858},[272,221],{"size":57,"scale":1,"weight":-0.4000000059604645},[85,68],{"size":196,"scale":-1,"weight":0.23000000417232513},[378,305],{"size":152,"scale":3,"weight":0.4000000059604645},[383,309],{"size":21,"scale":1,"weight":-0.6000000238418579},[31,25],{"size":29,"scale":2,"weight":-0.6000000238418579},[53,42],{"size":87,"scale":-1,"weight":0.4000000059604645},[172,139],{"size":53,"scale":-1,"weight":0.30000001192092896},[103,84],{"size":28,"scale":1,"weight":0.5600000023841858},[45,37],{"size":152,"scale":1,"weight":0.30000001192092896},[234,190],{"size":199,"scale":3,"weight":-0.6000000238418579},[468,373],{"size":153,"scale":1,"weight":-0.4000000059604645},[226,182],{"size":122,"scale":1,"weight":0.5600000023841858},[195,158],{"size":106,"scale":-1,"weight":0.23000000417232513},[205,165],{"size":64,"scale":3,"weight":0.6200000047683716},[167,135],{"size":144,"scale":3,"weight":-0.800000011920929},[337,270],{"size":162,"scale":-1,"weight":-0.6000000238418579},[297,235],{"size":130,"scale":-1,"weight":-0.800000011920929},[236,189],{"size":13,"scale":3,"weight":-0.6000000238418579},[31,25],{"size":48,"scale":3,"weight":0.5600000023841858},[124,100],{"size":50,"scale":3,"weight":0.4000000059604645},[127,102],{"size":120,"scale":2,"weight":-0.800000011920929},[218,175],{"size":190,"scale":1,"weight":0.23000000417232513},[290,235],{"size":130,"scale":-1,"weight":0},[247,195],{"size":123,"scale":2,"weight":0.6200000047683716},[252,204],{"size":24,"scale":-1,"weight":0.6200000047683716},[50,40],{"size":63,"scale":-1,"weight":0.6200000047683716},[130,105],{"size":111,"scale":3,"weight":0},[270,216],{"size":34,"scale":-1,"weight":-0.4000000059604645},[64,51],{"size":23,"scale":1,"weight":0.6200000047683716},[38,30],{"size":179,"scale":1,"weight":0},[269,218],{"size":59,"scale":1,"weight":-0.800000011920929},[85,67],{"size":179,"scale":-1,"weight":-0.800000011920929},[326,260],{"size":147,"scale":1,"weight":0.5600000023841858},[234,189],{"size":18,"scale":2,"weight":0.30000001192092896},[36,29],{"size":7,"scale":2,"weight":0},[14,11],{"size":29,"scale":2,"weight":0.4000000059604645},[58,47],{"size":92,"scale":1,"weight":0},[138,113],{"size":53,"scale":2,"weight":-0.6000000238418579},[98,77],{"size":6,"scale":-1,"weight":0.5600000023841858},[12,10],{"size":30,"scale":2,"weight":0.30000001192092896},[59,47],{"size":176,"scale":3,"weight":-0.800000011920929},[413,331],{"size":32,"scale":-1,"weight":0.30000001192092896},[63,51],{"size":167,"scale":1,"weight":-0.6000000238418579},[241,191],{"size":164,"scale":-1,"weight":0.30000001192092896},[320,259],{"size":180,"scale":1,"weight":0.23000000417232513},[274,223],{"size":33,"scale":-1,"weight":0.23000000417232513},[64,52],{"size":192,"scale":3,"weight":0.5600000023841858},[494,399],{"size":125,"scale":3,"weight":-0.800000011920929},[293,235],{"size":102,"scale":1,"weight":0.23000000417232513},[156,126],{"size":192,"scale":1,"weight":0.23000000417232513},[293,237],{"size":106,"scale":-1,"weight":0.5600000023841858},[214,173],{"size":80,"scale":1,"weight":-0.6000000238418579},[116,92],{"size":55,"scale":3,"weight":0.30000001192092896},[137,110],{"size":149,"scale":1,"weight":0.4000000059604645},[232,188],{"size":24,"scale":2,"weight":0.6200000047683716},[50,40],{"size":36,"scale":2,"weight":0.4000000059604645},[72,58],{"size":156,"scale":1,"weight":-0.4000000059604645},[231,185],{"size":91,"scale":-1,"weight":-0.4000000059604645},[171,137],{"size":130,"scale":3,"weight":0.6200000047683716},[340,274],{"size":127,"scale":1,"weight":-0.4000000059604645},[188,151],{"size":62,"scale":2,"weight":0.23000000417232513},[120,97],{"size":149,"scale":1,"weight":-0.800000011920929},[213,169],{"size":74,"scale":3,"weight":-0.6000000238418579},[174,139],{"size":35,"scale":2,"weight":0.4000000059604645},[69,56],{"size":38,"scale":-1,"weight":0.6200000047683716},[79,64],{"size":33,"scale":3,"weight":0.4000000059604645},[84,67],{"size":49,"scale":2,"weight":0},[94,74],{"size":41,"scale":3,"weight":0},[100,80],{"size":164,"scale":3,"weight":0.4000000059604645},[414,333],{"size":182,"scale":3,"weight":0.4000000059604645},[459,370],{"size":132,"scale":1,"weight":0.6200000047683716},[214,173],{"size":70,"scale":2,"weight":0.30000001192092896},[137,110],{"size":77,"scale":-1,"weight":0.6200000047683716},[159,128],{"size":82,"scale":2,"weight":0.6200000047683716},[169,136],{"size":111,"scale":3,"weight":0.30000001192092896},[277,222],{"size":94,"scale":1,"weight":0},[142,115],{"size":125,"scale":2,"weight":0.5600000023841858},[252,204],{"size":134,"scale":1,"weight":-0.800000011920929},[191,152],{"size":103,"scale":3,"weight":0.30000001192092896},[256,206],{"size":146,"scale":2,"weight":0.6200000047683716},[300,242],{"size":76,"scale":1,"weight":0.23000000417232513},[117,94],{"size":187,"scale":3,"weight":0.6200000047683716},[488,395],{"size":71,"scale":1,"weight":0.5600000023841858},[113,92],{"size":96,"scale":2,"weight":-0.800000011920929},[175,140],{"size":196,"scale":1,"weight":0.23000000417232513},[299,243],{"size":153,"scale":-1,"weight":0.23000000417232513},[295,239],{"size":70,"scale":1,"weight":0.30000001192092896},[109,88],{"size":112,"scale":1,"weight":0.30000001192092896},[172,140],{"size":3,"scale":2,"weight":0},[7,5],{"size":61,"scale":-1,"weight":0.4000000059604645},[121,98],{"size":114,"scale":3,"weight":0.5600000023841858},[293,237],{"size":155,"scale":1,"weight":0.30000001192092896},[239,193],{"size":12,"scale":2,"weight":-0.4000000059604645},[23,18],{"size":188,"scale":1,"weight":-0.800000011920929},[269,214],{"size":180,"scale":3,"weight":0},[437,351],{"size":87,"scale":2,"weight":0.30000001192092896},[169,137],{"size":22,"scale":2,"weight":0},[43,33],{"size":101,"scale":2,"weight":0.6200000047683716},[208,168],{"size":107,"scale":2,"weight":0.30000001192092896},[209,169],{"size":95,"scale":-1,"weight":0.5600000023841858},[192,156],{"size":105,"scale":3,"weight":0.6200000047683716},[274,222],{"size":66,"scale":1,"weight":-0.800000011920929},[95,75],{"size":129,"scale":3,"weight":0.23000000417232513},[318,255],{"size":195,"scale":1,"weight":-0.800000011920929},[278,222],{"size":57,"scale":3,"weight":0.4000000059604645},[144,116],{"size":123,"scale":2,"weight":0.4000000059604645},[243,196],{"size":183,"scale":-1,"weight":0.30000001192092896},[357,288],{"size":116,"scale":-1,"weight":0.4000000059604645},[229,185],{"size":49,"scale":2,"weight":-0.4000000059604645},[92,74],{"size":139,"scale":2,"weight":-0.6000000238418579},[255,201],{"size":173,"scale":1,"weight":-0.4000000059604645},[256,206],{"size":94,"scale":1,"weight":0.4000000059604645},[147,119],{"size":140,"scale":-1,"weight":0},[266,209],{"size":9,"scale":-1,"weight":0.23000000417232513},[18,15],{"size":52,"scale":1,"weight":-0.6000000238418579},[75,60],{"size":61,"scale":2,"weight":0.5600000023841858},[124,100],{"size":28,"scale":2,"weight":-0.6000000238418579},[52,41],{"size":6,"scale":-1,"weight":0.30000001192092896},[12,10],{"size":33,"scale":1,"weight":0.30000001192092896},[51,42],{"size":153,"scale":-1,"weight":0.30000001192092896},[298,241],{"size":143,"scale":-1,"weight":-0.800000011920929},[260,208],{"size":51,"scale":1,"weight":-0.4000000059604645},[76,61],{"size":184,"scale":3,"weight":0},[447,358],{"size":75,"scale":1,"weight":-0.6000000238418579},[109,86],{"size":190,"scale":2,"weight":0.4000000059604645},[376,303],{"size":110,"scale":1,"weight":0.23000000417232513},[168,136],{"size":153,"scale":3,"weight":0},[372,298],{"size":105,"scale":2,"weight":0.4000000059604645},[208,168],{"size":125,"scale":2,"weight":0.6200000047683716},[257,208],{"size":190,"scale":-1,"weight":-0.4000000059604645},[356,284],{"size":3,"scale":-1,"weight":-0.800000011920929},[6,5],{"size":182,"scale":1,"weight":0.30000001192092896},[280,227],{"size":133,"scale":1,"weight":0.5600000023841858},[212,171],{"size":134,"scale":2,"weight":0},[255,200],{"size":103,"scale":1,"weight":0.6200000047683716},[166,135],{"size":108,"scale":3,"weight":0.4000000059604645},[273,219],{"size":74,"scale":-1,"weight":0.23000000417232513},[143,116],{"size":9,"scale":3,"weight":-0.6000000238418579},[22,17],{"size":129,"scale":-1,"weight":-0.6000000238418579},[237,188],{"size":128,"scale":-1,"weight":0.4000000059604645},[253,204],{"size":188,"scale":3,"weight":0.5600000023841858},[484,390],{"size":50,"scale":1,"weight":-0.4000000059604645},[74,60],{"size":153,"scale":1,"weight":-0.6000000238418579},[221,175],{"size":166,"scale":3,"weight":0.4000000059604645},[418,337],{"size":198,"scale":1,"weight":0},[298,242],{"size":9,"scale":2,"weight":0.23000000417232513},[18,15],{"size":56,"scale":2,"weight":0.4000000059604645},[111,90],{"size":47,"scale":3,"weight":0.5600000023841858},[122,98],{"size":51,"scale":1,"weight":0},[78,63],{"size":118,"scale":2,"weight":0.4000000059604645},[234,189],{"size":124,"scale":2,"weight":-0.800000011920929},[226,181],{"size":155,"scale":-1,"weight":-0.800000011920929},[282,225],{"size":18,"scale":-1,"weight":-0.6000000238418579},[33,26],{"size":88,"scale":1,"weight":-0.6000000238418579},[127,101],{"size":70,"scale":1,"weight":-0.6000000238418579},[101,81],{"size":27,"scale":1,"weight":0},[42,34],{"size":162,"scale":1,"weight":0.6200000047683716},[262,212],{"size":199,"scale":2,"weight":0},[378,298],{"size":25,"scale":-1,"weight":0.5600000023841858},[51,41],{"size":74,"scale":1,"weight":-0.6000000238418579},[107,85],{"size":175,"scale":-1,"weight":0.30000001192092896},[341,276],{"size":175,"scale":2,"weight":0.6200000047683716},[359,291],{"size":87,"scale":3,"weight":-0.4000000059604645},[209,167],{"size":114,"scale":2,"weight":-0.6000000238418579},[209,166],{"size":30,"scale":3,"weight":0.30000001192092896},[75,61],{"size":58,"scale":3,"weight":0.5600000023841858},[150,121],{"size":117,"scale":-1,"weight":-0.800000011920929},[213,170],{"size":119,"scale":-1,"weight":0.23000000417232513},[229,186],{"size":161,"scale":-1,"weight":0.23000000417232513},[310,251],{"size":59,"scale":3,"weight":-0.800000011920929},[139,111],{"size":167,"scale":1,"weight":0.6200000047683716},[270,219],{"size":104,"scale":3,"weight":-0.6000000238418579},[245,195],{"size":148,"scale":1,"weight":0.4000000059604645},[231,187],{"size":11,"scale":3,"weight":0.30000001192092896},[28,22],{"size":106,"scale":1,"weight":-0.4000000059604645},[157,126],{"size":100,"scale":-1,"weight":0.23000000417232513},[193,155],{"size":45,"scale":3,"weight":-0.6000000238418579},[106,84],{"size":186,"scale":3,"weight":0},[452,362],{"size":176,"scale":-1,"weight":0},[335,263],{"size":63,"scale":3,"weight":-0.800000011920929},[148,118],{"size":21,"scale":3,"weight":0},[52,42],{"size":73,"scale":3,"weight":0.6200000047683716},[190,154],{"size":39,"scale":3,"weight":0.4000000059604645},[99,80],{"size":161,"scale":2,"weight":-0.4000000059604645},[301,241],{"size":154,"scale":2,"weight":0.30000001192092896},[301,243],{"size":127,"scale":2,"weight":0},[241,190],{"size":164,"scale":3,"weight":0.23000000417232513},[404,325],{"size":82,"scale":1,"weight":-0.6000000238418579},[119,94],{"size":101,"scale":3,"weight":0.4000000059604645},[255,206],{"size":100,"scale":3,"weight":0.5600000023841858},[257,208],{"size":85,"scale":-1,"weight":0},[162,128],{"size":79,"scale":2,"weight":-0.6000000238418579},[145,115],{"size":167,"scale":3,"weight":0.30000001192092896},[415,335],{"size":6,"scale":1,"weight":-0.800000011920929},[9,7],{"size":104,"scale":1,"weight":0.6200000047683716},[168,136],{"size":22,"scale":1,"weight":0.30000001192092896},[35,28],{"size":68,"scale":1,"weight":0.30000001192092896},[105,85],{"size":46,"scale":2,"weight":-0.800000011920929},[84,67],{"size":88,"scale":2,"weight":-0.4000000059604645},[165,132],{"size":163,"scale":2,"weight":-0.4000000059604645},[305,244],{"size":110,"scale":3,"weight":-0.6000000238418579},[259,206],{"size":66,"scale":1,"weight":0},[100,81],{"size":122,"scale":2,"weight":0.4000000059604645},[242,195],{"size":156,"scale":-1,"weight":0.6200000047683716},[320,259],{"size":146,"scale":-1,"weight":-0.4000000059604645},[274,218],{"size":182,"scale":3,"weight":-0.6000000238418579},[428,341],{"size":109,"scale":3,"weight":-0.4000000059604645},[262,209],{"size":13,"scale":-1,"weight":0.4000000059604645},[26,21],{"size":29,"scale":-1,"weight":-0.800000011920929},[53,43],{"size":152,"scale":3,"weight":-0.6000000238418579},[358,284],{"size":16,"scale":1,"weight":0.23000000417232513},[25,20],{"size":130,"scale":2,"weight":0.6200000047683716},[267,216],{"size":92,"scale":-1,"weight":0.4000000059604645},[182,147],{"size":181,"scale":-1,"weight":0.30000001192092896},[352,285],{"size":164,"scale":2,"weight":-0.800000011920929},[298,239],{"size":139,"scale":1,"weight":0},[209,170],{"size":118,"scale":2,"weight":0.30000001192092896},[230,186],{"size":166,"scale":2,"weight":0.30000001192092896},[323,261],{"size":128,"scale":3,"weight":0.6200000047683716},[334,271],{"size":108,"scale":1,"weight":0.5600000023841858},[172,140],{"size":100,"scale":2,"weight":0.4000000059604645},[198,159],{"size":185,"scale":2,"weight":-0.800000011920929},[336,269],{"size":178,"scale":3,"weight":0},[432,347],{"size":58,"scale":3,"weight":-0.6000000238418579},[137,109],{"size":143,"scale":2,"weight":0},[272,215],{"size":76,"scale":2,"weight":0.5600000023841858},[154,124],{"size":159,"scale":-1,"weight":-0.6000000238418579},[291,231],{"size":165,"scale":2,"weight":0},[314,247],{"size":75,"scale":-1,"weight":0.30000001192092896},[147,118],{"size":186,"scale":3,"weight":0.30000001192092896},[462,372],{"size":132,"scale":1,"weight":0.23000000417232513},[201,163],{"size":50,"scale":1,"weight":-0.800000011920929},[72,57],{"size":180,"scale":2,"weight":-0.6000000238418579},[330,260],{"size":182,"scale":3,"weight":-0.800000011920929},[427,342],{"size":139,"scale":-1,"weight":0.23000000417232513},[268,216],{"size":6,"scale":3,"weight":-0.6000000238418579},[15,11],{"size":133,"scale":2,"weight":0.5600000023841858},[268,217],{"size":166,"scale":3,"weight":-0.4000000059604645},[398,316],{"size":200,"scale":2,"weight":-0.4000000059604645},[374,299],{"size":74,"scale":3,"weight":0.23000000417232513},[182,147],{"size":105,"scale":1,"weight":0.6200000047683716},[170,137],{"size":89,"scale":3,"weight":0.30000001192092896},[222,178],{"size":183,"scale":1,"weight":-0.800000011920929},[261,208],{"size":137,"scale":1,"weight":-0.4000000059604645},[202,163],{"size":29,"scale":-1,"weight":-0.4000000059604645},[54,44],{"size":47,"scale":2,"weight":-0.800000011920929},[86,68],{"size":186,"scale":-1,"weight":-0.4000000059604645},[348,278],{"size":7,"scale":2,"weight":0.30000001192092896},[14,11],{"size":166,"scale":-1,"weight":-0.800000011920929},[301,241],{"size":193,"scale":1,"weight":0.4000000059604645},[302,244],{"size":8,"scale":2,"weight":0},[16,12],{"size":97,"scale":2,"weight":-0.6000000238418579},[178,141],{"size":148,"scale":2,"weight":0.4000000059604645},[293,237],{"size":115,"scale":3,"weight":-0.4000000059604645},[276,220],{"size":160,"scale":2,"weight":0.30000001192092896},[312,252],{"size":92,"scale":-1,"weight":-0.800000011920929},[167,134],{"size":18,"scale":2,"weight":-0.6000000238418579},[33,26],{"size":118,"scale":-1,"weight":-0.800000011920929},[214,172],{"size":154,"scale":2,"weight":-0.800000011920929},[280,224],{"size":1,"scale":2,"weight":0.23000000417232513},[2,2],{"size":183,"scale":2,"weight":0.6200000047683716},[376,304],{"size":52,"scale":2,"weight":0.5600000023841858},[105,85],{"size":111,"scale":-1,"weight":0.30000001192092896},[216,175],{"size":79,"scale":3,"weight":0.23000000417232513},[195,157],{"size":143,"scale":3,"weight":0.6200000047683716},[373,302],{"size":48,"scale":-1,"weight":0.30000001192092896},[94,76],{"size":62,"scale":3,"weight":0.4000000059604645},[157,126],{"size":76,"scale":3,"weight":0.4000000059604645},[192,155],{"size":35,"scale":3,"weight":0.4000000059604645},[89,72],{"size":18,"scale":-1,"weight":-0.4000000059604645},[34,27],{"size":32,"scale":3,"weight":0},[78,63],{"size":108,"scale":3,"weight":0},[262,210],{"size":154,"scale":-1,"weight":0},[293,230],{"size":91,"scale":3,"weight":0.5600000023841858},[234,189],{"size":119,"scale":3,"weight":0.4000000059604645},[300,242],{"size":59,"scale":1,"weight":-0.4000000059604645},[88,70],{"size":63,"scale":1,"weight":0.30000001192092896},[97,79],{"size":103,"scale":-1,"weight":0.30000001192092896},[201,162],{"size":113,"scale":-1,"weight":-0.6000000238418579},[207,164],{"size":1,"scale":2,"weight":0},[2,2],{"size":176,"scale":-1,"weight":0.5600000023841858},[355,287],{"size":95,"scale":2,"weight":0.30000001192092896},[185,150],{"size":80,"scale":1,"weight":0.30000001192092896},[123,100],{"size":17,"scale":2,"weight":0.4000000059604645},[34,28],{"size":28,"scale":-1,"weight":0.5600000023841858},[57,46],{"size":107,"scale":2,"weight":0.5600000023841858},[216,175],{"size":59,"scale":-1,"weight":-0.4000000059604645},[111,88],{"size":80,"scale":1,"weight":0.6200000047683716},[130,105],{"size":42,"scale":-1,"weight":0.30000001192092896},[82,66],{"size":197,"scale":3,"weight":-0.800000011920929},[461,369],{"size":189,"scale":1,"weight":0.23000000417232513},[288,234],{"size":142,"scale":1,"weight":-0.4000000059604645},[210,168],{"size":90,"scale":-1,"weight":0.6200000047683716},[185,150],{"size":15,"scale":-1,"weight":-0.6000000238418579},[28,23],{"size":171,"scale":3,"weight":0},[415,334],{"size":196,"scale":-1,"weight":0.4000000059604645},[387,313],{"size":96,"scale":-1,"weight":0.4000000059604645},[190,154],{"size":149,"scale":1,"weight":0.23000000417232513},[227,184],{"size":44,"scale":2,"weight":-0.800000011920929},[80,65],{"size":11,"scale":2,"weight":-0.4000000059604645},[21,17],{"size":38,"scale":-1,"weight":0.23000000417232513},[74,60],{"size":105,"scale":-1,"weight":0.23000000417232513},[202,163],{"size":121,"scale":1,"weight":-0.6000000238418579},[175,139],{"size":83,"scale":2,"weight":0.6200000047683716},[171,138],{"size":17,"scale":2,"weight":-0.4000000059604645},[33,26],{"size":122,"scale":2,"weight":-0.4000000059604645},[229,182],{"size":183,"scale":-1,"weight":0.4000000059604645},[361,292],{"size":48,"scale":3,"weight":-0.4000000059604645},[116,92],{"size":73,"scale":2,"weight":0.5600000023841858},[147,120],{"size":51,"scale":3,"weight":0.6200000047683716},[134,108],{"size":72,"scale":3,"weight":-0.800000011920929},[169,135],{"size":126,"scale":-1,"weight":0.23000000417232513},[243,196],{"size":179,"scale":2,"weight":-0.800000011920929},[326,260],{"size":126,"scale":3,"weight":0},[306,245],{"size":38,"scale":2,"weight":-0.800000011920929},[69,56],{"size":5,"scale":-1,"weight":0.23000000417232513},[10,8],{"size":17,"scale":3,"weight":0.4000000059604645},[44,35],{"size":31,"scale":-1,"weight":0.4000000059604645},[62,50],{"size":97,"scale":-1,"weight":0},[185,145],{"size":15,"scale":1,"weight":-0.800000011920929},[22,17],{"size":52,"scale":-1,"weight":-0.800000011920929},[95,76],{"size":132,"scale":2,"weight":-0.800000011920929},[240,192],{"size":127,"scale":2,"weight":-0.6000000238418579},[233,184],{"size":163,"scale":-1,"weight":0.6200000047683716},[334,270],{"size":200,"scale":3,"weight":-0.4000000059604645},[479,381],{"size":49,"scale":3,"weight":-0.6000000238418579},[116,92],{"size":93,"scale":1,"weight":-0.4000000059604645},[138,111],{"size":115,"scale":-1,"weight":0.5600000023841858},[232,188],{"size":32,"scale":2,"weight":0.6200000047683716},[67,54],{"size":10,"scale":2,"weight":0.30000001192092896},[20,16],{"size":160,"scale":1,"weight":0},[241,195],{"size":46,"scale":-1,"weight":0.23000000417232513},[89,72],{"size":140,"scale":3,"weight":-0.800000011920929},[328,263],{"size":86,"scale":2,"weight":-0.800000011920929},[156,125],{"size":53,"scale":1,"weight":0.5600000023841858},[85,68],{"size":156,"scale":3,"weight":-0.4000000059604645},[374,297],{"size":39,"scale":-1,"weight":-0.4000000059604645},[73,59],{"size":17,"scale":1,"weight":-0.4000000059604645},[26,20],{"size":142,"scale":1,"weight":0},[214,173],{"size":20,"scale":2,"weight":0.6200000047683716},[41,33],{"size":40,"scale":-1,"weight":0.5600000023841858},[81,66],{"size":95,"scale":-1,"weight":-0.4000000059604645},[178,143],{"size":24,"scale":2,"weight":0.4000000059604645},[48,39],{"size":137,"scale":3,"weight":-0.800000011920929},[321,257],{"size":84,"scale":-1,"weight":0.6200000047683716},[173,140],{"size":51,"scale":-1,"weight":-0.6000000238418579},[94,74],{"size":195,"scale":2,"weight":-0.4000000059604645},[365,292],{"size":8,"scale":1,"weight":-0.800000011920929},[12,9],{"size":61,"scale":3,"weight":0},[148,119],{"size":79,"scale":1,"weight":-0.4000000059604645},[117,94],{"size":44,"scale":-1,"weight":-0.800000011920929},[80,65],{"size":111,"scale":1,"weight":-0.800000011920929},[159,126],{"size":99,"scale":-1,"weight":-0.6000000238418579},[182,143],{"size":25,"scale":3,"weight":0.30000001192092896},[63,51],{"size":55,"scale":3,"weight":0},[134,107],{"size":21,"scale":2,"weight":0.23000000417232513},[40,33],{"size":33,"scale":-1,"weight":0.6200000047683716},[68,55],{"size":51,"scale":1,"weight":0.6200000047683716},[83,67],{"size":108,"scale":3,"weight":-0.6000000238418579},[254,202],{"size":112,"scale":3,"weight":-0.6000000238418579},[264,210],{"size":71,"scale":2,"weight":0},[135,107],{"size":164,"scale":-1,"weight":0.4000000059604645},[324,262],{"size":123,"scale":-1,"weight":0},[234,184],{"size":124,"scale":-1,"weight":0.23000000417232513},[239,194],{"size":173,"scale":1,"weight":0},[260,212],{"size":149,"scale":3,"weight":0.30000001192092896},[371,299],{"size":131,"scale":1,"weight":0.6200000047683716},[212,172],{"size":100,"scale":3,"weight":0},[243,196],{"size":73,"scale":1,"weight":-0.6000000238418579},[106,84],{"size":17,"scale":1,"weight":0.5600000023841858},[28,22],{"size":47,"scale":2,"weight":0.6200000047683716},[97,78],{"size":161,"scale":-1,"weight":0.5600000023841858},[324,263],{"size":73,"scale":-1,"weight":0.5600000023841858},[147,120],{"size":97,"scale":2,"weight":0.23000000417232513},[188,151],{"size":82,"scale":1,"weight":0.4000000059604645},[128,104],{"size":177,"scale":2,"weight":-0.800000011920929},[322,257],{"size":112,"scale":-1,"weight":0.6200000047683716},[230,187],{"size":50,"scale":2,"weight":0},[96,75],{"size":144,"scale":3,"weight":0.23000000417232513},[355,285],{"size":88,"scale":-1,"weight":0.4000000059604645},[174,140],{"size":126,"scale":2,"weight":-0.800000011920929},[229,183],{"size":28,"scale":-1,"weight":0.6200000047683716},[58,47],{"size":77,"scale":2,"weight":-0.6000000238418579},[141,111],{"size":5,"scale":2,"weight":0},[10,8],{"size":197,"scale":-1,"weight":0},[374,295],{"size":164,"scale":2,"weight":0},[311,245],{"size":177,"scale":3,"weight":0.4000000059604645},[446,360],{"size":51,"scale":-1,"weight":0},[97,77],{"size":56,"scale":1,"weight":0.6200000047683716},[91,74],{"size":109,"scale":-1,"weight":0.30000001192092896},[213,172],{"size":111,"scale":-1,"weight":-0.4000000059604645},[208,166],{"size":145,"scale":1,"weight":0.30000001192092896},[224,181],{"size":132,"scale":1,"weight":-0.6000000238418579},[191,151],{"size":61,"scale":3,"weight":0.6200000047683716},[159,129],{"size":128,"scale":2,"weight":0.4000000059604645},[253,204],{"size":98,"scale":1,"weight":0.30000001192092896},[151,122],{"size":198,"scale":1,"weight":0.30000001192092896},[305,247],{"size":167,"scale":3,"weight":0.6200000047683716},[436,353],{"size":103,"scale":-1,"weight":-0.800000011920929},[188,150],{"size":181,"scale":2,"weight":0.23000000417232513},[349,282],{"size":23,"scale":2,"weight":-0.800000011920929},[42,34],{"size":81,"scale":1,"weight":0.30000001192092896},[125,101],{"size":139,"scale":1,"weight":-0.6000000238418579},[201,159],{"size":47,"scale":-1,"weight":0.30000001192092896},[92,74],{"size":123,"scale":2,"weight":-0.6000000238418579},[225,178],{"size":63,"scale":1,"weight":0.5600000023841858},[100,82],{"size":177,"scale":-1,"weight":0.5600000023841858},[357,289],{"size":5,"scale":1,"weight":0.4000000059604645},[8,7],{"size":106,"scale":-1,"weight":-0.6000000238418579},[195,153],{"size":8,"scale":1,"weight":0.6200000047683716},[14,11],{"size":119,"scale":-1,"weight":-0.6000000238418579},[218,173],{"size":145,"scale":3,"weight":0.6200000047683716},[379,307],{"size":1,"scale":3,"weight":0.23000000417232513},[3,2],{"size":152,"scale":2,"weight":0.6200000047683716},[312,253],{"size":29,"scale":-1,"weight":0.4000000059604645},[58,47],{"size":147,"scale":2,"weight":0.4000000059604645},[291,235],{"size":92,"scale":1,"weight":0.6200000047683716},[149,121],{"size":147,"scale":-1,"weight":-0.4000000059604645},[275,220],{"size":24,"scale":1,"weight":0.5600000023841858},[39,31],{"size":124,"scale":1,"weight":0.6200000047683716},[201,163],{"size":158,"scale":-1,"weight":0.4000000059604645},[312,253],{"size":185,"scale":3,"weight":0.6200000047683716},[483,391],{"size":177,"scale":3,"weight":0.6200000047683716},[462,374],{"size":188,"scale":-1,"weight":0},[357,282],{"size":178,"scale":1,"weight":0},[268,217],{"size":200,"scale":3,"weight":0.6200000047683716},[522,422],{"size":76,"scale":3,"weight":-0.4000000059604645},[182,145],{"size":167,"scale":2,"weight":0.4000000059604645},[330,267],{"size":79,"scale":-1,"weight":-0.800000011920929},[144,115],{"size":142,"scale":3,"weight":0.30000001192092896},[353,284],{"size":188,"scale":2,"weight":0},[357,282],{"size":21,"scale":2,"weight":0.30000001192092896},[41,34],{"size":167,"scale":2,"weight":-0.6000000238418579},[306,242],{"size":85,"scale":3,"weight":-0.4000000059604645},[204,162],{"size":78,"scale":2,"weight":0.23000000417232513},[151,122],{"size":41,"scale":3,"weight":-0.800000011920929},[96,77],{"size":8,"scale":-1,"weight":-0.800000011920929},[15,12],{"size":52,"scale":1,"weight":0.23000000417232513},[80,65],{"size":185,"scale":-1,"weight":-0.6000000238418579},[339,268],{"size":73,"scale":-1,"weight":0.6200000047683716},[150,122],{"size":74,"scale":1,"weight":0.4000000059604645},[116,94],{"size":97,"scale":-1,"weight":0.6200000047683716},[200,161],{"size":68,"scale":-1,"weight":-0.800000011920929},[124,99],{"size":114,"scale":1,"weight":0.4000000059604645},[179,145],{"size":57,"scale":-1,"weight":-0.800000011920929},[104,83],{"size":51,"scale":2,"weight":0.4000000059604645},[101,82],{"size":89,"scale":2,"weight":0.23000000417232513},[172,139],{"size":122,"scale":3,"weight":0},[296,237],{"size":46,"scale":1,"weight":-0.4000000059604645},[69,55],{"size":198,"scale":-1,"weight":0.4000000059604645},[392,317],{"size":156,"scale":3,"weight":0.5600000023841858},[401,324],{"size":184,"scale":3,"weight":0.5600000023841858},[473,382],{"size":70,"scale":3,"weight":0.4000000059604645},[177,143],{"size":26,"scale":3,"weight":-0.6000000238418579},[61,49],{"size":1,"scale":1,"weight":0.5600000023841858},[2,2],{"size":180,"scale":-1,"weight":-0.4000000059604645},[337,269],{"size":71,"scale":1,"weight":0.30000001192092896},[110,89],{"size":186,"scale":1,"weight":0.6200000047683716},[301,243],{"size":98,"scale":1,"weight":-0.800000011920929},[140,111],{"size":110,"scale":1,"weight":-0.4000000059604645},[163,131],{"size":188,"scale":1,"weight":-0.6000000238418579},[272,215],{"size":170,"scale":2,"weight":0.23000000417232513},[327,265],{"size":116,"scale":1,"weight":0.23000000417232513},[177,144],{"size":192,"scale":-1,"weight":-0.800000011920929},[349,279],{"size":43,"scale":3,"weight":-0.6000000238418579},[101,81],{"size":13,"scale":-1,"weight":0.6200000047683716},[27,22],{"size":40,"scale":3,"weight":0},[97,78],{"size":143,"scale":1,"weight":0.4000000059604645},[223,181],{"size":187,"scale":-1,"weight":0.6200000047683716},[384,311],{"size":44,"scale":1,"weight":-0.6000000238418579},[64,51],{"size":39,"scale":-1,"weight":0.23000000417232513},[75,61],{"size":141,"scale":3,"weight":0.5600000023841858},[363,293],{"size":52,"scale":2,"weight":0.6200000047683716},[107,87],{"size":157,"scale":-1,"weight":0.23000000417232513},[303,244],{"size":16,"scale":-1,"weight":-0.6000000238418579},[30,24],{"size":88,"scale":2,"weight":-0.800000011920929},[160,128],{"size":5,"scale":1,"weight":0.23000000417232513},[8,7],{"size":191,"scale":1,"weight":0.23000000417232513},[291,236],{"size":193,"scale":2,"weight":0},[367,288],{"size":172,"scale":2,"weight":0.30000001192092896},[335,271],{"size":200,"scale":3,"weight":-0.6000000238418579},[471,374],{"size":148,"scale":1,"weight":0.30000001192092896},[228,185],{"size":59,"scale":1,"weight":0.6200000047683716},[96,77],{"size":35,"scale":3,"weight":-0.800000011920929},[82,66],{"size":119,"scale":2,"weight":0.23000000417232513},[229,186],{"size":175,"scale":2,"weight":-0.800000011920929},[318,255],{"size":187,"scale":1,"weight":0},[281,229],{"size":10,"scale":2,"weight":0.5600000023841858},[21,17],{"size":141,"scale":2,"weight":-0.6000000238418579},[258,205],{"size":157,"scale":1,"weight":0.6200000047683716},[254,205],{"size":184,"scale":3,"weight":-0.6000000238418579},[433,344],{"size":76,"scale":1,"weight":-0.6000000238418579},[110,87],{"size":8,"scale":3,"weight":-0.4000000059604645},[20,16],{"size":7,"scale":1,"weight":0.4000000059604645},[11,9],{"size":103,"scale":1,"weight":0.4000000059604645},[161,130],{"size":28,"scale":3,"weight":0.4000000059604645},[71,57],{"size":167,"scale":2,"weight":0.30000001192092896},[325,263],{"size":80,"scale":3,"weight":0.5600000023841858},[206,166],{"size":12,"scale":-1,"weight":0.30000001192092896},[24,19],{"size":115,"scale":1,"weight":0.23000000417232513},[175,143],{"size":44,"scale":3,"weight":0.5600000023841858},[114,92],{"size":65,"scale":3,"weight":0.30000001192092896},[162,131],{"size":138,"scale":1,"weight":-0.4000000059604645},[204,164],{"size":58,"scale":2,"weight":0.23000000417232513},[112,91],{"size":177,"scale":-1,"weight":-0.4000000059604645},[331,265],{"size":35,"scale":-1,"weight":-0.6000000238418579},[65,51],{"size":128,"scale":2,"weight":-0.6000000238418579},[235,185],{"size":129,"scale":2,"weight":0},[246,194],{"size":35,"scale":2,"weight":0.6200000047683716},[72,58],{"size":123,"scale":3,"weight":-0.800000011920929},[289,231],{"size":78,"scale":1,"weight":-0.4000000059604645},[115,93],{"size":31,"scale":-1,"weight":0},[60,47],{"size":85,"scale":2,"weight":0.23000000417232513},[164,133],{"size":57,"scale":-1,"weight":0.23000000417232513},[110,89],{"size":94,"scale":2,"weight":0.30000001192092896},[184,148],{"size":113,"scale":3,"weight":0.4000000059604645},[285,229],{"size":90,"scale":-1,"weight":0},[171,135],{"size":62,"scale":1,"weight":0.5600000023841858},[99,80],{"size":48,"scale":3,"weight":-0.800000011920929},[112,91],{"size":190,"scale":1,"weight":-0.4000000059604645},[281,226],{"size":179,"scale":2,"weight":0},[340,267],{"size":136,"scale":1,"weight":0.6200000047683716},[221,179],{"size":31,"scale":2,"weight":0.30000001192092896},[61,49],{"size":152,"scale":3,"weight":0.30000001192092896},[378,304],{"size":84,"scale":1,"weight":0.6200000047683716},[136,110],{"size":184,"scale":2,"weight":-0.800000011920929},[334,267],{"size":118,"scale":1,"weight":0},[178,144],{"size":68,"scale":3,"weight":-0.800000011920929},[160,128],{"size":189,"scale":2,"weight":-0.6000000238418579},[347,274],{"size":121,"scale":3,"weight":0.30000001192092896},[301,242],{"size":25,"scale":3,"weight":-0.6000000238418579},[59,48],{"size":200,"scale":1,"weight":0.23000000417232513},[305,247],{"size":126,"scale":3,"weight":-0.6000000238418579},[297,236],{"size":164,"scale":1,"weight":0},[247,200],{"size":97,"scale":2,"weight":0.5600000023841858},[196,158],{"size":48,"scale":-1,"weight":-0.6000000238418579},[89,70],{"size":163,"scale":1,"weight":0.4000000059604645},[255,206],{"size":84,"scale":2,"weight":0.23000000417232513},[162,131],{"size":96,"scale":1,"weight":-0.6000000238418579},[139,110],{"size":197,"scale":2,"weight":0.5600000023841858},[397,321],{"size":180,"scale":1,"weight":0.5600000023841858},[286,232],{"size":52,"scale":-1,"weight":0.5600000023841858},[105,85],{"size":48,"scale":1,"weight":0.30000001192092896},[74,61],{"size":43,"scale":-1,"weight":-0.4000000059604645},[80,65],{"size":133,"scale":3,"weight":0},[323,259],{"size":163,"scale":3,"weight":0.23000000417232513},[401,323],{"size":96,"scale":-1,"weight":-0.800000011920929},[175,140],{"size":21,"scale":1,"weight":0.4000000059604645},[33,27],{"size":180,"scale":3,"weight":0.5600000023841858},[463,374],{"size":2,"scale":2,"weight":0.6200000047683716},[4,3],{"size":131,"scale":3,"weight":0.23000000417232513},[322,259],{"size":120,"scale":3,"weight":-0.6000000238418579},[283,225],{"size":137,"scale":1,"weight":0},[206,168],{"size":146,"scale":3,"weight":0},[355,285],{"size":84,"scale":-1,"weight":0.4000000059604645},[167,135],{"size":73,"scale":3,"weight":0.23000000417232513},[180,144],{"size":29,"scale":-1,"weight":0.6200000047683716},[60,49],{"size":55,"scale":1,"weight":0.6200000047683716},[90,73],{"size":182,"scale":-1,"weight":0.30000001192092896},[355,287],{"size":137,"scale":-1,"weight":0},[261,205],{"size":68,"scale":1,"weight":-0.800000011920929},[98,77],{"size":134,"scale":1,"weight":-0.4000000059604645},[198,159],{"size":181,"scale":-1,"weight":0.4000000059604645},[358,290],{"size":117,"scale":1,"weight":0},[177,143],{"size":22,"scale":1,"weight":-0.800000011920929},[32,25],{"size":3,"scale":3,"weight":0.23000000417232513},[8,7],{"size":47,"scale":3,"weight":0.23000000417232513},[116,94],{"size":19,"scale":3,"weight":0.5600000023841858},[49,40],{"size":187,"scale":3,"weight":0},[454,364],{"size":128,"scale":2,"weight":-0.800000011920929},[233,186],{"size":147,"scale":-1,"weight":0},[280,220],{"size":140,"scale":-1,"weight":0.6200000047683716},[287,232],{"size":125,"scale":-1,"weight":-0.800000011920929},[227,182],{"size":193,"scale":1,"weight":-0.4000000059604645},[286,229],{"size":36,"scale":-1,"weight":0.4000000059604645},[72,58],{"size":37,"scale":2,"weight":-0.4000000059604645},[70,55],{"size":81,"scale":3,"weight":0.30000001192092896},[201,162],{"size":168,"scale":3,"weight":-0.4000000059604645},[403,321],{"size":99,"scale":3,"weight":0.6200000047683716},[258,209],{"size":25,"scale":2,"weight":-0.800000011920929},[46,36],{"size":160,"scale":3,"weight":0.5600000023841858},[411,332],{"size":126,"scale":3,"weight":-0.800000011920929},[296,236],{"size":155,"scale":-1,"weight":0.4000000059604645},[307,248],{"size":12,"scale":2,"weight":0.5600000023841858},[24,20],{"size":23,"scale":-1,"weight":-0.4000000059604645},[43,35],{"size":168,"scale":3,"weight":-0.6000000238418579},[395,315],{"size":25,"scale":2,"weight":0.6200000047683716},[52,42],{"size":62,"scale":-1,"weight":-0.4000000059604645},[116,93],{"size":88,"scale":3,"weight":0.23000000417232513},[216,175],{"size":142,"scale":3,"weight":-0.6000000238418579},[335,266],{"size":82,"scale":3,"weight":0.6200000047683716},[214,173],{"size":66,"scale":1,"weight":0.5600000023841858},[106,85],{"size":44,"scale":-1,"weight":0.30000001192092896},[86,70],{"size":16,"scale":2,"weight":-0.4000000059604645},[30,25],{"size":67,"scale":1,"weight":0.30000001192092896},[103,84],{"size":179,"scale":2,"weight":0.30000001192092896},[349,282],{"size":193,"scale":3,"weight":-0.6000000238418579},[454,361],{"size":158,"scale":3,"weight":0.5600000023841858},[407,329],{"size":40,"scale":2,"weight":-0.800000011920929},[73,59],{"size":146,"scale":3,"weight":0.4000000059604645},[368,297],{"size":150,"scale":-1,"weight":0.6200000047683716},[308,249],{"size":36,"scale":1,"weight":0.23000000417232513},[55,45],{"size":176,"scale":1,"weight":0.5600000023841858},[280,227],{"size":73,"scale":1,"weight":0.30000001192092896},[113,91],{"size":172,"scale":1,"weight":0.5600000023841858},[274,222],{"size":88,"scale":2,"weight":0},[168,132],{"size":194,"scale":1,"weight":0.30000001192092896},[299,243],{"size":130,"scale":1,"weight":0.6200000047683716},[211,171],{"size":198,"scale":-1,"weight":-0.4000000059604645},[370,297],{"size":153,"scale":1,"weight":0.30000001192092896},[235,191],{"size":20,"scale":3,"weight":-0.4000000059604645},[49,39],{"size":119,"scale":1,"weight":-0.4000000059604645},[176,141],{"size":55,"scale":2,"weight":-0.4000000059604645},[103,83],{"size":167,"scale":2,"weight":0.6200000047683716},[343,277],{"size":63,"scale":-1,"weight":0.23000000417232513},[121,98],{"size":103,"scale":2,"weight":0.4000000059604645},[204,165],{"size":162,"scale":-1,"weight":-0.800000011920929},[294,235],{"size":118,"scale":1,"weight":0.30000001192092896},[181,147],{"size":46,"scale":2,"weight":0.5600000023841858},[93,75],{"size":108,"scale":3,"weight":0.30000001192092896},[269,216],{"size":140,"scale":3,"weight":0.5600000023841858},[360,291],{"size":106,"scale":-1,"weight":0.4000000059604645},[209,169],{"size":135,"scale":1,"weight":-0.4000000059604645},[200,160],{"size":91,"scale":1,"weight":-0.800000011920929},[130,103],{"size":82,"scale":3,"weight":-0.6000000238418579},[193,153],{"size":107,"scale":1,"weight":0.30000001192092896},[165,134],{"size":11,"scale":2,"weight":0.4000000059604645},[22,18],{"size":87,"scale":3,"weight":0},[211,170],{"size":56,"scale":1,"weight":0.23000000417232513},[85,70],{"size":52,"scale":3,"weight":-0.4000000059604645},[125,100],{"size":24,"scale":-1,"weight":-0.4000000059604645},[45,36],{"size":170,"scale":3,"weight":0.23000000417232513},[418,336],{"size":182,"scale":1,"weight":0.4000000059604645},[284,230],{"size":42,"scale":-1,"weight":0.4000000059604645},[84,67],{"size":52,"scale":3,"weight":0.4000000059604645},[131,106],{"size":100,"scale":-1,"weight":-0.800000011920929},[182,145],{"size":171,"scale":3,"weight":-0.6000000238418579},[403,321],{"size":182,"scale":3,"weight":0},[442,355],{"size":7,"scale":1,"weight":0.30000001192092896},[11,9],{"size":19,"scale":-1,"weight":0},[36,29],{"size":197,"scale":2,"weight":-0.6000000238418579},[361,285],{"size":161,"scale":1,"weight":0.5600000023841858},[256,207],{"size":13,"scale":2,"weight":-0.800000011920929},[24,19],{"size":63,"scale":2,"weight":-0.800000011920929},[115,92],{"size":56,"scale":3,"weight":0.30000001192092896},[139,113],{"size":74,"scale":1,"weight":0},[111,90],{"size":82,"scale":-1,"weight":0.30000001192092896},[160,129],{"size":21,"scale":-1,"weight":0.23000000417232513},[40,33],{"size":112,"scale":3,"weight":0},[272,218],{"size":16,"scale":3,"weight":0.4000000059604645},[40,33],{"size":172,"scale":2,"weight":0.4000000059604645},[340,275],{"size":30,"scale":2,"weight":-0.4000000059604645},[57,45],{"size":173,"scale":2,"weight":0.23000000417232513},[334,269],{"size":139,"scale":1,"weight":0.4000000059604645},[217,176],{"size":172,"scale":-1,"weight":0.23000000417232513},[332,268],{"size":55,"scale":2,"weight":0.5600000023841858},[111,90],{"size":24,"scale":3,"weight":-0.6000000238418579},[57,45],{"size":109,"scale":3,"weight":-0.6000000238418579},[257,205],{"size":136,"scale":2,"weight":-0.4000000059604645},[255,204],{"size":199,"scale":1,"weight":0},[299,243],{"size":101,"scale":1,"weight":-0.800000011920929},[145,115],{"size":26,"scale":1,"weight":-0.800000011920929},[38,30],{"size":77,"scale":1,"weight":-0.4000000059604645},[114,92],{"size":142,"scale":2,"weight":0.4000000059604645},[281,227],{"size":99,"scale":3,"weight":-0.4000000059604645},[237,189],{"size":103,"scale":3,"weight":0.6200000047683716},[269,218],{"size":70,"scale":3,"weight":0},[171,137],{"size":175,"scale":1,"weight":0.23000000417232513},[267,216],{"size":122,"scale":-1,"weight":0.30000001192092896},[238,192],{"size":107,"scale":-1,"weight":-0.4000000059604645},[200,161],{"size":38,"scale":2,"weight":0.23000000417232513},[74,60],{"size":127,"scale":3,"weight":0.4000000059604645},[321,259],{"size":69,"scale":2,"weight":0.23000000417232513},[134,108],{"size":200,"scale":2,"weight":-0.800000011920929},[364,291],{"size":50,"scale":1,"weight":0.30000001192092896},[77,63],{"size":78,"scale":3,"weight":0.30000001192092896},[194,157],{"size":33,"scale":2,"weight":0.30000001192092896},[65,53],{"size":172,"scale":3,"weight":0.4000000059604645},[434,350],{"size":68,"scale":1,"weight":-0.6000000238418579},[99,78],{"size":162,"scale":2,"weight":0.4000000059604645},[320,259],{"size":73,"scale":2,"weight":0},[139,110],{"size":120,"scale":2,"weight":-0.6000000238418579},[220,174],{"size":9,"scale":-1,"weight":0.5600000023841858},[19,16],{"size":136,"scale":2,"weight":0.23000000417232513},[262,212],{"size":33,"scale":1,"weight":0.23000000417232513},[50,42],{"size":21,"scale":3,"weight":0.30000001192092896},[53,43],{"size":111,"scale":2,"weight":0.23000000417232513},[214,173],{"size":110,"scale":-1,"weight":0.30000001192092896},[214,173],{"size":131,"scale":2,"weight":0.6200000047683716},[269,218],{"size":199,"scale":1,"weight":-0.6000000238418579},[288,227],{"size":170,"scale":3,"weight":0.4000000059604645},[428,345],{"size":77,"scale":1,"weight":0.23000000417232513},[118,96],{"size":181,"scale":2,"weight":0.4000000059604645},[358,290],{"size":67,"scale":3,"weight":0.30000001192092896},[167,134],{"size":51,"scale":3,"weight":-0.6000000238418579},[121,95],{"size":170,"scale":-1,"weight":0.30000001192092896},[331,268],{"size":41,"scale":-1,"weight":0.4000000059604645},[82,66],{"size":30,"scale":2,"weight":0.23000000417232513},[58,47],{"size":71,"scale":1,"weight":0.6200000047683716},[115,94],{"size":111,"scale":-1,"weight":-0.6000000238418579},[204,161],{"size":130,"scale":3,"weight":0.5600000023841858},[334,270],{"size":139,"scale":1,"weight":0.23000000417232513},[212,172],{"size":193,"scale":3,"weight":-0.800000011920929},[452,362],{"size":182,"scale":2,"weight":-0.4000000059604645},[341,273],{"size":73,"scale":3,"weight":0},[178,142],{"size":74,"scale":1,"weight":0.23000000417232513},[113,92],{"size":81,"scale":2,"weight":0.23000000417232513},[156,126],{"size":59,"scale":2,"weight":0},[113,89],{"size":159,"scale":2,"weight":0.30000001192092896},[310,251],{"size":189,"scale":-1,"weight":-0.4000000059604645},[354,283],{"size":156,"scale":2,"weight":0.6200000047683716},[320,259],{"size":18,"scale":2,"weight":-0.4000000059604645},[34,27],{"size":69,"scale":-1,"weight":0.5600000023841858},[139,113],{"size":174,"scale":1,"weight":0.4000000059604645},[271,220],{"size":133,"scale":1,"weight":-0.4000000059604645},[197,158],{"size":130,"scale":2,"weight":0.30000001192092896},[254,205],{"size":54,"scale":2,"weight":-0.6000000238418579},[99,78],{"size":65,"scale":3,"weight":-0.6000000238418579},[154,122],{"size":136,"scale":1,"weight":0.30000001192092896},[209,170],{"size":43,"scale":1,"weight":-0.800000011920929},[62,49],{"size":156,"scale":-1,"weight":0.5600000023841858},[314,254],{"size":98,"scale":-1,"weight":0.6200000047683716},[201,163],{"size":66,"scale":3,"weight":0.4000000059604645},[167,135],{"size":95,"scale":3,"weight":0.6200000047683716},[248,200],{"size":116,"scale":-1,"weight":0.30000001192092896},[227,183],{"size":52,"scale":3,"weight":0.23000000417232513},[128,104],{"size":95,"scale":2,"weight":0},[180,142],{"size":119,"scale":-1,"weight":0.6200000047683716},[244,198],{"size":144,"scale":1,"weight":0.30000001192092896},[222,180],{"size":193,"scale":1,"weight":0.6200000047683716},[313,252],{"size":92,"scale":1,"weight":0.4000000059604645},[144,117],{"size":134,"scale":-1,"weight":0.23000000417232513},[259,208],{"size":117,"scale":3,"weight":0.4000000059604645},[295,238],{"size":25,"scale":-1,"weight":-0.800000011920929},[46,36],{"size":122,"scale":3,"weight":0.6200000047683716},[319,257],{"size":179,"scale":3,"weight":0.4000000059604645},[451,364],{"size":32,"scale":1,"weight":0},[48,39],{"size":165,"scale":2,"weight":-0.800000011920929},[300,240],{"size":102,"scale":-1,"weight":-0.6000000238418579},[188,148],{"size":164,"scale":2,"weight":0.4000000059604645},[324,262],{"size":14,"scale":3,"weight":0},[35,28],{"size":86,"scale":-1,"weight":0.4000000059604645},[170,138],{"size":103,"scale":-1,"weight":0.4000000059604645},[204,165],{"size":81,"scale":-1,"weight":0},[154,121],{"size":62,"scale":-1,"weight":-0.800000011920929},[113,91],{"size":95,"scale":2,"weight":0.6200000047683716},[195,158],{"size":132,"scale":2,"weight":0.4000000059604645},[261,211],{"size":126,"scale":-1,"weight":0.5600000023841858},[254,206],{"size":141,"scale":1,"weight":0.4000000059604645},[220,178],{"size":115,"scale":-1,"weight":0.23000000417232513},[222,179],{"size":86,"scale":2,"weight":0.6200000047683716},[177,143],{"size":57,"scale":3,"weight":-0.6000000238418579},[134,107],{"size":39,"scale":3,"weight":0.6200000047683716},[102,83],{"size":147,"scale":3,"weight":-0.800000011920929},[344,276],{"size":129,"scale":2,"weight":0.4000000059604645},[255,207],{"size":53,"scale":2,"weight":0.4000000059604645},[105,85],{"size":35,"scale":1,"weight":0.4000000059604645},[55,45],{"size":51,"scale":-1,"weight":0.23000000417232513},[99,80],{"size":5,"scale":-1,"weight":0.5600000023841858},[11,9],{"size":8,"scale":3,"weight":0.4000000059604645},[21,17],{"size":83,"scale":1,"weight":0},[125,101],{"size":169,"scale":2,"weight":0.5600000023841858},[341,275],{"size":27,"scale":-1,"weight":0.30000001192092896},[53,43],{"size":157,"scale":2,"weight":-0.800000011920929},[285,228],{"size":123,"scale":-1,"weight":-0.6000000238418579},[225,178],{"size":58,"scale":-1,"weight":-0.800000011920929},[106,85],{"size":13,"scale":-1,"weight":0.30000001192092896},[26,21],{"size":58,"scale":2,"weight":-0.6000000238418579},[107,84],{"size":127,"scale":2,"weight":0.5600000023841858},[256,207],{"size":54,"scale":3,"weight":0.30000001192092896},[135,108],{"size":199,"scale":1,"weight":0.23000000417232513},[303,246],{"size":116,"scale":3,"weight":-0.4000000059604645},[278,221],{"size":71,"scale":2,"weight":0.23000000417232513},[137,110],{"size":199,"scale":1,"weight":-0.4000000059604645},[294,236],{"size":58,"scale":1,"weight":0},[88,71],{"size":7,"scale":3,"weight":-0.6000000238418579},[17,14],{"size":186,"scale":2,"weight":0.5600000023841858},[375,303],{"size":185,"scale":2,"weight":0.23000000417232513},[357,288],{"size":6,"scale":3,"weight":0.30000001192092896},[16,12],{"size":142,"scale":1,"weight":0.6200000047683716},[230,186],{"size":16,"scale":2,"weight":0},[30,24],{"size":118,"scale":2,"weight":-0.4000000059604645},[221,177],{"size":30,"scale":1,"weight":0.30000001192092896},[47,38],{"size":178,"scale":-1,"weight":-0.6000000238418579},[327,258],{"size":116,"scale":1,"weight":0.4000000059604645},[181,147],{"size":193,"scale":-1,"weight":-0.4000000059604645},[361,289],{"size":189,"scale":3,"weight":-0.4000000059604645},[453,361],{"size":54,"scale":-1,"weight":0.30000001192092896},[105,85],{"size":71,"scale":3,"weight":-0.6000000238418579},[167,133],{"size":59,"scale":3,"weight":0.30000001192092896},[147,118],{"size":25,"scale":1,"weight":-0.6000000238418579},[36,29],{"size":47,"scale":1,"weight":0.5600000023841858},[76,60],{"size":11,"scale":-1,"weight":0.23000000417232513},[21,18],{"size":146,"scale":-1,"weight":0.30000001192092896},[285,229],{"size":114,"scale":3,"weight":0.6200000047683716},[297,241],{"size":34,"scale":1,"weight":0.6200000047683716},[55,45],{"size":8,"scale":1,"weight":0.30000001192092896},[13,10],{"size":64,"scale":2,"weight":-0.6000000238418579},[118,93],{"size":153,"scale":2,"weight":0.5600000023841858},[309,250],{"size":168,"scale":-1,"weight":0.5600000023841858},[339,274],{"size":47,"scale":-1,"weight":0},[90,70],{"size":154,"scale":2,"weight":0.6200000047683716},[316,256],{"size":43,"scale":2,"weight":0.6200000047683716},[89,72],{"size":186,"scale":-1,"weight":0.30000001192092896},[362,292],{"size":53,"scale":2,"weight":0.5600000023841858},[107,87],{"size":150,"scale":2,"weight":0.4000000059604645},[296,239],{"size":47,"scale":1,"weight":0.23000000417232513},[72,58],{"size":177,"scale":1,"weight":0.5600000023841858},[282,228],{"size":165,"scale":2,"weight":0.5600000023841858},[333,269],{"size":131,"scale":-1,"weight":0.4000000059604645},[259,210],{"size":167,"scale":2,"weight":0},[317,250],{"size":131,"scale":3,"weight":0},[319,255],{"size":89,"scale":1,"weight":-0.4000000059604645},[132,106],{"size":157,"scale":1,"weight":-0.6000000238418579},[227,179],{"size":17,"scale":2,"weight":0},[33,26],{"size":93,"scale":-1,"weight":-0.800000011920929},[169,135],{"size":112,"scale":3,"weight":0.23000000417232513},[276,222],{"size":197,"scale":1,"weight":0.4000000059604645},[307,249],{"size":136,"scale":3,"weight":-0.6000000238418579},[320,255],{"size":97,"scale":1,"weight":0.4000000059604645},[152,123],{"size":13,"scale":-1,"weight":-0.6000000238418579},[24,19],{"size":114,"scale":2,"weight":0.6200000047683716},[234,190],{"size":114,"scale":1,"weight":-0.6000000238418579},[165,131],{"size":11,"scale":-1,"weight":0.30000001192092896},[22,18],{"size":57,"scale":2,"weight":0.6200000047683716},[118,95],{"size":160,"scale":1,"weight":0.23000000417232513},[244,198],{"size":94,"scale":3,"weight":0.6200000047683716},[246,199],{"size":80,"scale":1,"weight":0.4000000059604645},[125,102],{"size":61,"scale":2,"weight":-0.6000000238418579},[112,89],{"size":183,"scale":3,"weight":0.23000000417232513},[451,362],{"size":107,"scale":1,"weight":0.4000000059604645},[167,136],{"size":153,"scale":1,"weight":0.5600000023841858},[244,197],{"size":132,"scale":1,"weight":0.5600000023841858},[210,170],{"size":118,"scale":1,"weight":0.6200000047683716},[191,154],{"size":89,"scale":-1,"weight":0.4000000059604645},[176,143],{"size":197,"scale":-1,"weight":-0.4000000059604645},[369,294],{"size":117,"scale":1,"weight":0.30000001192092896},[180,146],{"size":61,"scale":-1,"weight":0.30000001192092896},[119,97],{"size":151,"scale":1,"weight":-0.6000000238418579},[218,173],{"size":137,"scale":1,"weight":-0.800000011920929},[196,156],{"size":164,"scale":3,"weight":0.30000001192092896},[408,328],{"size":81,"scale":-1,"weight":-0.4000000059604645},[152,121],{"size":106,"scale":2,"weight":0.23000000417232513},[205,165],{"size":46,"scale":3,"weight":0.5600000023841858},[118,96],{"size":46,"scale":2,"weight":0.30000001192092896},[90,73],{"size":191,"scale":3,"weight":0.30000001192092896},[475,382],{"size":110,"scale":3,"weight":0.30000001192092896},[274,221],{"size":58,"scale":1,"weight":0.5600000023841858},[92,75],{"size":52,"scale":1,"weight":0.4000000059604645},[82,66],{"size":103,"scale":3,"weight":0},[251,201],{"size":142,"scale":2,"weight":-0.800000011920929},[258,207],{"size":160,"scale":2,"weight":0},[304,240],{"size":119,"scale":1,"weight":0.30000001192092896},[184,148],{"size":191,"scale":1,"weight":-0.6000000238418579},[276,218],{"size":110,"scale":2,"weight":0.23000000417232513},[212,171],{"size":80,"scale":3,"weight":0},[195,156],{"size":166,"scale":-1,"weight":0},[316,249],{"size":157,"scale":1,"weight":0.30000001192092896},[242,196],{"size":145,"scale":1,"weight":-0.6000000238418579},[210,166],{"size":173,"scale":2,"weight":-0.800000011920929},[314,251],{"size":146,"scale":2,"weight":0},[277,219],{"size":32,"scale":2,"weight":0.23000000417232513},[62,51],{"size":186,"scale":1,"weight":-0.800000011920929},[266,211],{"size":128,"scale":1,"weight":-0.800000011920929},[183,146],{"size":39,"scale":3,"weight":-0.6000000238418579},[92,74],{"size":194,"scale":2,"weight":0},[369,291],{"size":67,"scale":-1,"weight":-0.4000000059604645},[126,101],{"size":195,"scale":3,"weight":0.30000001192092896},[485,390],{"size":30,"scale":2,"weight":0.5600000023841858},[61,49],{"size":125,"scale":3,"weight":0.6200000047683716},[326,264],{"size":189,"scale":-1,"weight":0.23000000417232513},[364,294],{"size":40,"scale":3,"weight":0.5600000023841858},[103,83],{"size":177,"scale":2,"weight":0.6200000047683716},[363,294],{"size":74,"scale":3,"weight":0},[180,145],{"size":165,"scale":-1,"weight":0},[314,247],{"size":99,"scale":-1,"weight":0.30000001192092896},[193,156],{"size":189,"scale":1,"weight":0.5600000023841858},[301,244],{"size":102,"scale":1,"weight":0.4000000059604645},[160,129],{"size":85,"scale":1,"weight":-0.4000000059604645},[125,102],{"size":100,"scale":3,"weight":0.4000000059604645},[252,204],{"size":172,"scale":3,"weight":-0.4000000059604645},[413,328],{"size":134,"scale":2,"weight":-0.6000000238418579},[246,194],{"size":73,"scale":3,"weight":0.4000000059604645},[184,148],{"size":184,"scale":2,"weight":-0.4000000059604645},[344,275],{"size":70,"scale":3,"weight":-0.800000011920929},[165,132],{"size":10,"scale":1,"weight":0.6200000047683716},[17,13],{"size":125,"scale":3,"weight":-0.6000000238418579},[295,234],{"size":107,"scale":3,"weight":0.23000000417232513},[264,212],{"size":113,"scale":2,"weight":-0.6000000238418579},[207,164],{"size":14,"scale":1,"weight":0},[21,18],{"size":54,"scale":3,"weight":0.6200000047683716},[141,114],{"size":88,"scale":-1,"weight":0.6200000047683716},[181,146],{"size":27,"scale":1,"weight":0.4000000059604645},[42,35],{"size":27,"scale":3,"weight":0.6200000047683716},[71,57],{"size":118,"scale":2,"weight":-0.800000011920929},[214,172],{"size":29,"scale":3,"weight":-0.6000000238418579},[68,55],{"size":20,"scale":-1,"weight":-0.4000000059604645},[38,30],{"size":44,"scale":-1,"weight":-0.6000000238418579},[81,64],{"size":16,"scale":2,"weight":0.6200000047683716},[33,27],{"size":25,"scale":-1,"weight":-0.6000000238418579},[47,36],{"size":75,"scale":-1,"weight":0.6200000047683716},[154,125],{"size":132,"scale":3,"weight":0.30000001192092896},[328,265],{"size":177,"scale":-1,"weight":0},[336,265],{"size":138,"scale":3,"weight":0.30000001192092896},[343,276],{"size":100,"scale":3,"weight":-0.4000000059604645},[240,191],{"size":44,"scale":3,"weight":0},[107,86],{"size":104,"scale":-1,"weight":-0.4000000059604645},[195,156],{"size":13,"scale":2,"weight":0.5600000023841858},[27,21],{"size":93,"scale":2,"weight":0.30000001192092896},[182,146],{"size":3,"scale":2,"weight":0.5600000023841858},[7,6],{"size":37,"scale":3,"weight":0},[90,72],{"size":46,"scale":2,"weight":-0.4000000059604645},[86,69],{"size":23,"scale":1,"weight":0.23000000417232513},[36,29],{"size":195,"scale":1,"weight":0.30000001192092896},[300,244],{"size":48,"scale":3,"weight":0.30000001192092896},[120,97],{"size":66,"scale":2,"weight":-0.4000000059604645},[123,100],{"size":136,"scale":2,"weight":0.5600000023841858},[274,222],{"size":142,"scale":2,"weight":-0.4000000059604645},[266,213],{"size":115,"scale":3,"weight":0.23000000417232513},[283,228],{"size":77,"scale":3,"weight":0.6200000047683716},[201,163],{"size":120,"scale":3,"weight":0.5600000023841858},[308,249],{"size":165,"scale":-1,"weight":0.23000000417232513},[318,257],{"size":44,"scale":2,"weight":-0.6000000238418579},[81,64],{"size":143,"scale":2,"weight":0.6200000047683716},[293,238],{"size":30,"scale":-1,"weight":0.6200000047683716},[62,50],{"size":4,"scale":1,"weight":-0.800000011920929},[7,5],{"size":131,"scale":-1,"weight":-0.4000000059604645},[245,196],{"size":11,"scale":3,"weight":0.5600000023841858},[29,23],{"size":17,"scale":-1,"weight":0},[33,26],{"size":84,"scale":-1,"weight":0.23000000417232513},[162,131],{"size":191,"scale":2,"weight":0},[363,286],{"size":19,"scale":1,"weight":0.23000000417232513},[29,24],{"size":3,"scale":2,"weight":-0.6000000238418579},[6,5],{"size":17,"scale":1,"weight":0.6200000047683716},[28,22],{"size":69,"scale":3,"weight":0},[168,135],{"size":89,"scale":3,"weight":0.4000000059604645},[224,181],{"size":68,"scale":1,"weight":0.6200000047683716},[111,89],{"size":79,"scale":-1,"weight":0.5600000023841858},[159,129],{"size":162,"scale":2,"weight":-0.800000011920929},[294,235],{"size":84,"scale":1,"weight":-0.6000000238418579},[122,96],{"size":185,"scale":-1,"weight":-0.800000011920929},[336,269],{"size":112,"scale":2,"weight":0.5600000023841858},[226,183],{"size":183,"scale":3,"weight":-0.800000011920929},[429,343],{"size":163,"scale":3,"weight":0.30000001192092896},[406,327],{"size":124,"scale":3,"weight":-0.800000011920929},[291,233],{"size":90,"scale":2,"weight":0.5600000023841858},[182,147],{"size":34,"scale":1,"weight":-0.6000000238418579},[50,40],{"size":167,"scale":-1,"weight":-0.800000011920929},[304,243],{"size":2,"scale":1,"weight":0.6200000047683716},[3,3],{"size":150,"scale":1,"weight":0.4000000059604645},[235,190],{"size":1,"scale":2,"weight":0.4000000059604645},[2,2],{"size":7,"scale":3,"weight":0.23000000417232513},[18,15],{"size":192,"scale":1,"weight":0},[289,234],{"size":185,"scale":1,"weight":0.4000000059604645},[289,234],{"size":197,"scale":3,"weight":0.5600000023841858},[506,409],{"size":100,"scale":2,"weight":0},[190,150],{"size":48,"scale":3,"weight":0.4000000059604645},[121,98],{"size":74,"scale":2,"weight":0.30000001192092896},[145,117],{"size":108,"scale":3,"weight":0.5600000023841858},[278,224],{"size":41,"scale":3,"weight":0.4000000059604645},[104,83],{"size":98,"scale":1,"weight":0.23000000417232513},[149,121],{"size":194,"scale":-1,"weight":0.23000000417232513},[374,302],{"size":57,"scale":1,"weight":0.4000000059604645},[89,73],{"size":95,"scale":2,"weight":-0.6000000238418579},[174,138],{"size":49,"scale":3,"weight":0.30000001192092896},[122,98],{"size":22,"scale":1,"weight":0.6200000047683716},[36,29],{"size":90,"scale":1,"weight":0},[136,110],{"size":157,"scale":2,"weight":0.30000001192092896},[306,247],{"size":150,"scale":1,"weight":0.5600000023841858},[239,194],{"size":194,"scale":1,"weight":-0.800000011920929},[277,221],{"size":95,"scale":2,"weight":-0.800000011920929},[173,139],{"size":154,"scale":3,"weight":0.5600000023841858},[396,320],{"size":76,"scale":2,"weight":-0.4000000059604645},[143,114],{"size":88,"scale":3,"weight":-0.800000011920929},[206,166],{"size":193,"scale":1,"weight":0.23000000417232513},[294,238],{"size":30,"scale":2,"weight":0.4000000059604645},[59,48],{"size":164,"scale":2,"weight":-0.4000000059604645},[307,246],{"size":150,"scale":3,"weight":-0.4000000059604645},[360,286],{"size":141,"scale":3,"weight":-0.4000000059604645},[338,269],{"size":114,"scale":2,"weight":-0.4000000059604645},[214,171],{"size":34,"scale":-1,"weight":0.4000000059604645},[67,55],{"size":188,"scale":2,"weight":-0.800000011920929},[342,273],{"size":88,"scale":-1,"weight":-0.4000000059604645},[165,132],{"size":171,"scale":-1,"weight":0.6200000047683716},[351,284],{"size":58,"scale":1,"weight":-0.6000000238418579},[84,67],{"size":162,"scale":1,"weight":-0.6000000238418579},[234,185],{"size":78,"scale":2,"weight":0.30000001192092896},[153,123],{"size":125,"scale":1,"weight":0.5600000023841858},[199,161],{"size":11,"scale":3,"weight":0.4000000059604645},[28,22],{"size":129,"scale":3,"weight":0.4000000059604645},[325,262],{"size":143,"scale":3,"weight":-0.6000000238418579},[337,268],{"size":177,"scale":3,"weight":0.30000001192092896},[441,354],{"size":173,"scale":1,"weight":-0.6000000238418579},[250,198],{"size":162,"scale":3,"weight":0.5600000023841858},[417,336],{"size":84,"scale":3,"weight":0},[204,164],{"size":18,"scale":2,"weight":0.5600000023841858},[37,30],{"size":109,"scale":1,"weight":-0.6000000238418579},[158,125],{"size":164,"scale":1,"weight":0.23000000417232513},[250,202],{"size":128,"scale":1,"weight":0.6200000047683716},[207,168],{"size":42,"scale":1,"weight":0},[64,52],{"size":103,"scale":2,"weight":0.6200000047683716},[212,171],{"size":179,"scale":-1,"weight":0.6200000047683716},[367,297],{"size":59,"scale":3,"weight":0.5600000023841858},[152,123],{"size":190,"scale":2,"weight":0.6200000047683716},[390,315],{"size":73,"scale":2,"weight":-0.800000011920929},[133,107],{"size":64,"scale":2,"weight":0.23000000417232513},[124,100],{"size":127,"scale":3,"weight":0.30000001192092896},[316,255],{"size":190,"scale":3,"weight":0.4000000059604645},[479,386],{"size":199,"scale":1,"weight":0.6200000047683716},[322,260],{"size":185,"scale":2,"weight":-0.4000000059604645},[346,277],{"size":33,"scale":2,"weight":-0.4000000059604645},[62,50],{"size":12,"scale":-1,"weight":-0.800000011920929},[23,18],{"size":16,"scale":-1,"weight":0},[30,24],{"size":89,"scale":-1,"weight":-0.800000011920929},[162,130],{"size":65,"scale":1,"weight":0.6200000047683716},[105,86],{"size":164,"scale":3,"weight":0.6200000047683716},[428,346],{"size":32,"scale":3,"weight":0.23000000417232513},[79,64],{"size":186,"scale":1,"weight":-0.4000000059604645},[275,220],{"size":184,"scale":-1,"weight":0.6200000047683716},[378,305],{"size":22,"scale":2,"weight":-0.4000000059604645},[42,34],{"size":1,"scale":1,"weight":0.23000000417232513},[2,2],{"size":171,"scale":3,"weight":0.5600000023841858},[439,356],{"size":69,"scale":2,"weight":-0.6000000238418579},[127,100],{"size":153,"scale":2,"weight":-0.6000000238418579},[281,222],{"size":169,"scale":1,"weight":0.30000001192092896},[260,211],{"size":65,"scale":-1,"weight":-0.6000000238418579},[119,94],{"size":130,"scale":1,"weight":0.5600000023841858},[207,168],{"size":118,"scale":3,"weight":0.23000000417232513},[291,234],{"size":181,"scale":3,"weight":0.30000001192092896},[450,363],{"size":141,"scale":2,"weight":0},[268,211],{"size":144,"scale":3,"weight":-0.6000000238418579},[339,269],{"size":117,"scale":2,"weight":0.6200000047683716},[240,194],{"size":163,"scale":2,"weight":0.4000000059604645},[322,260],{"size":56,"scale":2,"weight":-0.6000000238418579},[103,82],{"size":81,"scale":2,"weight":-0.4000000059604645},[152,121],{"size":19,"scale":3,"weight":-0.4000000059604645},[46,36],{"size":61,"scale":1,"weight":0.6200000047683716},[99,80],{"size":190,"scale":1,"weight":0.5600000023841858},[303,245],{"size":39,"scale":3,"weight":0.23000000417232513},[97,78],{"size":186,"scale":3,"weight":-0.6000000238418579},[438,348],{"size":109,"scale":2,"weight":0.4000000059604645},[216,174],{"size":171,"scale":3,"weight":0.23000000417232513},[421,339],{"size":68,"scale":-1,"weight":0.5600000023841858},[137,111],{"size":177,"scale":1,"weight":0.4000000059604645},[276,224],{"size":100,"scale":3,"weight":0.23000000417232513},[247,199],{"size":46,"scale":1,"weight":0},[70,56],{"size":95,"scale":-1,"weight":0.4000000059604645},[188,152],{"size":77,"scale":2,"weight":0.4000000059604645},[152,123],{"size":14,"scale":1,"weight":-0.4000000059604645},[21,17],{"size":126,"scale":2,"weight":0.5600000023841858},[254,206],{"size":8,"scale":-1,"weight":0.4000000059604645},[17,13],{"size":53,"scale":2,"weight":-0.800000011920929},[97,77],{"size":102,"scale":2,"weight":-0.4000000059604645},[191,153],{"size":155,"scale":3,"weight":0.6200000047683716},[404,327],{"size":157,"scale":3,"weight":-0.6000000238418579},[370,294],{"size":187,"scale":1,"weight":0.4000000059604645},[292,237],{"size":165,"scale":2,"weight":0.6200000047683716},[339,274],{"size":9,"scale":-1,"weight":-0.6000000238418579},[17,14],{"size":125,"scale":-1,"weight":0.6200000047683716},[257,208],{"size":24,"scale":-1,"weight":-0.6000000238418579},[44,35],{"size":161,"scale":2,"weight":0.6200000047683716},[331,267],{"size":49,"scale":-1,"weight":0},[94,74],{"size":175,"scale":2,"weight":-0.4000000059604645},[327,262],{"size":78,"scale":1,"weight":0.6200000047683716},[126,103],{"size":118,"scale":1,"weight":-0.4000000059604645},[175,140],{"size":31,"scale":-1,"weight":0.6200000047683716},[64,51],{"size":8,"scale":-1,"weight":0.30000001192092896},[16,13],{"size":75,"scale":1,"weight":0.30000001192092896},[115,94],{"size":71,"scale":1,"weight":0.23000000417232513},[109,88],{"size":126,"scale":2,"weight":0},[240,188],{"size":196,"scale":-1,"weight":0.6200000047683716},[402,325],{"size":90,"scale":3,"weight":0.30000001192092896},[224,180],{"size":67,"scale":-1,"weight":0.23000000417232513},[129,105],{"size":52,"scale":-1,"weight":-0.4000000059604645},[97,78],{"size":78,"scale":1,"weight":0.30000001192092896},[121,98],{"size":36,"scale":1,"weight":0},[55,44],{"size":86,"scale":-1,"weight":-0.4000000059604645},[161,129],{"size":50,"scale":-1,"weight":0.30000001192092896},[98,79],{"size":34,"scale":3,"weight":0.5600000023841858},[88,71],{"size":98,"scale":3,"weight":0.5600000023841858},[252,204],{"size":148,"scale":2,"weight":-0.800000011920929},[269,215],{"size":147,"scale":-1,"weight":-0.6000000238418579},[270,213],{"size":84,"scale":3,"weight":-0.6000000238418579},[198,158],{"size":28,"scale":3,"weight":0.23000000417232513},[70,56],{"size":183,"scale":2,"weight":0},[347,274],{"size":111,"scale":3,"weight":-0.800000011920929},[261,209],{"size":60,"scale":-1,"weight":0.23000000417232513},[116,93],{"size":169,"scale":3,"weight":0.6200000047683716},[441,357],{"size":20,"scale":1,"weight":-0.800000011920929},[29,23],{"size":79,"scale":1,"weight":0.30000001192092896},[122,99],{"size":188,"scale":3,"weight":0.23000000417232513},[463,372],{"size":37,"scale":3,"weight":0.23000000417232513},[91,73],{"size":102,"scale":2,"weight":0.5600000023841858},[206,167],{"size":185,"scale":2,"weight":0.6200000047683716},[380,307],{"size":10,"scale":3,"weight":-0.800000011920929},[24,19],{"size":112,"scale":-1,"weight":0.23000000417232513},[216,175],{"size":196,"scale":2,"weight":0.4000000059604645},[387,313],{"size":8,"scale":2,"weight":0.6200000047683716},[17,13],{"size":101,"scale":3,"weight":-0.4000000059604645},[242,193],{"size":124,"scale":-1,"weight":0.5600000023841858},[251,203],{"size":141,"scale":2,"weight":0.23000000417232513},[272,220],{"size":109,"scale":-1,"weight":0.5600000023841858},[220,178],{"size":185,"scale":3,"weight":0.23000000417232513},[456,366],{"size":102,"scale":3,"weight":-0.6000000238418579},[240,191],{"size":85,"scale":1,"weight":0.30000001192092896},[131,107],{"size":158,"scale":-1,"weight":0.6200000047683716},[324,263],{"size":22,"scale":2,"weight":-0.800000011920929},[40,33],{"size":142,"scale":-1,"weight":0.4000000059604645},[281,227],{"size":14,"scale":2,"weight":-0.6000000238418579},[26,20],{"size":142,"scale":1,"weight":0.5600000023841858},[226,183],{"size":13,"scale":1,"weight":-0.800000011920929},[19,15],{"size":156,"scale":3,"weight":-0.6000000238418579},[368,292],{"size":144,"scale":2,"weight":0.5600000023841858},[291,235],{"size":81,"scale":1,"weight":-0.6000000238418579},[117,93],{"size":141,"scale":-1,"weight":-0.800000011920929},[256,205],{"size":97,"scale":2,"weight":0.6200000047683716},[200,161],{"size":40,"scale":1,"weight":-0.800000011920929},[58,45],{"size":71,"scale":2,"weight":-0.6000000238418579},[131,103],{"size":59,"scale":1,"weight":-0.6000000238418579},[85,68],{"size":155,"scale":2,"weight":0},[294,232],{"size":30,"scale":3,"weight":-0.6000000238418579},[71,57],{"size":113,"scale":1,"weight":-0.4000000059604645},[167,134],{"size":132,"scale":3,"weight":0.6200000047683716},[344,279],{"size":17,"scale":2,"weight":0.30000001192092896},[34,27],{"size":109,"scale":-1,"weight":0.4000000059604645},[216,174],{"size":38,"scale":1,"weight":0.5600000023841858},[61,49],{"size":160,"scale":-1,"weight":0.5600000023841858},[323,261],{"size":148,"scale":1,"weight":0.23000000417232513},[226,183],{"size":93,"scale":1,"weight":0.30000001192092896},[143,117],{"size":170,"scale":1,"weight":0},[256,207],{"size":168,"scale":2,"weight":0.23000000417232513},[324,261],{"size":109,"scale":1,"weight":0.4000000059604645},[171,138],{"size":59,"scale":-1,"weight":0.30000001192092896},[115,93],{"size":117,"scale":3,"weight":0},[285,228],{"size":77,"scale":3,"weight":0.4000000059604645},[194,156],{"size":139,"scale":3,"weight":0.6200000047683716},[363,293],{"size":112,"scale":2,"weight":-0.800000011920929},[204,163],{"size":194,"scale":3,"weight":0.6200000047683716},[507,410],{"size":151,"scale":3,"weight":0.23000000417232513},[372,299],{"size":84,"scale":1,"weight":0.30000001192092896},[130,105],{"size":46,"scale":-1,"weight":0.4000000059604645},[92,74],{"size":184,"scale":3,"weight":-0.4000000059604645},[441,350],{"size":77,"scale":1,"weight":0},[116,95],{"size":41,"scale":2,"weight":-0.6000000238418579},[75,60],{"size":174,"scale":3,"weight":0},[423,339],{"size":100,"scale":1,"weight":0},[151,123],{"size":35,"scale":2,"weight":-0.4000000059604645},[66,53],{"size":7,"scale":-1,"weight":0},[14,11],{"size":67,"scale":3,"weight":0.23000000417232513},[166,133],{"size":188,"scale":-1,"weight":-0.4000000059604645},[352,282],{"size":68,"scale":2,"weight":0.6200000047683716},[140,113],{"size":149,"scale":2,"weight":0.6200000047683716},[306,248],{"size":29,"scale":1,"weight":0},[44,36],{"size":3,"scale":1,"weight":-0.4000000059604645},[5,4],{"size":5,"scale":3,"weight":0.30000001192092896},[13,10],{"size":169,"scale":-1,"weight":0},[321,253],{"size":104,"scale":3,"weight":-0.4000000059604645},[250,198],{"size":174,"scale":1,"weight":-0.6000000238418579},[251,199],{"size":36,"scale":-1,"weight":0.23000000417232513},[70,56],{"size":169,"scale":2,"weight":-0.6000000238418579},[310,244],{"size":40,"scale":3,"weight":0.30000001192092896},[100,80],{"size":27,"scale":2,"weight":0.5600000023841858},[55,45],{"size":101,"scale":2,"weight":-0.800000011920929},[184,147],{"size":52,"scale":-1,"weight":-0.6000000238418579},[96,76],{"size":197,"scale":1,"weight":0.5600000023841858},[314,254],{"size":105,"scale":-1,"weight":-0.6000000238418579},[193,152],{"size":4,"scale":3,"weight":0.5600000023841858},[11,9],{"size":123,"scale":3,"weight":0.23000000417232513},[303,244],{"size":38,"scale":3,"weight":-0.800000011920929},[89,72],{"size":77,"scale":2,"weight":-0.4000000059604645},[145,115],{"size":129,"scale":-1,"weight":0.5600000023841858},[261,211],{"size":54,"scale":2,"weight":0},[103,81],{"size":125,"scale":3,"weight":0.30000001192092896},[311,250],{"size":162,"scale":1,"weight":0.30000001192092896},[250,202],{"size":3,"scale":3,"weight":-0.4000000059604645},[8,7],{"size":20,"scale":2,"weight":0},[38,31],{"size":43,"scale":1,"weight":0.5600000023841858},[69,56],{"size":158,"scale":1,"weight":0.23000000417232513},[241,196],{"size":135,"scale":-1,"weight":0},[257,202],{"size":154,"scale":-1,"weight":0.23000000417232513},[297,240],{"size":36,"scale":2,"weight":-0.6000000238418579},[66,52],{"size":178,"scale":-1,"weight":-0.800000011920929},[323,259],{"size":51,"scale":2,"weight":0.6200000047683716},[105,85],{"size":104,"scale":2,"weight":-0.800000011920929},[189,151],{"size":40,"scale":1,"weight":0.5600000023841858},[64,51],{"size":148,"scale":-1,"weight":-0.4000000059604645},[277,222],{"size":45,"scale":-1,"weight":0},[86,68],{"size":137,"scale":1,"weight":0.30000001192092896},[212,171],{"size":144,"scale":-1,"weight":0.4000000059604645},[284,230],{"size":92,"scale":-1,"weight":0.6200000047683716},[189,153],{"size":94,"scale":2,"weight":0.4000000059604645},[186,150],{"size":67,"scale":1,"weight":-0.6000000238418579},[98,77],{"size":26,"scale":3,"weight":0.6200000047683716},[68,55],{"size":147,"scale":-1,"weight":-0.800000011920929},[268,214],{"size":24,"scale":1,"weight":0.4000000059604645},[38,31],{"size":98,"scale":-1,"weight":0},[186,146],{"size":184,"scale":2,"weight":0.5600000023841858},[371,300],{"size":129,"scale":2,"weight":-0.800000011920929},[234,188],{"size":179,"scale":1,"weight":-0.800000011920929},[255,203],{"size":33,"scale":-1,"weight":0},[63,50],{"size":35,"scale":1,"weight":0},[53,43],{"size":92,"scale":1,"weight":-0.800000011920929},[132,105],{"size":4,"scale":2,"weight":-0.800000011920929},[8,7],{"size":24,"scale":-1,"weight":0.4000000059604645},[48,39],{"size":95,"scale":3,"weight":0.4000000059604645},[240,193],{"size":76,"scale":1,"weight":-0.800000011920929},[109,86],{"size":105,"scale":2,"weight":-0.4000000059604645},[197,157],{"size":74,"scale":2,"weight":0.4000000059604645},[147,119],{"size":151,"scale":3,"weight":-0.6000000238418579},[355,283],{"size":81,"scale":3,"weight":-0.800000011920929},[190,152],{"size":138,"scale":3,"weight":0.5600000023841858},[355,287],{"size":68,"scale":2,"weight":0.4000000059604645},[134,109],{"size":72,"scale":-1,"weight":0.6200000047683716},[148,120],{"size":199,"scale":1,"weight":-0.800000011920929},[284,226],{"size":94,"scale":-1,"weight":0.4000000059604645},[186,150],{"size":161,"scale":2,"weight":-0.6000000238418579},[296,233],{"size":167,"scale":3,"weight":-0.800000011920929},[392,314],{"size":15,"scale":-1,"weight":0.23000000417232513},[29,24],{"size":168,"scale":3,"weight":-0.800000011920929},[394,316],{"size":112,"scale":-1,"weight":-0.6000000238418579},[206,163],{"size":142,"scale":-1,"weight":0.6200000047683716},[292,236],{"size":159,"scale":3,"weight":0.30000001192092896},[396,319],{"size":20,"scale":1,"weight":0.23000000417232513},[31,25],{"size":24,"scale":3,"weight":0.5600000023841858},[62,50],{"size":41,"scale":-1,"weight":0.30000001192092896},[81,65],{"size":16,"scale":-1,"weight":0.4000000059604645},[32,26],{"size":35,"scale":-1,"weight":0.4000000059604645},[69,56],{"size":185,"scale":1,"weight":-0.6000000238418579},[267,211],{"size":37,"scale":2,"weight":0.4000000059604645},[74,59],{"size":32,"scale":-1,"weight":-0.6000000238418579},[59,47],{"size":81,"scale":2,"weight":-0.800000011920929},[147,118],{"size":171,"scale":-1,"weight":0},[325,256],{"size":13,"scale":-1,"weight":-0.4000000059604645},[25,20],{"size":166,"scale":1,"weight":0.6200000047683716},[269,218],{"size":108,"scale":-1,"weight":0},[205,162],{"size":26,"scale":3,"weight":0.23000000417232513},[64,52],{"size":134,"scale":2,"weight":0.5600000023841858},[271,218],{"size":195,"scale":2,"weight":0.30000001192092896},[380,307],{"size":95,"scale":-1,"weight":0},[180,142],{"size":20,"scale":2,"weight":0.4000000059604645},[40,32],{"size":111,"scale":2,"weight":-0.4000000059604645},[208,166],{"size":36,"scale":-1,"weight":0.5600000023841858},[73,59],{"size":136,"scale":-1,"weight":-0.4000000059604645},[255,204],{"size":108,"scale":-1,"weight":-0.800000011920929},[197,157],{"size":52,"scale":2,"weight":0.30000001192092896},[102,82],{"size":6,"scale":2,"weight":0},[12,10],{"size":114,"scale":1,"weight":-0.800000011920929},[163,130],{"size":67,"scale":-1,"weight":-0.6000000238418579},[123,98],{"size":120,"scale":3,"weight":0.30000001192092896},[299,240],{"size":21,"scale":3,"weight":0.6200000047683716},[56,45],{"size":181,"scale":1,"weight":-0.4000000059604645},[268,215],{"size":136,"scale":2,"weight":0.6200000047683716},[279,226],{"size":162,"scale":1,"weight":0},[244,198],{"size":5,"scale":-1,"weight":0.4000000059604645},[10,9],{"size":106,"scale":2,"weight":0.30000001192092896},[206,167],{"size":14,"scale":2,"weight":0.6200000047683716},[29,23],{"size":158,"scale":1,"weight":0.4000000059604645},[247,200],{"size":53,"scale":3,"weight":-0.800000011920929},[124,100],{"size":76,"scale":1,"weight":-0.4000000059604645},[113,90],{"size":114,"scale":-1,"weight":-0.4000000059604645},[214,171],{"size":84,"scale":2,"weight":-0.6000000238418579},[155,122],{"size":56,"scale":2,"weight":-0.800000011920929},[102,82],{"size":133,"scale":1,"weight":0.4000000059604645},[208,168],{"size":121,"scale":3,"weight":0.23000000417232513},[298,239],{"size":89,"scale":2,"weight":0.4000000059604645},[176,143],{"size":94,"scale":1,"weight":0.23000000417232513},[144,117],{"size":106,"scale":3,"weight":0.4000000059604645},[268,216],{"size":68,"scale":-1,"weight":-0.4000000059604645},[128,102],{"size":114,"scale":3,"weight":0.23000000417232513},[281,226],{"size":125,"scale":-1,"weight":0},[238,187],{"size":4,"scale":3,"weight":0.6200000047683716},[11,9],{"size":71,"scale":3,"weight":0.4000000059604645},[179,145],{"size":65,"scale":2,"weight":0.4000000059604645},[129,104],{"size":117,"scale":1,"weight":-0.6000000238418579},[169,134],{"size":25,"scale":1,"weight":0.6200000047683716},[41,33],{"size":127,"scale":-1,"weight":0.5600000023841858},[256,207],{"size":24,"scale":3,"weight":0.4000000059604645},[61,49],{"size":52,"scale":-1,"weight":0.30000001192092896},[102,82],{"size":12,"scale":2,"weight":0.6200000047683716},[25,20],{"size":14,"scale":3,"weight":0.6200000047683716},[37,30],{"size":35,"scale":3,"weight":-0.6000000238418579},[83,66],{"size":140,"scale":1,"weight":0},[211,171],{"size":138,"scale":-1,"weight":-0.800000011920929},[251,201],{"size":157,"scale":-1,"weight":0},[299,235],{"size":28,"scale":-1,"weight":0.4000000059604645},[56,45],{"size":185,"scale":-1,"weight":0.4000000059604645},[366,295],{"size":142,"scale":3,"weight":-0.4000000059604645},[340,271],{"size":158,"scale":-1,"weight":0.30000001192092896},[308,249],{"size":125,"scale":2,"weight":0},[238,187],{"size":117,"scale":-1,"weight":0.30000001192092896},[228,184],{"size":194,"scale":3,"weight":0.23000000417232513},[478,384],{"size":61,"scale":3,"weight":-0.6000000238418579},[144,115],{"size":131,"scale":3,"weight":0.4000000059604645},[331,266],{"size":125,"scale":-1,"weight":0.23000000417232513},[241,195],{"size":126,"scale":-1,"weight":0},[240,188],{"size":42,"scale":1,"weight":0.5600000023841858},[67,55],{"size":157,"scale":2,"weight":-0.4000000059604645},[294,235],{"size":176,"scale":2,"weight":-0.800000011920929},[320,256],{"size":138,"scale":2,"weight":-0.800000011920929},[251,201],{"size":143,"scale":3,"weight":-0.800000011920929},[335,268],{"size":79,"scale":2,"weight":0.23000000417232513},[153,123],{"size":47,"scale":3,"weight":0.4000000059604645},[119,96],{"size":29,"scale":-1,"weight":0.23000000417232513},[56,46],{"size":120,"scale":2,"weight":0},[228,179],{"size":157,"scale":-1,"weight":0.30000001192092896},[306,247],{"size":51,"scale":3,"weight":0.23000000417232513},[126,101],{"size":125,"scale":2,"weight":0.23000000417232513},[241,195],{"size":181,"scale":3,"weight":-0.6000000238418579},[426,339],{"size":30,"scale":1,"weight":-0.800000011920929},[43,34],{"size":136,"scale":1,"weight":-0.6000000238418579},[197,156],{"size":98,"scale":1,"weight":0},[147,119],{"size":153,"scale":3,"weight":0.4000000059604645},[386,311],{"size":22,"scale":3,"weight":0.23000000417232513},[54,44],{"size":174,"scale":3,"weight":0.5600000023841858},[447,361],{"size":43,"scale":1,"weight":0.30000001192092896},[67,54],{"size":158,"scale":3,"weight":0.23000000417232513},[389,313],{"size":180,"scale":1,"weight":0.4000000059604645},[281,228],{"size":24,"scale":1,"weight":0.30000001192092896},[37,30],{"size":169,"scale":-1,"weight":0.4000000059604645},[334,269],{"size":174,"scale":-1,"weight":0.5600000023841858},[351,283],{"size":172,"scale":2,"weight":0.23000000417232513},[332,268],{"size":6,"scale":2,"weight":-0.6000000238418579},[11,9],{"size":61,"scale":-1,"weight":0.6200000047683716},[126,102],{"size":187,"scale":3,"weight":-0.6000000238418579},[440,350],{"size":69,"scale":1,"weight":0.6200000047683716},[112,90],{"size":108,"scale":-1,"weight":0.4000000059604645},[214,173],{"size":73,"scale":-1,"weight":0.23000000417232513},[141,114],{"size":87,"scale":1,"weight":-0.4000000059604645},[129,104],{"size":23,"scale":3,"weight":0.6200000047683716},[60,49],{"size":1,"scale":3,"weight":0},[3,2],{"size":2,"scale":-1,"weight":0.30000001192092896},[4,3],{"size":10,"scale":1,"weight":0.30000001192092896},[16,13],{"size":104,"scale":1,"weight":-0.800000011920929},[149,118],{"size":155,"scale":3,"weight":-0.800000011920929},[363,291],{"size":197,"scale":3,"weight":-0.4000000059604645},[472,375],{"size":20,"scale":2,"weight":-0.800000011920929},[37,29],{"size":159,"scale":3,"weight":-0.6000000238418579},[374,298],{"size":179,"scale":3,"weight":0.30000001192092896},[445,358],{"size":83,"scale":3,"weight":0.6200000047683716},[217,176],{"size":13,"scale":2,"weight":0},[25,20],{"size":186,"scale":-1,"weight":0.5600000023841858},[375,303],{"size":96,"scale":3,"weight":0.30000001192092896},[239,193],{"size":92,"scale":1,"weight":-0.4000000059604645},[137,110],{"size":19,"scale":-1,"weight":-0.6000000238418579},[35,28],{"size":52,"scale":2,"weight":-0.4000000059604645},[97,78],{"size":196,"scale":-1,"weight":-0.800000011920929},[356,285],{"size":14,"scale":1,"weight":0.23000000417232513},[21,18],{"size":179,"scale":2,"weight":-0.4000000059604645},[335,268],{"size":181,"scale":1,"weight":0},[272,221],{"size":144,"scale":2,"weight":0.30000001192092896},[281,227],{"size":102,"scale":1,"weight":0.30000001192092896},[157,128],{"size":108,"scale":2,"weight":0.23000000417232513},[208,168],{"size":116,"scale":3,"weight":-0.6000000238418579},[273,217],{"size":52,"scale":3,"weight":0},[127,102],{"size":175,"scale":1,"weight":0.5600000023841858},[278,226],{"size":160,"scale":1,"weight":0.30000001192092896},[246,200],{"size":64,"scale":-1,"weight":-0.4000000059604645},[120,96],{"size":128,"scale":-1,"weight":0.23000000417232513},[247,199],{"size":11,"scale":-1,"weight":0.6200000047683716},[23,19],{"size":42,"scale":-1,"weight":-0.800000011920929},[76,61],{"size":147,"scale":2,"weight":-0.6000000238418579},[270,213],{"size":103,"scale":-1,"weight":0.23000000417232513},[199,161],{"size":115,"scale":2,"weight":0},[219,173],{"size":188,"scale":1,"weight":0},[283,230],{"size":127,"scale":1,"weight":0},[191,155],{"size":92,"scale":3,"weight":0},[224,180],{"size":197,"scale":1,"weight":0.30000001192092896},[303,246],{"size":179,"scale":2,"weight":0.4000000059604645},[354,286],{"size":95,"scale":2,"weight":0.5600000023841858},[192,156],{"size":179,"scale":1,"weight":-0.6000000238418579},[259,204],{"size":121,"scale":2,"weight":0},[230,182],{"size":140,"scale":-1,"weight":-0.6000000238418579},[257,203],{"size":81,"scale":3,"weight":0},[197,158],{"size":186,"scale":1,"weight":0.4000000059604645},[290,235],{"size":71,"scale":-1,"weight":-0.4000000059604645},[133,106],{"size":127,"scale":3,"weight":0.6200000047683716},[332,269],{"size":7,"scale":3,"weight":0.30000001192092896},[18,15],{"size":157,"scale":-1,"weight":-0.4000000059604645},[294,235],{"size":92,"scale":2,"weight":0.4000000059604645},[182,147],{"size":67,"scale":1,"weight":0.4000000059604645},[105,85],{"size":107,"scale":-1,"weight":0.6200000047683716},[220,178],{"size":7,"scale":-1,"weight":-0.4000000059604645},[14,11],{"size":39,"scale":3,"weight":-0.4000000059604645},[94,75],{"size":126,"scale":1,"weight":0.23000000417232513},[192,156],{"size":167,"scale":1,"weight":0.4000000059604645},[260,211],{"size":160,"scale":-1,"weight":-0.6000000238418579},[294,232],{"size":85,"scale":3,"weight":0.6200000047683716},[222,180],{"size":82,"scale":-1,"weight":0.4000000059604645},[162,131],{"size":143,"scale":3,"weight":0},[347,279],{"size":100,"scale":3,"weight":0.6200000047683716},[262,212],{"size":184,"scale":-1,"weight":-0.6000000238418579},[338,267],{"size":108,"scale":2,"weight":0},[205,162],{"size":122,"scale":3,"weight":-0.800000011920929},[286,229],{"size":100,"scale":-1,"weight":0.4000000059604645},[198,159],{"size":51,"scale":1,"weight":0.30000001192092896},[78,64],{"size":153,"scale":3,"weight":0.23000000417232513},[377,302],{"size":68,"scale":3,"weight":-0.6000000238418579},[160,127],{"size":61,"scale":3,"weight":0.5600000023841858},[157,127],{"size":106,"scale":3,"weight":-0.6000000238418579},[250,199],{"size":25,"scale":3,"weight":0.23000000417232513},[62,50],{"size":199,"scale":-1,"weight":0},[378,298],{"size":172,"scale":1,"weight":0.6200000047683716},[278,226],{"size":193,"scale":-1,"weight":-0.800000011920929},[351,281],{"size":162,"scale":2,"weight":0.6200000047683716},[332,269],{"size":161,"scale":2,"weight":0.23000000417232513},[310,251],{"size":10,"scale":1,"weight":0},[16,12],{"size":123,"scale":-1,"weight":-0.800000011920929},[224,178],{"size":11,"scale":3,"weight":0.23000000417232513},[27,22],{"size":119,"scale":1,"weight":0.23000000417232513},[182,147],{"size":159,"scale":2,"weight":0.23000000417232513},[307,248],{"size":87,"scale":-1,"weight":0.6200000047683716},[179,145],{"size":176,"scale":3,"weight":0.6200000047683716},[459,372],{"size":9,"scale":-1,"weight":-0.800000011920929},[17,14],{"size":102,"scale":2,"weight":0.4000000059604645},[201,163],{"size":103,"scale":2,"weight":-0.800000011920929},[188,150],{"size":39,"scale":1,"weight":0.6200000047683716},[63,51],{"size":189,"scale":2,"weight":-0.4000000059604645},[354,283],{"size":71,"scale":3,"weight":0},[173,139],{"size":83,"scale":1,"weight":0.5600000023841858},[132,107],{"size":123,"scale":1,"weight":0.6200000047683716},[199,161],{"size":15,"scale":3,"weight":0.4000000059604645},[38,31],{"size":119,"scale":3,"weight":0.5600000023841858},[306,248],{"size":43,"scale":3,"weight":0.4000000059604645},[109,88],{"size":30,"scale":-1,"weight":0.30000001192092896},[59,47],{"size":181,"scale":2,"weight":-0.6000000238418579},[332,263],{"size":5,"scale":1,"weight":0.5600000023841858},[9,7],{"size":113,"scale":3,"weight":-0.6000000238418579},[266,211],{"size":38,"scale":1,"weight":0.4000000059604645},[60,48],{"size":111,"scale":1,"weight":0},[168,135],{"size":134,"scale":-1,"weight":0.30000001192092896},[261,211],{"size":117,"scale":3,"weight":-0.800000011920929},[275,219],{"size":157,"scale":3,"weight":0.30000001192092896},[390,314],{"size":136,"scale":3,"weight":0.30000001192092896},[338,273],{"size":63,"scale":1,"weight":0.23000000417232513},[96,79],{"size":177,"scale":1,"weight":0.23000000417232513},[269,219],{"size":141,"scale":-1,"weight":0},[268,211],{"size":84,"scale":-1,"weight":0.5600000023841858},[169,138],{"size":112,"scale":2,"weight":0},[213,167],{"size":16,"scale":-1,"weight":0.30000001192092896},[31,26],{"size":104,"scale":-1,"weight":0.6200000047683716},[213,173],{"size":35,"scale":1,"weight":-0.800000011920929},[50,40],{"size":92,"scale":3,"weight":-0.6000000238418579},[217,173],{"size":200,"scale":3,"weight":0.5600000023841858},[514,415],{"size":195,"scale":2,"weight":0.6200000047683716},[400,324],{"size":17,"scale":2,"weight":0.6200000047683716},[35,29],{"size":38,"scale":1,"weight":0.23000000417232513},[58,47],{"size":4,"scale":3,"weight":0.4000000059604645},[10,9],{"size":61,"scale":3,"weight":0.23000000417232513},[151,121],{"size":177,"scale":3,"weight":0.23000000417232513},[436,350],{"size":194,"scale":-1,"weight":-0.800000011920929},[352,282],{"size":83,"scale":-1,"weight":0.30000001192092896},[162,130],{"size":72,"scale":1,"weight":0.4000000059604645},[113,92],{"size":62,"scale":1,"weight":0.30000001192092896},[96,77],{"size":102,"scale":-1,"weight":0.23000000417232513},[197,159],{"size":132,"scale":-1,"weight":0},[251,198],{"size":106,"scale":2,"weight":0},[202,158],{"size":83,"scale":3,"weight":-0.6000000238418579},[196,156],{"size":29,"scale":1,"weight":0.4000000059604645},[46,37],{"size":188,"scale":3,"weight":0},[456,366],{"size":147,"scale":1,"weight":0.4000000059604645},[230,186],{"size":62,"scale":-1,"weight":0.23000000417232513},[120,97],{"size":1,"scale":1,"weight":-0.800000011920929},[2,1],{"size":161,"scale":2,"weight":0.5600000023841858},[324,263],{"size":145,"scale":-1,"weight":0.23000000417232513},[280,226],{"size":109,"scale":1,"weight":0.30000001192092896},[168,136],{"size":2,"scale":-1,"weight":0.5600000023841858},[4,3],{"size":147,"scale":1,"weight":0.23000000417232513},[224,182],{"size":98,"scale":-1,"weight":-0.4000000059604645},[183,147],{"size":107,"scale":-1,"weight":0.4000000059604645},[211,171],{"size":121,"scale":3,"weight":0},[294,236],{"size":79,"scale":2,"weight":0.5600000023841858},[159,129],{"size":191,"scale":2,"weight":0.4000000059604645},[377,305],{"size":163,"scale":-1,"weight":0.5600000023841858},[329,265],{"size":141,"scale":-1,"weight":0.5600000023841858},[284,230],{"size":16,"scale":2,"weight":0.23000000417232513},[31,26],{"size":119,"scale":1,"weight":0.4000000059604645},[185,150],{"size":98,"scale":1,"weight":-0.4000000059604645},[145,116],{"size":4,"scale":2,"weight":0.4000000059604645},[9,7],{"size":13,"scale":1,"weight":-0.6000000238418579},[20,16],{"size":142,"scale":1,"weight":0.30000001192092896},[218,177],{"size":163,"scale":2,"weight":-0.6000000238418579},[299,236],{"size":24,"scale":2,"weight":-0.800000011920929},[44,35],{"size":165,"scale":1,"weight":0},[249,202],{"size":146,"scale":1,"weight":-0.4000000059604645},[216,174],{"size":134,"scale":3,"weight":-0.800000011920929},[314,251],{"size":108,"scale":3,"weight":0.23000000417232513},[266,214],{"size":37,"scale":3,"weight":-0.800000011920929},[87,70],{"size":184,"scale":1,"weight":0.23000000417232513},[281,227],{"size":68,"scale":2,"weight":-0.6000000238418579},[125,99],{"size":195,"scale":-1,"weight":-0.4000000059604645},[365,292],{"size":62,"scale":1,"weight":0.23000000417232513},[95,77],{"size":200,"scale":2,"weight":0.5600000023841858},[403,326],{"size":176,"scale":1,"weight":-0.4000000059604645},[260,209],{"size":126,"scale":-1,"weight":-0.800000011920929},[229,183],{"size":79,"scale":2,"weight":0.30000001192092896},[154,125],{"size":5,"scale":2,"weight":0.23000000417232513},[10,8],{"size":143,"scale":1,"weight":0.6200000047683716},[232,188],{"size":165,"scale":-1,"weight":-0.4000000059604645},[309,247],{"size":138,"scale":3,"weight":0},[336,269],{"size":108,"scale":1,"weight":0.4000000059604645},[169,137],{"size":58,"scale":1,"weight":0.30000001192092896},[90,73],{"size":94,"scale":3,"weight":0.5600000023841858},[242,195],{"size":187,"scale":3,"weight":0.30000001192092896},[465,374],{"size":34,"scale":3,"weight":0.30000001192092896},[85,69],{"size":1,"scale":-1,"weight":0.5600000023841858},[2,2],{"size":117,"scale":1,"weight":0.5600000023841858},[186,151],{"size":139,"scale":-1,"weight":-0.6000000238418579},[255,201],{"size":142,"scale":1,"weight":0.4000000059604645},[222,179],{"size":27,"scale":1,"weight":0.5600000023841858},[43,36],{"size":135,"scale":3,"weight":0},[328,263],{"size":43,"scale":3,"weight":0.23000000417232513},[106,86],{"size":198,"scale":1,"weight":-0.6000000238418579},[286,226],{"size":56,"scale":3,"weight":-0.6000000238418579},[132,106],{"size":141,"scale":1,"weight":0.5600000023841858},[225,181],{"size":128,"scale":1,"weight":-0.4000000059604645},[190,153],{"size":173,"scale":2,"weight":0.6200000047683716},[355,287],{"size":96,"scale":3,"weight":-0.4000000059604645},[230,184],{"size":2,"scale":2,"weight":0.5600000023841858},[4,3],{"size":168,"scale":2,"weight":0.6200000047683716},[345,279],{"size":9,"scale":2,"weight":0.30000001192092896},[18,15],{"size":61,"scale":-1,"weight":0.5600000023841858},[124,100],{"size":148,"scale":-1,"weight":0.30000001192092896},[288,233],{"size":175,"scale":-1,"weight":0.4000000059604645},[346,280],{"size":12,"scale":1,"weight":-0.6000000238418579},[18,15],{"size":137,"scale":1,"weight":0.6200000047683716},[222,180],{"size":147,"scale":3,"weight":0},[357,286],{"size":23,"scale":3,"weight":0.4000000059604645},[58,47],{"size":119,"scale":2,"weight":-0.4000000059604645},[223,179],{"size":195,"scale":3,"weight":-0.6000000238418579},[459,365],{"size":64,"scale":1,"weight":0.5600000023841858},[102,83],{"size":70,"scale":-1,"weight":0.30000001192092896},[137,110],{"size":24,"scale":3,"weight":-0.800000011920929},[57,45],{"size":169,"scale":3,"weight":-0.4000000059604645},[405,322],{"size":19,"scale":2,"weight":0.23000000417232513},[37,30],{"size":17,"scale":-1,"weight":-0.800000011920929},[32,25],{"size":155,"scale":-1,"weight":0.6200000047683716},[319,257],{"size":131,"scale":2,"weight":0.5600000023841858},[264,214],{"size":62,"scale":-1,"weight":0.4000000059604645},[123,100],{"size":109,"scale":-1,"weight":0.6200000047683716},[224,181],{"size":116,"scale":2,"weight":-0.800000011920929},[211,169],{"size":33,"scale":3,"weight":0.23000000417232513},[81,65],{"size":75,"scale":-1,"weight":0.5600000023841858},[152,123],{"size":56,"scale":-1,"weight":0},[107,84],{"size":144,"scale":2,"weight":-0.800000011920929},[262,209],{"size":33,"scale":3,"weight":-0.800000011920929},[78,62],{"size":90,"scale":-1,"weight":-0.4000000059604645},[169,135],{"size":85,"scale":2,"weight":0.4000000059604645},[168,136],{"size":158,"scale":1,"weight":-0.6000000238418579},[228,181],{"size":101,"scale":2,"weight":0.30000001192092896},[197,160],{"size":174,"scale":3,"weight":-0.6000000238418579},[410,326],{"size":50,"scale":2,"weight":0.4000000059604645},[99,80],{"size":182,"scale":2,"weight":0.23000000417232513},[351,284],{"size":86,"scale":-1,"weight":-0.800000011920929},[156,125],{"size":95,"scale":1,"weight":0},[143,116],{"size":113,"scale":2,"weight":0.4000000059604645},[224,181],{"size":168,"scale":1,"weight":0.6200000047683716},[272,220],{"size":62,"scale":3,"weight":0.30000001192092896},[154,124],{"size":63,"scale":3,"weight":0.6200000047683716},[165,133],{"size":61,"scale":1,"weight":-0.4000000059604645},[90,72],{"size":110,"scale":1,"weight":0},[166,134],{"size":15,"scale":-1,"weight":0.5600000023841858},[31,25],{"size":147,"scale":2,"weight":0.30000001192092896},[286,232],{"size":130,"scale":-1,"weight":0.30000001192092896},[254,205],{"size":6,"scale":2,"weight":0.30000001192092896},[12,10],{"size":165,"scale":-1,"weight":-0.6000000238418579},[303,239],{"size":180,"scale":-1,"weight":0},[342,270],{"size":157,"scale":2,"weight":0.5600000023841858},[317,256],{"size":56,"scale":3,"weight":0.6200000047683716},[147,119],{"size":70,"scale":1,"weight":-0.4000000059604645},[104,84],{"size":177,"scale":2,"weight":-0.6000000238418579},[324,257],{"size":166,"scale":2,"weight":0.23000000417232513},[320,258],{"size":133,"scale":1,"weight":-0.6000000238418579},[192,152],{"size":124,"scale":-1,"weight":-0.6000000238418579},[228,180],{"size":78,"scale":-1,"weight":-0.800000011920929},[142,114],{"size":7,"scale":3,"weight":0},[18,15],{"size":31,"scale":2,"weight":0.6200000047683716},[64,51],{"size":172,"scale":-1,"weight":0},[327,258],{"size":174,"scale":2,"weight":0},[331,261],{"size":125,"scale":-1,"weight":0.5600000023841858},[252,204],{"size":157,"scale":1,"weight":0.5600000023841858},[250,202],{"size":106,"scale":3,"weight":0.6200000047683716},[277,224],{"size":12,"scale":1,"weight":-0.4000000059604645},[18,15],{"size":140,"scale":3,"weight":-0.6000000238418579},[330,263],{"size":14,"scale":-1,"weight":0},[27,21],{"size":178,"scale":1,"weight":0.5600000023841858},[284,229],{"size":196,"scale":3,"weight":-0.6000000238418579},[461,367],{"size":124,"scale":2,"weight":-0.4000000059604645},[232,186],{"size":72,"scale":1,"weight":0.5600000023841858},[115,93],{"size":75,"scale":2,"weight":-0.6000000238418579},[138,109],{"size":137,"scale":-1,"weight":0.5600000023841858},[276,224],{"size":195,"scale":-1,"weight":-0.6000000238418579},[357,283],{"size":174,"scale":1,"weight":0},[262,213],{"size":31,"scale":3,"weight":-0.4000000059604645},[75,60],{"size":107,"scale":2,"weight":0.23000000417232513},[207,167],{"size":105,"scale":2,"weight":-0.6000000238418579},[193,152],{"size":134,"scale":2,"weight":-0.800000011920929},[243,195],{"size":61,"scale":1,"weight":0.5600000023841858},[98,79],{"size":131,"scale":3,"weight":0.30000001192092896},[326,262],{"size":59,"scale":2,"weight":0.30000001192092896},[115,93],{"size":192,"scale":1,"weight":0.6200000047683716},[311,251],{"size":62,"scale":2,"weight":-0.6000000238418579},[114,90],{"size":150,"scale":2,"weight":0.6200000047683716},[308,249],{"size":128,"scale":3,"weight":-0.4000000059604645},[307,244],{"size":39,"scale":2,"weight":0},[74,58],{"size":124,"scale":-1,"weight":0},[236,186],{"size":153,"scale":1,"weight":0.6200000047683716},[248,200],{"size":190,"scale":2,"weight":0.5600000023841858},[383,310],{"size":200,"scale":-1,"weight":-0.6000000238418579},[366,290],{"size":95,"scale":-1,"weight":-0.800000011920929},[173,139],{"size":89,"scale":3,"weight":-0.4000000059604645},[213,170],{"size":12,"scale":3,"weight":0.6200000047683716},[32,26],{"size":69,"scale":2,"weight":0.5600000023841858},[139,113],{"size":111,"scale":2,"weight":-0.800000011920929},[202,161],{"size":102,"scale":3,"weight":0.6200000047683716},[266,216],{"size":128,"scale":2,"weight":0.30000001192092896},[249,201],{"size":145,"scale":-1,"weight":0.6200000047683716},[298,241],{"size":186,"scale":2,"weight":0.6200000047683716},[382,308],{"size":161,"scale":2,"weight":0.4000000059604645},[318,257],{"size":88,"scale":1,"weight":0.5600000023841858},[140,114],{"size":94,"scale":-1,"weight":-0.6000000238418579},[173,136],{"size":50,"scale":2,"weight":0.6200000047683716},[103,84],{"size":36,"scale":1,"weight":0.6200000047683716},[59,48],{"size":8,"scale":-1,"weight":0.23000000417232513},[16,13],{"size":147,"scale":3,"weight":0.4000000059604645},[371,299],{"size":95,"scale":3,"weight":0.30000001192092896},[236,190],{"size":54,"scale":-1,"weight":0},[103,81],{"size":115,"scale":1,"weight":0.30000001192092896},[177,144],{"size":25,"scale":-1,"weight":-0.4000000059604645},[47,37],{"size":121,"scale":1,"weight":-0.4000000059604645},[179,144],{"size":131,"scale":3,"weight":-0.800000011920929},[307,246],{"size":107,"scale":3,"weight":0.4000000059604645},[270,218],{"size":157,"scale":2,"weight":0},[299,235],{"size":100,"scale":3,"weight":-0.800000011920929},[234,188],{"size":17,"scale":1,"weight":0.30000001192092896},[27,21],{"size":83,"scale":3,"weight":0},[202,162],{"size":6,"scale":2,"weight":0.5600000023841858},[12,10],{"size":86,"scale":3,"weight":0.6200000047683716},[225,181],{"size":198,"scale":-1,"weight":0.30000001192092896},[386,312],{"size":72,"scale":2,"weight":-0.6000000238418579},[132,105],{"size":87,"scale":2,"weight":0.6200000047683716},[179,145],{"size":166,"scale":2,"weight":-0.4000000059604645},[311,249],{"size":87,"scale":1,"weight":-0.800000011920929},[124,99],{"size":22,"scale":1,"weight":0.4000000059604645},[35,28],{"size":142,"scale":3,"weight":-0.800000011920929},[333,267],{"size":161,"scale":1,"weight":0.6200000047683716},[261,211],{"size":157,"scale":-1,"weight":0.4000000059604645},[310,250],{"size":37,"scale":2,"weight":0},[71,56],{"size":74,"scale":-1,"weight":0},[141,111],{"size":66,"scale":3,"weight":0.30000001192092896},[164,133],{"size":124,"scale":1,"weight":-0.6000000238418579},[179,142],{"size":146,"scale":1,"weight":-0.6000000238418579},[211,167],{"size":8,"scale":1,"weight":-0.6000000238418579},[12,10],{"size":194,"scale":3,"weight":0.5600000023841858},[498,403],{"size":80,"scale":-1,"weight":-0.4000000059604645},[150,120],{"size":181,"scale":3,"weight":-0.4000000059604645},[434,345],{"size":136,"scale":2,"weight":0},[258,204],{"size":97,"scale":1,"weight":0.5600000023841858},[155,125],{"size":184,"scale":2,"weight":0.30000001192092896},[359,290],{"size":107,"scale":1,"weight":0.5600000023841858},[170,138],{"size":154,"scale":2,"weight":-0.4000000059604645},[288,231],{"size":17,"scale":2,"weight":-0.6000000238418579},[32,25],{"size":115,"scale":2,"weight":-0.4000000059604645},[215,172],{"size":197,"scale":2,"weight":0.4000000059604645},[389,314],{"size":192,"scale":2,"weight":-0.6000000238418579},[352,278],{"size":26,"scale":3,"weight":-0.800000011920929},[61,49],{"size":181,"scale":2,"weight":-0.800000011920929},[329,263],{"size":33,"scale":2,"weight":0.23000000417232513},[64,52],{"size":165,"scale":3,"weight":0.5600000023841858},[424,343],{"size":60,"scale":1,"weight":-0.800000011920929},[86,68],{"size":9,"scale":2,"weight":-0.6000000238418579},[17,14],{"size":28,"scale":1,"weight":0.6200000047683716},[45,37],{"size":131,"scale":3,"weight":-0.6000000238418579},[308,245],{"size":25,"scale":1,"weight":0.4000000059604645},[39,32],{"size":123,"scale":3,"weight":0.5600000023841858},[316,256],{"size":86,"scale":2,"weight":0.4000000059604645},[170,138],{"size":183,"scale":1,"weight":-0.6000000238418579},[265,209],{"size":79,"scale":1,"weight":0.5600000023841858},[126,102],{"size":68,"scale":3,"weight":0.6200000047683716},[178,144],{"size":148,"scale":-1,"weight":-0.6000000238418579},[272,215],{"size":175,"scale":-1,"weight":-0.800000011920929},[318,255],{"size":3,"scale":1,"weight":0.6200000047683716},[6,4],{"size":192,"scale":2,"weight":0.4000000059604645},[379,306],{"size":134,"scale":3,"weight":0},[326,261],{"size":90,"scale":2,"weight":0.23000000417232513},[174,141],{"size":67,"scale":-1,"weight":0.4000000059604645},[133,108],{"size":158,"scale":-1,"weight":0.23000000417232513},[305,246],{"size":182,"scale":-1,"weight":-0.800000011920929},[330,265],{"size":78,"scale":3,"weight":-0.6000000238418579},[184,147],{"size":70,"scale":3,"weight":0.6200000047683716},[183,148],{"size":31,"scale":1,"weight":-0.6000000238418579},[45,36],{"size":151,"scale":2,"weight":0},[287,226],{"size":146,"scale":3,"weight":0.5600000023841858},[375,303],{"size":172,"scale":-1,"weight":0.4000000059604645},[340,275],{"size":22,"scale":3,"weight":0.6200000047683716},[58,47],{"size":124,"scale":2,"weight":0.5600000023841858},[251,203],{"size":61,"scale":3,"weight":0.4000000059604645},[154,125],{"size":72,"scale":1,"weight":0},[109,88],{"size":157,"scale":1,"weight":-0.800000011920929},[224,178],{"size":45,"scale":3,"weight":0.30000001192092896},[112,90],{"size":105,"scale":2,"weight":-0.800000011920929},[191,153],{"size":162,"scale":-1,"weight":0.30000001192092896},[315,255],{"size":169,"scale":1,"weight":-0.4000000059604645},[250,201],{"size":157,"scale":-1,"weight":0.6200000047683716},[322,260],{"size":155,"scale":3,"weight":-0.6000000238418579},[365,290],{"size":136,"scale":-1,"weight":0.6200000047683716},[279,226],{"size":164,"scale":2,"weight":0.6200000047683716},[337,273],{"size":162,"scale":3,"weight":-0.800000011920929},[379,304],{"size":151,"scale":1,"weight":0.30000001192092896},[233,189],{"size":154,"scale":3,"weight":-0.4000000059604645},[369,294],{"size":37,"scale":1,"weight":0.6200000047683716},[60,49],{"size":32,"scale":3,"weight":0.5600000023841858},[83,67],{"size":58,"scale":2,"weight":0.30000001192092896},[113,92],{"size":200,"scale":1,"weight":-0.4000000059604645},[296,237],{"size":37,"scale":1,"weight":-0.4000000059604645},[55,44],{"size":68,"scale":3,"weight":0},[165,132],{"size":39,"scale":2,"weight":-0.6000000238418579},[72,57],{"size":198,"scale":3,"weight":0.5600000023841858},[509,412],{"size":83,"scale":1,"weight":-0.6000000238418579},[120,95],{"size":119,"scale":1,"weight":0.6200000047683716},[193,156],{"size":66,"scale":-1,"weight":-0.800000011920929},[120,97],{"size":177,"scale":-1,"weight":0.4000000059604645},[350,283],{"size":157,"scale":3,"weight":0.23000000417232513},[387,310],{"size":121,"scale":-1,"weight":0.4000000059604645},[239,193],{"size":135,"scale":3,"weight":0.4000000059604645},[341,274],{"size":33,"scale":1,"weight":0.5600000023841858},[53,43],{"size":200,"scale":1,"weight":-0.800000011920929},[286,227],{"size":127,"scale":2,"weight":-0.4000000059604645},[238,190],{"size":183,"scale":-1,"weight":0.6200000047683716},[376,304],{"size":151,"scale":-1,"weight":0.23000000417232513},[291,235],{"size":9,"scale":2,"weight":0.4000000059604645},[18,15],{"size":127,"scale":3,"weight":-0.6000000238418579},[299,238],{"size":130,"scale":-1,"weight":-0.4000000059604645},[243,195],{"size":43,"scale":-1,"weight":0},[82,65],{"size":108,"scale":3,"weight":-0.800000011920929},[253,203],{"size":103,"scale":3,"weight":-0.6000000238418579},[243,193],{"size":13,"scale":1,"weight":0.5600000023841858},[21,17],{"size":103,"scale":3,"weight":0.5600000023841858},[265,214],{"size":165,"scale":2,"weight":0.4000000059604645},[327,264],{"size":134,"scale":1,"weight":0.30000001192092896},[206,167],{"size":149,"scale":-1,"weight":0},[283,223],{"size":17,"scale":-1,"weight":0.4000000059604645},[34,28],{"size":116,"scale":1,"weight":-0.6000000238418579},[168,133],{"size":110,"scale":-1,"weight":0},[210,165],{"size":58,"scale":1,"weight":-0.800000011920929},[83,66],{"size":183,"scale":2,"weight":0.5600000023841858},[369,298],{"size":97,"scale":3,"weight":0.6200000047683716},[254,205],{"size":177,"scale":-1,"weight":0.23000000417232513},[341,276],{"size":36,"scale":-1,"weight":0},[69,54],{"size":74,"scale":1,"weight":0.5600000023841858},[118,95],{"size":56,"scale":3,"weight":0.5600000023841858},[144,117],{"size":168,"scale":3,"weight":0.30000001192092896},[418,337],{"size":65,"scale":3,"weight":-0.800000011920929},[153,123],{"size":52,"scale":1,"weight":0.30000001192092896},[81,65],{"size":199,"scale":-1,"weight":0.5600000023841858},[401,325],{"size":163,"scale":2,"weight":0.23000000417232513},[314,253],{"size":77,"scale":3,"weight":0.23000000417232513},[189,152],{"size":29,"scale":3,"weight":-0.800000011920929},[68,55],{"size":170,"scale":-1,"weight":0.4000000059604645},[336,272],{"size":121,"scale":-1,"weight":-0.6000000238418579},[222,175],{"size":119,"scale":2,"weight":-0.800000011920929},[217,173],{"size":192,"scale":1,"weight":0.30000001192092896},[296,239],{"size":183,"scale":2,"weight":0.30000001192092896},[357,288],{"size":80,"scale":-1,"weight":0},[152,120],{"size":90,"scale":1,"weight":0.30000001192092896},[139,112],{"size":142,"scale":-1,"weight":0.5600000023841858},[286,232],{"size":198,"scale":2,"weight":0.23000000417232513},[381,309],{"size":146,"scale":-1,"weight":0.5600000023841858},[294,238],{"size":106,"scale":1,"weight":0.30000001192092896},[163,132],{"size":4,"scale":2,"weight":0.30000001192092896},[8,7],{"size":94,"scale":1,"weight":-0.800000011920929},[134,107],{"size":186,"scale":3,"weight":-0.800000011920929},[436,349],{"size":171,"scale":-1,"weight":0.4000000059604645},[338,273],{"size":138,"scale":2,"weight":0.23000000417232513},[266,215],{"size":71,"scale":1,"weight":0},[107,87],{"size":27,"scale":1,"weight":-0.800000011920929},[39,31],{"size":190,"scale":-1,"weight":0.5600000023841858},[383,310],{"size":15,"scale":-1,"weight":0.30000001192092896},[30,24],{"size":41,"scale":2,"weight":-0.4000000059604645},[77,62],{"size":58,"scale":3,"weight":0.23000000417232513},[143,115],{"size":118,"scale":1,"weight":0.4000000059604645},[184,149],{"size":31,"scale":1,"weight":0.5600000023841858},[50,40],{"size":50,"scale":1,"weight":0.6200000047683716},[81,66],{"size":13,"scale":2,"weight":-0.4000000059604645},[25,20],{"size":36,"scale":2,"weight":-0.800000011920929},[66,52],{"size":34,"scale":2,"weight":-0.4000000059604645},[64,51],{"size":176,"scale":-1,"weight":-0.800000011920929},[320,256],{"size":77,"scale":3,"weight":0.5600000023841858},[198,160],{"size":45,"scale":-1,"weight":-0.800000011920929},[82,66],{"size":182,"scale":2,"weight":0.5600000023841858},[367,297],{"size":140,"scale":2,"weight":-0.4000000059604645},[262,209],{"size":23,"scale":-1,"weight":0.6200000047683716},[48,39],{"size":1,"scale":1,"weight":-0.4000000059604645},[2,2],{"size":59,"scale":3,"weight":0.4000000059604645},[149,120],{"size":115,"scale":3,"weight":0.6200000047683716},[301,243],{"size":149,"scale":-1,"weight":0.23000000417232513},[288,232],{"size":61,"scale":1,"weight":0.30000001192092896},[94,76],{"size":49,"scale":-1,"weight":0.23000000417232513},[94,77],{"size":63,"scale":3,"weight":0.4000000059604645},[159,128],{"size":57,"scale":2,"weight":0.23000000417232513},[110,89],{"size":12,"scale":2,"weight":0.30000001192092896},[24,19],{"size":168,"scale":2,"weight":0.30000001192092896},[328,264],{"size":49,"scale":-1,"weight":0.5600000023841858},[99,81],{"size":13,"scale":2,"weight":0.4000000059604645},[26,21],{"size":44,"scale":2,"weight":-0.4000000059604645},[83,67],{"size":15,"scale":1,"weight":0.6200000047683716},[25,20],{"size":124,"scale":3,"weight":0.5600000023841858},[318,258],{"size":124,"scale":1,"weight":0.30000001192092896},[191,155],{"size":20,"scale":2,"weight":-0.6000000238418579},[37,29],{"size":94,"scale":2,"weight":0.6200000047683716},[193,156],{"size":38,"scale":-1,"weight":-0.4000000059604645},[71,58],{"size":6,"scale":3,"weight":0.5600000023841858},[16,13],{"size":14,"scale":-1,"weight":0.5600000023841858},[29,23],{"size":53,"scale":1,"weight":0.23000000417232513},[81,66],{"size":144,"scale":-1,"weight":0},[274,216],{"size":6,"scale":1,"weight":0.4000000059604645},[10,8],{"size":107,"scale":-1,"weight":0.23000000417232513},[207,167],{"size":173,"scale":-1,"weight":-0.4000000059604645},[324,259],{"size":101,"scale":-1,"weight":0.30000001192092896},[197,160],{"size":49,"scale":-1,"weight":0.4000000059604645},[97,79],{"size":107,"scale":1,"weight":0},[161,131],{"size":123,"scale":1,"weight":-0.6000000238418579},[178,141],{"size":113,"scale":-1,"weight":0.4000000059604645},[224,181],{"size":179,"scale":3,"weight":0},[435,348],{"size":57,"scale":2,"weight":0.5600000023841858},[115,93],{"size":66,"scale":3,"weight":-0.4000000059604645},[159,126],{"size":126,"scale":1,"weight":0.5600000023841858},[200,162],{"size":126,"scale":2,"weight":0.6200000047683716},[259,209],{"size":192,"scale":3,"weight":-0.800000011920929},[450,360],{"size":153,"scale":3,"weight":-0.6000000238418579},[360,286],{"size":68,"scale":3,"weight":0.5600000023841858},[175,141],{"size":171,"scale":2,"weight":0.6200000047683716},[351,284],{"size":172,"scale":1,"weight":0.4000000059604645},[268,218],{"size":57,"scale":1,"weight":0.6200000047683716},[92,75],{"size":144,"scale":-1,"weight":0.6200000047683716},[296,239],{"size":104,"scale":2,"weight":-0.4000000059604645},[195,156],{"size":136,"scale":-1,"weight":0.4000000059604645},[269,218],{"size":172,"scale":2,"weight":0.5600000023841858},[347,280],{"size":36,"scale":-1,"weight":-0.800000011920929},[66,52],{"size":68,"scale":3,"weight":0.30000001192092896},[170,136],{"size":170,"scale":3,"weight":0},[413,331],{"size":19,"scale":1,"weight":0.6200000047683716},[31,26],{"size":145,"scale":1,"weight":-0.800000011920929},[207,165],{"size":35,"scale":-1,"weight":0},[67,53],{"size":196,"scale":3,"weight":0.23000000417232513},[483,388],{"size":42,"scale":1,"weight":-0.6000000238418579},[61,49],{"size":47,"scale":2,"weight":0.30000001192092896},[92,74],{"size":135,"scale":-1,"weight":0.6200000047683716},[277,225],{"size":83,"scale":-1,"weight":-0.800000011920929},[151,120],{"size":67,"scale":2,"weight":0.6200000047683716},[138,112],{"size":142,"scale":3,"weight":0.6200000047683716},[371,300],{"size":150,"scale":2,"weight":0.23000000417232513},[289,233],{"size":101,"scale":-1,"weight":0.6200000047683716},[208,168],{"size":155,"scale":-1,"weight":0.23000000417232513},[299,241],{"size":185,"scale":3,"weight":0.30000001192092896},[460,371],{"size":165,"scale":1,"weight":-0.6000000238418579},[238,189],{"size":65,"scale":3,"weight":-0.4000000059604645},[156,125],{"size":83,"scale":2,"weight":-0.800000011920929},[151,120],{"size":79,"scale":3,"weight":-0.6000000238418579},[187,148],{"size":77,"scale":2,"weight":0.6200000047683716},[159,128],{"size":112,"scale":-1,"weight":0},[213,167],{"size":71,"scale":2,"weight":-0.800000011920929},[130,103],{"size":173,"scale":1,"weight":0.6200000047683716},[280,227],{"size":122,"scale":1,"weight":0.4000000059604645},[191,155],{"size":47,"scale":1,"weight":0.30000001192092896},[73,59],{"size":97,"scale":3,"weight":0},[236,189],{"size":170,"scale":1,"weight":0.23000000417232513},[259,210],{"size":113,"scale":3,"weight":0.6200000047683716},[295,238],{"size":167,"scale":2,"weight":0.5600000023841858},[337,272],{"size":140,"scale":-1,"weight":-0.800000011920929},[255,203],{"size":158,"scale":2,"weight":0.5600000023841858},[319,258],{"size":111,"scale":1,"weight":0.30000001192092896},[171,139],{"size":61,"scale":2,"weight":0.23000000417232513},[118,96],{"size":17,"scale":3,"weight":0.6200000047683716},[45,37],{"size":113,"scale":3,"weight":0.5600000023841858},[290,234],{"size":180,"scale":3,"weight":0.4000000059604645},[454,366],{"size":198,"scale":3,"weight":0.4000000059604645},[499,403],{"size":184,"scale":3,"weight":0.30000001192092896},[458,368],{"size":19,"scale":-1,"weight":0.30000001192092896},[37,30],{"size":182,"scale":2,"weight":0.30000001192092896},[355,287],{"size":182,"scale":-1,"weight":-0.6000000238418579},[333,264],{"size":111,"scale":1,"weight":-0.6000000238418579},[160,127],{"size":3,"scale":2,"weight":-0.4000000059604645},[6,5],{"size":200,"scale":1,"weight":0.4000000059604645},[312,253],{"size":191,"scale":3,"weight":0},[464,372],{"size":159,"scale":3,"weight":0.4000000059604645},[401,323],{"size":21,"scale":-1,"weight":-0.4000000059604645},[40,32],{"size":18,"scale":3,"weight":-0.4000000059604645},[43,35],{"size":112,"scale":2,"weight":-0.6000000238418579},[206,163],{"size":44,"scale":-1,"weight":-0.4000000059604645},[83,67],{"size":163,"scale":3,"weight":-0.800000011920929},[381,306],{"size":112,"scale":1,"weight":-0.6000000238418579},[162,128],{"size":25,"scale":2,"weight":0.5600000023841858},[51,41],{"size":187,"scale":2,"weight":0.30000001192092896},[365,295],{"size":16,"scale":3,"weight":0.6200000047683716},[42,35],{"size":182,"scale":2,"weight":-0.6000000238418579},[333,264],{"size":121,"scale":1,"weight":0.4000000059604645},[189,154],{"size":144,"scale":3,"weight":0.5600000023841858},[370,299],{"size":100,"scale":-1,"weight":-0.4000000059604645},[188,149],{"size":24,"scale":2,"weight":0.30000001192092896},[47,38],{"size":139,"scale":3,"weight":0.5600000023841858},[357,289],{"size":55,"scale":2,"weight":0},[105,83],{"size":48,"scale":2,"weight":0.23000000417232513},[93,75],{"size":30,"scale":1,"weight":-0.4000000059604645},[45,36],{"size":58,"scale":1,"weight":0.4000000059604645},[90,74],{"size":42,"scale":3,"weight":0.30000001192092896},[105,84],{"size":4,"scale":-1,"weight":-0.800000011920929},[8,7],{"size":141,"scale":-1,"weight":0.23000000417232513},[272,220],{"size":52,"scale":3,"weight":-0.6000000238418579},[123,98],{"size":9,"scale":1,"weight":0.6200000047683716},[15,12],{"size":41,"scale":3,"weight":0.6200000047683716},[107,87],{"size":151,"scale":-1,"weight":-0.6000000238418579},[277,219],{"size":132,"scale":2,"weight":0.23000000417232513},[254,206],{"size":145,"scale":1,"weight":0},[218,177],{"size":142,"scale":-1,"weight":-0.6000000238418579},[261,206],{"size":118,"scale":2,"weight":0.5600000023841858},[238,193],{"size":43,"scale":1,"weight":0.6200000047683716},[70,57],{"size":105,"scale":1,"weight":0.23000000417232513},[160,130],{"size":10,"scale":3,"weight":0.30000001192092896},[26,20],{"size":6,"scale":2,"weight":0.23000000417232513},[12,10],{"size":54,"scale":1,"weight":-0.4000000059604645},[80,64],{"size":71,"scale":3,"weight":0.6200000047683716},[186,150],{"size":115,"scale":-1,"weight":0.4000000059604645},[227,184],{"size":76,"scale":3,"weight":0.23000000417232513},[187,151],{"size":67,"scale":3,"weight":-0.800000011920929},[158,126],{"size":42,"scale":2,"weight":0.6200000047683716},[87,70],{"size":116,"scale":2,"weight":0.4000000059604645},[229,185],{"size":29,"scale":2,"weight":0.5600000023841858},[59,48],{"size":60,"scale":1,"weight":0},[91,73],{"size":86,"scale":1,"weight":-0.800000011920929},[123,98],{"size":99,"scale":3,"weight":-0.6000000238418579},[233,185],{"size":53,"scale":3,"weight":0.30000001192092896},[133,107],{"size":7,"scale":-1,"weight":-0.800000011920929},[14,10],{"size":19,"scale":3,"weight":0.30000001192092896},[47,38],{"size":131,"scale":3,"weight":-0.4000000059604645},[314,249],{"size":58,"scale":3,"weight":0.30000001192092896},[145,116],{"size":128,"scale":1,"weight":0.23000000417232513},[195,159],{"size":104,"scale":3,"weight":0.30000001192092896},[259,208],{"size":98,"scale":2,"weight":-0.800000011920929},[178,143],{"size":193,"scale":2,"weight":0.30000001192092896},[376,304],{"size":110,"scale":1,"weight":-0.800000011920929},[157,125],{"size":99,"scale":3,"weight":0.23000000417232513},[244,196],{"size":198,"scale":1,"weight":-0.4000000059604645},[293,235],{"size":13,"scale":1,"weight":0.4000000059604645},[21,17],{"size":73,"scale":2,"weight":-0.6000000238418579},[134,106],{"size":98,"scale":3,"weight":0},[238,191],{"size":160,"scale":3,"weight":0.4000000059604645},[404,325],{"size":38,"scale":3,"weight":0.4000000059604645},[96,78],{"size":59,"scale":2,"weight":0.23000000417232513},[114,92],{"size":34,"scale":3,"weight":0.4000000059604645},[86,70],{"size":158,"scale":1,"weight":0.6200000047683716},[256,207],{"size":24,"scale":2,"weight":0.5600000023841858},[49,39],{"size":22,"scale":3,"weight":-0.4000000059604645},[53,42],{"size":96,"scale":3,"weight":0.6200000047683716},[251,203],{"size":159,"scale":-1,"weight":0.30000001192092896},[310,251],{"size":9,"scale":3,"weight":0.5600000023841858},[23,19],{"size":140,"scale":1,"weight":0.23000000417232513},[213,173],{"size":122,"scale":-1,"weight":0.4000000059604645},[242,195],{"size":80,"scale":3,"weight":-0.4000000059604645},[192,153],{"size":48,"scale":2,"weight":0.6200000047683716},[99,80],{"size":154,"scale":1,"weight":-0.6000000238418579},[223,176],{"size":166,"scale":3,"weight":0.30000001192092896},[413,332],{"size":197,"scale":-1,"weight":0.4000000059604645},[389,314],{"size":76,"scale":2,"weight":0},[144,114],{"size":53,"scale":2,"weight":-0.4000000059604645},[100,79],{"size":76,"scale":2,"weight":-0.6000000238418579},[140,110],{"size":85,"scale":-1,"weight":0.30000001192092896},[166,134],{"size":155,"scale":2,"weight":0.30000001192092896},[302,244],{"size":72,"scale":1,"weight":-0.6000000238418579},[104,83],{"size":90,"scale":-1,"weight":0.30000001192092896},[176,142],{"size":124,"scale":1,"weight":0.5600000023841858},[197,160],{"size":130,"scale":1,"weight":0},[196,159],{"size":19,"scale":3,"weight":0.6200000047683716},[50,40],{"size":200,"scale":3,"weight":0},[486,390],{"size":141,"scale":3,"weight":0.4000000059604645},[356,287],{"size":123,"scale":2,"weight":0.5600000023841858},[248,200],{"size":158,"scale":2,"weight":0.30000001192092896},[308,249],{"size":83,"scale":1,"weight":-0.4000000059604645},[123,98],{"size":167,"scale":3,"weight":0.5600000023841858},[429,347],{"size":155,"scale":1,"weight":0.23000000417232513},[237,192],{"size":16,"scale":2,"weight":0.30000001192092896},[31,26],{"size":189,"scale":-1,"weight":0.30000001192092896},[368,298],{"size":82,"scale":3,"weight":-0.800000011920929},[192,154],{"size":119,"scale":2,"weight":0.6200000047683716},[244,198],{"size":144,"scale":1,"weight":0.5600000023841858},[229,186],{"size":135,"scale":-1,"weight":0.5600000023841858},[272,221],{"size":131,"scale":3,"weight":0.6200000047683716},[342,276],{"size":28,"scale":2,"weight":0.5600000023841858},[57,46],{"size":8,"scale":1,"weight":0},[12,10],{"size":145,"scale":2,"weight":0.23000000417232513},[280,226],{"size":134,"scale":3,"weight":-0.4000000059604645},[321,255],{"size":178,"scale":2,"weight":0.4000000059604645},[351,284],{"size":33,"scale":3,"weight":0.6200000047683716},[87,70],{"size":55,"scale":-1,"weight":0.6200000047683716},[113,92],{"size":121,"scale":3,"weight":0.5600000023841858},[312,251],{"size":86,"scale":-1,"weight":0},[164,129],{"size":93,"scale":3,"weight":0.4000000059604645},[234,189],{"size":150,"scale":2,"weight":0.30000001192092896},[293,236],{"size":199,"scale":3,"weight":0.6200000047683716},[519,420],{"size":103,"scale":1,"weight":0.30000001192092896},[159,129],{"size":170,"scale":2,"weight":0},[324,254],{"size":173,"scale":3,"weight":0.4000000059604645},[436,352],{"size":46,"scale":1,"weight":0.6200000047683716},[74,60],{"size":132,"scale":3,"weight":-0.800000011920929},[309,248],{"size":30,"scale":-1,"weight":0},[57,45],{"size":101,"scale":1,"weight":0.23000000417232513},[154,125],{"size":109,"scale":3,"weight":0.4000000059604645},[275,222],{"size":85,"scale":3,"weight":-0.800000011920929},[199,160],{"size":87,"scale":-1,"weight":0.30000001192092896},[169,137],{"size":129,"scale":1,"weight":0.6200000047683716},[209,169],{"size":45,"scale":1,"weight":0.23000000417232513},[68,56],{"size":25,"scale":-1,"weight":0},[48,37],{"size":18,"scale":1,"weight":0.23000000417232513},[28,22],{"size":190,"scale":1,"weight":0.4000000059604645},[297,240],{"size":115,"scale":2,"weight":0.5600000023841858},[232,188],{"size":188,"scale":2,"weight":0.23000000417232513},[362,293],{"size":104,"scale":-1,"weight":0},[197,156],{"size":149,"scale":3,"weight":0.5600000023841858},[383,310],{"size":50,"scale":2,"weight":-0.800000011920929},[91,73],{"size":54,"scale":-1,"weight":0.6200000047683716},[111,90],{"size":185,"scale":1,"weight":0.6200000047683716},[299,242],{"size":102,"scale":3,"weight":-0.800000011920929},[239,192],{"size":129,"scale":3,"weight":-0.6000000238418579},[304,242],{"size":196,"scale":-1,"weight":0},[372,293],{"size":124,"scale":1,"weight":-0.800000011920929},[178,141],{"size":39,"scale":1,"weight":-0.800000011920929},[56,44],{"size":107,"scale":2,"weight":0},[204,161],{"size":9,"scale":-1,"weight":-0.4000000059604645},[17,14],{"size":35,"scale":-1,"weight":0.5600000023841858},[71,57],{"size":191,"scale":3,"weight":0.6200000047683716},[499,403],{"size":126,"scale":3,"weight":0.23000000417232513},[310,249],{"size":51,"scale":1,"weight":-0.800000011920929},[73,58],{"size":140,"scale":2,"weight":0.23000000417232513},[270,218],{"size":66,"scale":3,"weight":0.5600000023841858},[170,138],{"size":103,"scale":2,"weight":0},[196,154],{"size":35,"scale":-1,"weight":0.23000000417232513},[67,55],{"size":121,"scale":3,"weight":-0.6000000238418579},[285,226],{"size":165,"scale":1,"weight":-0.800000011920929},[236,188],{"size":39,"scale":2,"weight":0.4000000059604645},[77,63],{"size":42,"scale":2,"weight":0},[80,63],{"size":79,"scale":2,"weight":-0.800000011920929},[144,115],{"size":149,"scale":-1,"weight":0.6200000047683716},[306,248],{"size":194,"scale":-1,"weight":0},[369,291],{"size":55,"scale":2,"weight":0.23000000417232513},[107,86],{"size":175,"scale":-1,"weight":0.23000000417232513},[337,273],{"size":119,"scale":2,"weight":0.30000001192092896},[232,188],{"size":124,"scale":1,"weight":0.4000000059604645},[193,157],{"size":20,"scale":-1,"weight":0.4000000059604645},[40,32],{"size":36,"scale":3,"weight":0.23000000417232513},[89,72],{"size":32,"scale":-1,"weight":-0.4000000059604645},[60,49],{"size":129,"scale":3,"weight":0},[313,251],{"size":124,"scale":3,"weight":0.6200000047683716},[324,262],{"size":158,"scale":3,"weight":-0.6000000238418579},[372,296],{"size":113,"scale":-1,"weight":0.30000001192092896},[220,178],{"size":170,"scale":1,"weight":-0.4000000059604645},[251,202],{"size":100,"scale":-1,"weight":0.5600000023841858},[202,163],{"size":28,"scale":-1,"weight":0.23000000417232513},[54,44],{"size":16,"scale":2,"weight":0.5600000023841858},[32,27],{"size":83,"scale":-1,"weight":0.23000000417232513},[161,129],{"size":14,"scale":1,"weight":0.5600000023841858},[23,19],{"size":192,"scale":-1,"weight":-0.4000000059604645},[359,287],{"size":64,"scale":3,"weight":-0.800000011920929},[151,120],{"size":67,"scale":1,"weight":0},[101,82],{"size":181,"scale":-1,"weight":-0.6000000238418579},[332,263],{"size":26,"scale":2,"weight":-0.6000000238418579},[48,39],{"size":75,"scale":2,"weight":0.30000001192092896},[147,118],{"size":68,"scale":2,"weight":-0.4000000059604645},[128,102],{"size":184,"scale":1,"weight":-0.800000011920929},[263,209],{"size":43,"scale":2,"weight":0.5600000023841858},[87,71],{"size":116,"scale":-1,"weight":0.6200000047683716},[239,193],{"size":130,"scale":-1,"weight":-0.6000000238418579},[239,189],{"size":74,"scale":-1,"weight":-0.4000000059604645},[139,111],{"size":130,"scale":2,"weight":0.23000000417232513},[251,203],{"size":154,"scale":3,"weight":-0.800000011920929},[361,289],{"size":9,"scale":-1,"weight":0},[18,14],{"size":156,"scale":-1,"weight":0},[297,233],{"size":164,"scale":2,"weight":0.30000001192092896},[320,259],{"size":161,"scale":3,"weight":0},[391,313],{"size":82,"scale":3,"weight":0.5600000023841858},[211,170],{"size":186,"scale":3,"weight":0.5600000023841858},[478,386],{"size":61,"scale":-1,"weight":-0.4000000059604645},[114,92],{"size":174,"scale":-1,"weight":0.4000000059604645},[344,278],{"size":56,"scale":1,"weight":-0.800000011920929},[81,64],{"size":43,"scale":-1,"weight":0.23000000417232513},[83,68],{"size":152,"scale":3,"weight":0},[369,296],{"size":42,"scale":1,"weight":0.23000000417232513},[64,53],{"size":136,"scale":3,"weight":0.4000000059604645},[343,277],{"size":55,"scale":1,"weight":-0.4000000059604645},[81,66],{"size":70,"scale":-1,"weight":-0.800000011920929},[128,102],{"size":173,"scale":3,"weight":-0.800000011920929},[406,325],{"size":98,"scale":3,"weight":-0.800000011920929},[230,184],{"size":33,"scale":3,"weight":-0.6000000238418579},[78,62],{"size":121,"scale":1,"weight":-0.800000011920929},[173,138],{"size":194,"scale":1,"weight":-0.6000000238418579},[280,222],{"size":30,"scale":2,"weight":-0.6000000238418579},[56,44],{"size":159,"scale":1,"weight":0},[240,194],{"size":110,"scale":3,"weight":0.4000000059604645},[277,224],{"size":152,"scale":2,"weight":0},[289,228],{"size":63,"scale":1,"weight":-0.800000011920929},[90,72],{"size":123,"scale":1,"weight":0.30000001192092896},[189,154],{"size":72,"scale":3,"weight":0.5600000023841858},[185,150],{"size":80,"scale":2,"weight":0.30000001192092896},[156,126],{"size":158,"scale":-1,"weight":0},[300,237],{"size":96,"scale":1,"weight":0.5600000023841858},[153,124],{"size":101,"scale":3,"weight":0},[245,197],{"size":11,"scale":2,"weight":0.6200000047683716},[23,19],{"size":190,"scale":3,"weight":-0.4000000059604645},[456,363],{"size":24,"scale":1,"weight":0.6200000047683716},[39,32],{"size":11,"scale":1,"weight":-0.6000000238418579},[16,14],{"size":38,"scale":3,"weight":0.23000000417232513},[94,76],{"size":139,"scale":-1,"weight":-0.4000000059604645},[260,208],{"size":122,"scale":2,"weight":0.23000000417232513},[235,190],{"size":150,"scale":-1,"weight":0.23000000417232513},[289,233],{"size":87,"scale":3,"weight":-0.6000000238418579},[205,164],{"size":14,"scale":2,"weight":0.30000001192092896},[28,22],{"size":49,"scale":-1,"weight":-0.6000000238418579},[90,72],{"size":153,"scale":1,"weight":0},[231,187],{"size":178,"scale":1,"weight":-0.4000000059604645},[263,211],{"size":104,"scale":2,"weight":0.4000000059604645},[206,166],{"size":88,"scale":3,"weight":-0.4000000059604645},[211,168],{"size":189,"scale":1,"weight":-0.6000000238418579},[273,216],{"size":188,"scale":1,"weight":0.30000001192092896},[290,235],{"size":187,"scale":1,"weight":-0.800000011920929},[267,213],{"size":89,"scale":3,"weight":0.5600000023841858},[229,185],{"size":8,"scale":3,"weight":0},[20,16],{"size":157,"scale":-1,"weight":0.5600000023841858},[317,256],{"size":108,"scale":3,"weight":-0.4000000059604645},[259,206],{"size":53,"scale":1,"weight":-0.800000011920929},[76,60],{"size":182,"scale":1,"weight":-0.800000011920929},[260,207],{"size":200,"scale":1,"weight":0.30000001192092896},[308,249],{"size":40,"scale":1,"weight":0},[61,49],{"size":65,"scale":-1,"weight":0},[124,98],{"size":29,"scale":1,"weight":0.6200000047683716},[48,38],{"size":182,"scale":1,"weight":0.5600000023841858},[289,235],{"size":146,"scale":1,"weight":0.6200000047683716},[236,191],{"size":161,"scale":1,"weight":0.23000000417232513},[246,199],{"size":76,"scale":3,"weight":0.30000001192092896},[189,152],{"size":41,"scale":3,"weight":0.23000000417232513},[101,81],{"size":2,"scale":2,"weight":-0.800000011920929},[4,3],{"size":3,"scale":1,"weight":-0.6000000238418579},[5,4],{"size":132,"scale":1,"weight":0.30000001192092896},[204,165],{"size":146,"scale":3,"weight":-0.6000000238418579},[344,274],{"size":89,"scale":3,"weight":0.6200000047683716},[233,188],{"size":5,"scale":-1,"weight":-0.6000000238418579},[10,8],{"size":75,"scale":2,"weight":0.23000000417232513},[145,117],{"size":79,"scale":3,"weight":-0.800000011920929},[185,149],{"size":50,"scale":3,"weight":0.30000001192092896},[125,100],{"size":36,"scale":1,"weight":-0.6000000238418579},[52,42],{"size":101,"scale":-1,"weight":-0.6000000238418579},[185,147],{"size":15,"scale":3,"weight":0.23000000417232513},[37,30],{"size":157,"scale":2,"weight":-0.6000000238418579},[288,227],{"size":179,"scale":-1,"weight":-0.4000000059604645},[335,268],{"size":2,"scale":3,"weight":0.6200000047683716},[6,4],{"size":145,"scale":1,"weight":0.4000000059604645},[227,184],{"size":135,"scale":1,"weight":0.4000000059604645},[211,170],{"size":45,"scale":-1,"weight":-0.4000000059604645},[85,68],{"size":46,"scale":1,"weight":-0.6000000238418579},[67,53],{"size":22,"scale":1,"weight":-0.4000000059604645},[33,27],{"size":152,"scale":1,"weight":-0.4000000059604645},[225,181],{"size":99,"scale":2,"weight":0},[188,149],{"size":40,"scale":2,"weight":0.6200000047683716},[82,67],{"size":152,"scale":2,"weight":0.23000000417232513},[293,237],{"size":160,"scale":1,"weight":0.6200000047683716},[259,210],{"size":194,"scale":1,"weight":0.4000000059604645},[303,246],{"size":85,"scale":3,"weight":0.4000000059604645},[214,173],{"size":44,"scale":1,"weight":0.30000001192092896},[68,55],{"size":141,"scale":1,"weight":0},[213,172],{"size":31,"scale":2,"weight":-0.800000011920929},[57,45],{"size":119,"scale":-1,"weight":0},[227,178],{"size":39,"scale":1,"weight":0},[60,48],{"size":160,"scale":1,"weight":-0.4000000059604645},[236,190],{"size":8,"scale":1,"weight":0.5600000023841858},[13,11],{"size":84,"scale":2,"weight":0},[160,125],{"size":115,"scale":3,"weight":0},[279,224],{"size":118,"scale":3,"weight":0.6200000047683716},[308,250],{"size":195,"scale":3,"weight":-0.4000000059604645},[467,372],{"size":134,"scale":-1,"weight":-0.6000000238418579},[246,194],{"size":125,"scale":2,"weight":0.4000000059604645},[247,200],{"size":114,"scale":2,"weight":-0.800000011920929},[207,166],{"size":20,"scale":3,"weight":0.23000000417232513},[50,41],{"size":161,"scale":1,"weight":0},[242,197],{"size":143,"scale":3,"weight":0.23000000417232513},[352,283],{"size":135,"scale":3,"weight":-0.4000000059604645},[323,257],{"size":137,"scale":-1,"weight":0.4000000059604645},[271,219],{"size":35,"scale":2,"weight":0.30000001192092896},[68,55],{"size":35,"scale":-1,"weight":0.6200000047683716},[72,58],{"size":176,"scale":3,"weight":-0.6000000238418579},[414,330],{"size":5,"scale":3,"weight":0.6200000047683716},[14,11],{"size":3,"scale":-1,"weight":0.23000000417232513},[7,6],{"size":82,"scale":2,"weight":-0.4000000059604645},[154,123],{"size":198,"scale":1,"weight":0.4000000059604645},[309,250],{"size":2,"scale":-1,"weight":-0.6000000238418579},[4,3],{"size":73,"scale":1,"weight":-0.4000000059604645},[108,87],{"size":28,"scale":1,"weight":0.23000000417232513},[43,35],{"size":53,"scale":2,"weight":0.30000001192092896},[103,84],{"size":111,"scale":2,"weight":0.30000001192092896},[216,175],{"size":64,"scale":1,"weight":-0.6000000238418579},[93,74],{"size":133,"scale":3,"weight":0.30000001192092896},[331,266],{"size":76,"scale":-1,"weight":0},[144,114],{"size":110,"scale":2,"weight":0.30000001192092896},[214,173],{"size":24,"scale":1,"weight":-0.800000011920929},[35,27],{"size":47,"scale":-1,"weight":0.4000000059604645},[93,75],{"size":47,"scale":-1,"weight":-0.4000000059604645},[88,71],{"size":41,"scale":2,"weight":0.5600000023841858},[83,67],{"size":180,"scale":-1,"weight":0.5600000023841858},[363,293],{"size":88,"scale":1,"weight":0.30000001192092896},[136,110],{"size":42,"scale":-1,"weight":-0.4000000059604645},[79,63],{"size":24,"scale":3,"weight":0.23000000417232513},[60,48],{"size":133,"scale":3,"weight":0.4000000059604645},[335,271],{"size":56,"scale":-1,"weight":0.6200000047683716},[115,94],{"size":89,"scale":-1,"weight":-0.6000000238418579},[164,130],{"size":152,"scale":1,"weight":0},[229,186],{"size":82,"scale":1,"weight":0.5600000023841858},[131,106],{"size":184,"scale":-1,"weight":0.30000001192092896},[359,290],{"size":151,"scale":3,"weight":0.30000001192092896},[376,302],{"size":174,"scale":1,"weight":0.23000000417232513},[265,215],{"size":73,"scale":2,"weight":0.23000000417232513},[141,114],{"size":40,"scale":1,"weight":0.23000000417232513},[62,49],{"size":46,"scale":3,"weight":-0.4000000059604645},[111,88],{"size":3,"scale":-1,"weight":0},[7,5],{"size":106,"scale":-1,"weight":-0.4000000059604645},[199,158],{"size":141,"scale":2,"weight":0.6200000047683716},[290,235],{"size":43,"scale":3,"weight":-0.4000000059604645},[103,83],{"size":97,"scale":3,"weight":0.30000001192092896},[242,195],{"size":153,"scale":1,"weight":0.4000000059604645},[239,194],{"size":149,"scale":-1,"weight":0.5600000023841858},[301,243],{"size":149,"scale":2,"weight":-0.6000000238418579},[273,216],{"size":52,"scale":2,"weight":-0.800000011920929},[95,76],{"size":200,"scale":-1,"weight":0},[380,299],{"size":93,"scale":1,"weight":-0.6000000238418579},[135,107],{"size":86,"scale":1,"weight":0.4000000059604645},[134,109],{"size":45,"scale":3,"weight":-0.800000011920929},[105,85],{"size":30,"scale":1,"weight":0.23000000417232513},[46,37],{"size":74,"scale":2,"weight":0},[141,111],{"size":49,"scale":3,"weight":0.6200000047683716},[128,104],{"size":185,"scale":1,"weight":-0.4000000059604645},[274,219],{"size":27,"scale":2,"weight":-0.6000000238418579},[50,40],{"size":8,"scale":3,"weight":0.30000001192092896},[20,17],{"size":123,"scale":1,"weight":-0.4000000059604645},[182,146],{"size":197,"scale":3,"weight":0.30000001192092896},[490,394],{"size":164,"scale":1,"weight":0.6200000047683716},[265,214],{"size":137,"scale":-1,"weight":-0.6000000238418579},[251,199],{"size":171,"scale":1,"weight":-0.4000000059604645},[253,203],{"size":42,"scale":-1,"weight":0},[80,63],{"size":150,"scale":1,"weight":0.23000000417232513},[229,186],{"size":96,"scale":3,"weight":0},[233,188],{"size":140,"scale":3,"weight":0},[340,273],{"size":151,"scale":1,"weight":0.4000000059604645},[236,191],{"size":34,"scale":1,"weight":0.5600000023841858},[55,45],{"size":72,"scale":1,"weight":0.6200000047683716},[117,95],{"size":12,"scale":-1,"weight":0},[24,19],{"size":43,"scale":-1,"weight":0.30000001192092896},[84,69],{"size":94,"scale":-1,"weight":-0.4000000059604645},[176,141],{"size":147,"scale":3,"weight":-0.6000000238418579},[346,275],{"size":174,"scale":-1,"weight":0},[331,261],{"size":83,"scale":1,"weight":0.6200000047683716},[134,109],{"size":116,"scale":3,"weight":-0.800000011920929},[272,218],{"size":96,"scale":3,"weight":-0.800000011920929},[225,181],{"size":78,"scale":3,"weight":0.23000000417232513},[193,155],{"size":137,"scale":3,"weight":0.4000000059604645},[345,279],{"size":110,"scale":3,"weight":-0.4000000059604645},[264,210],{"size":76,"scale":-1,"weight":-0.4000000059604645},[143,114],{"size":15,"scale":-1,"weight":0.6200000047683716},[31,26],{"size":180,"scale":-1,"weight":0.4000000059604645},[356,287],{"size":93,"scale":3,"weight":-0.6000000238418579},[220,174],{"size":10,"scale":-1,"weight":0.4000000059604645},[20,17],{"size":121,"scale":3,"weight":-0.800000011920929},[284,227],{"size":150,"scale":3,"weight":0.5600000023841858},[385,312],{"size":104,"scale":3,"weight":0},[253,202],{"size":125,"scale":2,"weight":-0.6000000238418579},[230,181],{"size":72,"scale":-1,"weight":-0.6000000238418579},[132,105],{"size":129,"scale":3,"weight":0.5600000023841858},[332,268],{"size":13,"scale":1,"weight":0.30000001192092896},[20,17],{"size":85,"scale":-1,"weight":-0.800000011920929},[155,124],{"size":3,"scale":-1,"weight":0.30000001192092896},[7,6],{"size":43,"scale":2,"weight":-0.6000000238418579},[79,63],{"size":12,"scale":3,"weight":0.23000000417232513},[30,25],{"size":10,"scale":-1,"weight":-0.4000000059604645},[19,16],{"size":166,"scale":3,"weight":0.23000000417232513},[409,328],{"size":92,"scale":-1,"weight":0.23000000417232513},[178,143],{"size":75,"scale":3,"weight":0},[182,147],{"size":48,"scale":-1,"weight":-0.4000000059604645},[90,72],{"size":157,"scale":1,"weight":0},[236,191],{"size":194,"scale":-1,"weight":0.5600000023841858},[391,316],{"size":179,"scale":1,"weight":0.4000000059604645},[279,226],{"size":73,"scale":3,"weight":0.5600000023841858},[188,151],{"size":162,"scale":3,"weight":0.6200000047683716},[423,342],{"size":196,"scale":3,"weight":0},[476,382],{"size":82,"scale":-1,"weight":0.23000000417232513},[158,128],{"size":128,"scale":2,"weight":-0.4000000059604645},[240,191],{"size":120,"scale":3,"weight":-0.4000000059604645},[288,229],{"size":102,"scale":3,"weight":0.5600000023841858},[262,212],{"size":106,"scale":3,"weight":-0.800000011920929},[248,199],{"size":10,"scale":2,"weight":0.6200000047683716},[21,17],{"size":65,"scale":-1,"weight":-0.4000000059604645},[122,97],{"size":182,"scale":1,"weight":0.6200000047683716},[295,238],{"size":173,"scale":2,"weight":-0.6000000238418579},[317,251],{"size":169,"scale":2,"weight":0},[321,253],{"size":119,"scale":-1,"weight":0.5600000023841858},[241,194],{"size":18,"scale":3,"weight":0},[44,35],{"size":180,"scale":1,"weight":-0.6000000238418579},[260,206],{"size":89,"scale":-1,"weight":-0.4000000059604645},[166,134],{"size":23,"scale":-1,"weight":0.30000001192092896},[45,37],{"size":102,"scale":-1,"weight":0.5600000023841858},[206,167],{"size":16,"scale":-1,"weight":0.5600000023841858},[32,27],{"size":91,"scale":3,"weight":-0.6000000238418579},[214,170],{"size":38,"scale":3,"weight":-0.4000000059604645},[92,73],{"size":122,"scale":-1,"weight":0.6200000047683716},[251,202],{"size":162,"scale":3,"weight":0.23000000417232513},[399,320],{"size":83,"scale":2,"weight":0.30000001192092896},[162,130],{"size":84,"scale":-1,"weight":0.30000001192092896},[164,133],{"size":32,"scale":1,"weight":0.6200000047683716},[52,42],{"size":130,"scale":1,"weight":0.23000000417232513},[199,161],{"size":16,"scale":3,"weight":-0.4000000059604645},[39,31],{"size":9,"scale":1,"weight":0},[15,11],{"size":21,"scale":2,"weight":0.5600000023841858},[42,35],{"size":97,"scale":3,"weight":0.23000000417232513},[239,192],{"size":123,"scale":3,"weight":0.30000001192092896},[306,247],{"size":117,"scale":1,"weight":0.4000000059604645},[183,148],{"size":127,"scale":1,"weight":0.5600000023841858},[202,163],{"size":128,"scale":1,"weight":-0.6000000238418579},[185,147],{"size":79,"scale":2,"weight":0.4000000059604645},[157,127],{"size":154,"scale":3,"weight":0},[374,300],{"size":47,"scale":3,"weight":-0.4000000059604645},[113,90],{"size":48,"scale":2,"weight":0},[91,73],{"size":55,"scale":3,"weight":0.23000000417232513},[135,109],{"size":95,"scale":2,"weight":-0.4000000059604645},[178,143],{"size":15,"scale":3,"weight":-0.800000011920929},[36,28],{"size":130,"scale":3,"weight":-0.4000000059604645},[312,248],{"size":68,"scale":-1,"weight":-0.6000000238418579},[125,99],{"size":84,"scale":1,"weight":-0.800000011920929},[121,95],{"size":116,"scale":2,"weight":-0.4000000059604645},[217,174],{"size":192,"scale":-1,"weight":0},[365,287],{"size":104,"scale":-1,"weight":-0.800000011920929},[189,151],{"size":48,"scale":-1,"weight":0.4000000059604645},[95,77],{"size":22,"scale":-1,"weight":0.23000000417232513},[43,35],{"size":18,"scale":-1,"weight":0.23000000417232513},[35,28],{"size":38,"scale":3,"weight":0.6200000047683716},[99,81],{"size":150,"scale":2,"weight":-0.6000000238418579},[275,217],{"size":1,"scale":1,"weight":0.4000000059604645},[2,2],{"size":168,"scale":-1,"weight":-0.6000000238418579},[308,243],{"size":150,"scale":-1,"weight":-0.6000000238418579},[275,217],{"size":97,"scale":3,"weight":-0.800000011920929},[227,182],{"size":33,"scale":-1,"weight":0.4000000059604645},[66,53],{"size":18,"scale":2,"weight":0.6200000047683716},[38,30],{"size":104,"scale":3,"weight":0.4000000059604645},[262,211],{"size":54,"scale":1,"weight":0.30000001192092896},[84,67],{"size":82,"scale":-1,"weight":0.6200000047683716},[169,136],{"size":171,"scale":3,"weight":-0.4000000059604645},[410,327],{"size":26,"scale":-1,"weight":0.23000000417232513},[51,41],{"size":121,"scale":1,"weight":0.5600000023841858},[193,156],{"size":158,"scale":-1,"weight":-0.6000000238418579},[290,229],{"size":16,"scale":1,"weight":0},[25,20],{"size":188,"scale":2,"weight":0.6200000047683716},[386,312],{"size":124,"scale":2,"weight":-0.6000000238418579},[228,180],{"size":141,"scale":3,"weight":0},[343,275],{"size":39,"scale":-1,"weight":-0.6000000238418579},[72,57],{"size":146,"scale":1,"weight":0.30000001192092896},[225,182],{"size":131,"scale":3,"weight":0.5600000023841858},[337,272],{"size":120,"scale":1,"weight":-0.800000011920929},[172,136],{"size":164,"scale":3,"weight":-0.4000000059604645},[393,313],{"size":11,"scale":3,"weight":0},[27,21],{"size":133,"scale":3,"weight":-0.4000000059604645},[319,254],{"size":139,"scale":2,"weight":0.30000001192092896},[271,219],{"size":23,"scale":3,"weight":-0.6000000238418579},[55,43],{"size":15,"scale":1,"weight":-0.4000000059604645},[23,18],{"size":82,"scale":3,"weight":0.30000001192092896},[205,164],{"size":189,"scale":-1,"weight":0},[360,283],{"size":37,"scale":1,"weight":-0.800000011920929},[53,42],{"size":54,"scale":2,"weight":0.5600000023841858},[109,88],{"size":143,"scale":3,"weight":-0.4000000059604645},[343,273],{"size":188,"scale":2,"weight":0.5600000023841858},[379,307],{"size":65,"scale":2,"weight":-0.800000011920929},[118,94],{"size":28,"scale":3,"weight":0.30000001192092896},[70,56],{"size":145,"scale":3,"weight":0},[352,283],{"size":90,"scale":1,"weight":0.4000000059604645},[141,114],{"size":11,"scale":1,"weight":0.5600000023841858},[18,15],{"size":14,"scale":2,"weight":-0.4000000059604645},[27,21],{"size":37,"scale":3,"weight":-0.6000000238418579},[88,69],{"size":88,"scale":1,"weight":-0.4000000059604645},[130,105],{"size":72,"scale":3,"weight":-0.4000000059604645},[172,137],{"size":15,"scale":1,"weight":0.5600000023841858},[24,20],{"size":9,"scale":3,"weight":0.30000001192092896},[22,18],{"size":168,"scale":-1,"weight":0.6200000047683716},[345,279],{"size":154,"scale":1,"weight":0.23000000417232513},[235,190],{"size":22,"scale":3,"weight":0.5600000023841858},[57,46],{"size":139,"scale":3,"weight":0.4000000059604645},[351,282],{"size":96,"scale":2,"weight":0},[183,144],{"size":184,"scale":1,"weight":-0.6000000238418579},[266,210],{"size":28,"scale":2,"weight":0.6200000047683716},[58,47],{"size":147,"scale":1,"weight":-0.4000000059604645},[217,175],{"size":64,"scale":2,"weight":-0.4000000059604645},[120,96],{"size":154,"scale":2,"weight":0.23000000417232513},[297,240],{"size":6,"scale":1,"weight":-0.4000000059604645},[9,8],{"size":14,"scale":1,"weight":0.30000001192092896},[22,18],{"size":117,"scale":-1,"weight":0.23000000417232513},[226,182],{"size":168,"scale":-1,"weight":0.30000001192092896},[328,264],{"size":118,"scale":2,"weight":0.6200000047683716},[242,197],{"size":97,"scale":3,"weight":0.5600000023841858},[249,202],{"size":111,"scale":3,"weight":0.6200000047683716},[290,235],{"size":120,"scale":-1,"weight":-0.4000000059604645},[225,180],{"size":17,"scale":3,"weight":0.5600000023841858},[45,36],{"size":89,"scale":2,"weight":0},[169,133],{"size":34,"scale":2,"weight":0.5600000023841858},[69,56],{"size":95,"scale":-1,"weight":0.6200000047683716},[195,158],{"size":199,"scale":2,"weight":-0.800000011920929},[362,289],{"size":134,"scale":1,"weight":0.4000000059604645},[209,169],{"size":172,"scale":-1,"weight":0.5600000023841858},[347,280],{"size":109,"scale":2,"weight":0.5600000023841858},[220,178],{"size":118,"scale":-1,"weight":-0.6000000238418579},[216,172],{"size":98,"scale":-1,"weight":0.4000000059604645},[194,157],{"size":99,"scale":-1,"weight":-0.800000011920929},[180,144],{"size":192,"scale":3,"weight":-0.4000000059604645},[460,366],{"size":104,"scale":1,"weight":0.5600000023841858},[166,134],{"size":32,"scale":-1,"weight":0.6200000047683716},[67,54],{"size":151,"scale":3,"weight":0.4000000059604645},[381,307],{"size":178,"scale":-1,"weight":0.30000001192092896},[347,280],{"size":79,"scale":3,"weight":0.6200000047683716},[206,167],{"size":36,"scale":2,"weight":-0.4000000059604645},[68,54],{"size":79,"scale":-1,"weight":0},[150,119],{"size":64,"scale":3,"weight":0.4000000059604645},[161,130],{"size":147,"scale":2,"weight":0.5600000023841858},[296,240],{"size":149,"scale":1,"weight":0},[224,182],{"size":10,"scale":3,"weight":0.4000000059604645},[26,21],{"size":114,"scale":3,"weight":0},[277,223],{"size":96,"scale":1,"weight":0.30000001192092896},[148,120],{"size":42,"scale":1,"weight":-0.4000000059604645},[62,51],{"size":64,"scale":2,"weight":-0.800000011920929},[117,93],{"size":65,"scale":-1,"weight":0.4000000059604645},[129,104],{"size":47,"scale":-1,"weight":0.5600000023841858},[95,77],{"size":126,"scale":-1,"weight":0.4000000059604645},[249,201],{"size":58,"scale":3,"weight":-0.800000011920929},[137,109],{"size":81,"scale":1,"weight":0.4000000059604645},[126,103],{"size":160,"scale":-1,"weight":0},[304,240],{"size":121,"scale":-1,"weight":0.5600000023841858},[244,197],{"size":11,"scale":3,"weight":-0.800000011920929},[27,21],{"size":80,"scale":1,"weight":0.5600000023841858},[128,103],{"size":163,"scale":2,"weight":0.6200000047683716},[334,270],{"size":59,"scale":-1,"weight":0.6200000047683716},[121,98],{"size":57,"scale":3,"weight":-0.800000011920929},[134,107],{"size":84,"scale":3,"weight":0.23000000417232513},[207,167],{"size":55,"scale":2,"weight":0.6200000047683716},[113,92],{"size":120,"scale":3,"weight":0.23000000417232513},[295,238],{"size":80,"scale":1,"weight":-0.4000000059604645},[119,95],{"size":142,"scale":3,"weight":0.4000000059604645},[358,289],{"size":84,"scale":3,"weight":0.4000000059604645},[212,171],{"size":165,"scale":1,"weight":-0.4000000059604645},[244,196],{"size":36,"scale":1,"weight":-0.800000011920929},[52,41],{"size":172,"scale":3,"weight":0.6200000047683716},[449,363],{"size":97,"scale":1,"weight":-0.4000000059604645},[144,115],{"size":188,"scale":2,"weight":-0.4000000059604645},[352,282],{"size":127,"scale":2,"weight":0.4000000059604645},[252,203],{"size":45,"scale":3,"weight":-0.4000000059604645},[108,86],{"size":3,"scale":3,"weight":0},[8,7],{"size":81,"scale":2,"weight":0.30000001192092896},[158,128],{"size":195,"scale":1,"weight":0.23000000417232513},[297,241],{"size":109,"scale":-1,"weight":-0.6000000238418579},[200,158],{"size":180,"scale":-1,"weight":0.30000001192092896},[351,283],{"size":110,"scale":2,"weight":0.6200000047683716},[226,183],{"size":182,"scale":-1,"weight":0.4000000059604645},[360,291],{"size":3,"scale":1,"weight":0},[6,4],{"size":139,"scale":1,"weight":-0.800000011920929},[198,158],{"size":23,"scale":-1,"weight":-0.6000000238418579},[43,34],{"size":172,"scale":3,"weight":0},[418,335],{"size":139,"scale":2,"weight":0.5600000023841858},[281,227],{"size":90,"scale":1,"weight":-0.6000000238418579},[131,103],{"size":83,"scale":-1,"weight":0.6200000047683716},[171,138],{"size":123,"scale":-1,"weight":0.30000001192092896},[240,193],{"size":44,"scale":-1,"weight":0.23000000417232513},[85,69],{"size":153,"scale":3,"weight":0.6200000047683716},[400,323],{"size":156,"scale":2,"weight":-0.800000011920929},[284,227],{"size":27,"scale":3,"weight":0.4000000059604645},[68,55],{"size":196,"scale":2,"weight":0},[372,293],{"size":137,"scale":-1,"weight":0.30000001192092896},[267,216],{"size":130,"scale":3,"weight":-0.6000000238418579},[306,243],{"size":179,"scale":-1,"weight":0.30000001192092896},[349,282],{"size":6,"scale":-1,"weight":-0.6000000238418579},[11,9],{"size":144,"scale":2,"weight":-0.6000000238418579},[264,209],{"size":15,"scale":1,"weight":-0.6000000238418579},[23,18],{"size":19,"scale":-1,"weight":0.4000000059604645},[38,30],{"size":182,"scale":1,"weight":0},[274,222],{"size":24,"scale":2,"weight":-0.6000000238418579},[44,35],{"size":19,"scale":1,"weight":0.4000000059604645},[30,25],{"size":14,"scale":3,"weight":0.4000000059604645},[36,29],{"size":176,"scale":3,"weight":-0.4000000059604645},[422,336],{"size":148,"scale":2,"weight":-0.4000000059604645},[277,222],{"size":63,"scale":3,"weight":0},[154,123],{"size":82,"scale":2,"weight":-0.6000000238418579},[150,119],{"size":11,"scale":1,"weight":-0.4000000059604645},[17,14],{"size":35,"scale":1,"weight":0.6200000047683716},[57,46],{"size":157,"scale":3,"weight":-0.4000000059604645},[376,299],{"size":169,"scale":2,"weight":0.4000000059604645},[334,269],{"size":26,"scale":3,"weight":0.30000001192092896},[65,53],{"size":100,"scale":-1,"weight":-0.6000000238418579},[183,145],{"size":8,"scale":2,"weight":-0.800000011920929},[15,12],{"size":99,"scale":-1,"weight":0.23000000417232513},[191,154],{"size":89,"scale":1,"weight":0},[134,109],{"size":160,"scale":3,"weight":0},[389,312],{"size":170,"scale":-1,"weight":-0.800000011920929},[309,247],{"size":90,"scale":3,"weight":0},[219,175],{"size":28,"scale":3,"weight":0},[69,55],{"size":103,"scale":1,"weight":-0.4000000059604645},[152,122],{"size":166,"scale":3,"weight":-0.6000000238418579},[391,310],{"size":40,"scale":3,"weight":0.23000000417232513},[99,80],{"size":9,"scale":1,"weight":0.5600000023841858},[15,12],{"size":148,"scale":2,"weight":0},[282,221],{"size":184,"scale":1,"weight":0},[277,224],{"size":94,"scale":3,"weight":-0.4000000059604645},[226,179],{"size":90,"scale":-1,"weight":-0.6000000238418579},[165,131],{"size":188,"scale":-1,"weight":0.30000001192092896},[367,296],{"size":101,"scale":1,"weight":0.4000000059604645},[158,128],{"size":95,"scale":1,"weight":-0.800000011920929},[136,108],{"size":138,"scale":3,"weight":-0.800000011920929},[323,259],{"size":6,"scale":2,"weight":-0.800000011920929},[11,9],{"size":6,"scale":1,"weight":0.5600000023841858},[10,8],{"size":52,"scale":2,"weight":0.23000000417232513},[101,81],{"size":182,"scale":-1,"weight":0.23000000417232513},[351,284],{"size":27,"scale":-1,"weight":0.5600000023841858},[55,45],{"size":107,"scale":-1,"weight":-0.6000000238418579},[197,156],{"size":65,"scale":2,"weight":0.5600000023841858},[131,106],{"size":144,"scale":3,"weight":-0.4000000059604645},[345,274],{"size":197,"scale":1,"weight":0.6200000047683716},[319,258],{"size":156,"scale":1,"weight":0.6200000047683716},[253,204],{"size":154,"scale":-1,"weight":0.5600000023841858},[311,251],{"size":16,"scale":1,"weight":-0.800000011920929},[24,18],{"size":150,"scale":1,"weight":0},[226,184],{"size":99,"scale":2,"weight":0.4000000059604645},[196,158],{"size":195,"scale":2,"weight":-0.6000000238418579},[357,283],{"size":83,"scale":2,"weight":0.5600000023841858},[167,135],{"size":117,"scale":-1,"weight":0.5600000023841858},[236,191],{"size":52,"scale":-1,"weight":0.4000000059604645},[103,83],{"size":90,"scale":-1,"weight":0.5600000023841858},[182,147],{"size":144,"scale":1,"weight":0.4000000059604645},[225,183],{"size":24,"scale":2,"weight":0},[46,36],{"size":150,"scale":3,"weight":0.4000000059604645},[378,305],{"size":102,"scale":1,"weight":-0.800000011920929},[146,116],{"size":92,"scale":-1,"weight":0.5600000023841858},[186,150],{"size":90,"scale":3,"weight":-0.800000011920929},[211,169],{"size":160,"scale":3,"weight":0.23000000417232513},[394,317],{"size":109,"scale":-1,"weight":0.23000000417232513},[210,170],{"size":60,"scale":1,"weight":-0.4000000059604645},[89,71],{"size":194,"scale":-1,"weight":-0.6000000238418579},[356,281],{"size":163,"scale":3,"weight":0.6200000047683716},[426,345],{"size":144,"scale":1,"weight":-0.4000000059604645},[213,171],{"size":117,"scale":3,"weight":0.5600000023841858},[301,243],{"size":167,"scale":3,"weight":0.4000000059604645},[421,340],{"size":118,"scale":3,"weight":-0.6000000238418579},[278,222],{"size":170,"scale":-1,"weight":-0.6000000238418579},[312,247],{"size":121,"scale":-1,"weight":0},[230,182],{"size":14,"scale":-1,"weight":0.23000000417232513},[27,22],{"size":101,"scale":1,"weight":0.5600000023841858},[161,131],{"size":88,"scale":1,"weight":0},[133,108],{"size":42,"scale":-1,"weight":-0.6000000238418579},[77,61],{"size":133,"scale":2,"weight":-0.6000000238418579},[244,193],{"size":115,"scale":1,"weight":0.6200000047683716},[186,151],{"size":91,"scale":2,"weight":0},[174,136],{"size":100,"scale":-1,"weight":0.6200000047683716},[206,166],{"size":122,"scale":1,"weight":-0.800000011920929},[174,139],{"size":88,"scale":1,"weight":0.4000000059604645},[137,112],{"size":33,"scale":2,"weight":0.4000000059604645},[66,53],{"size":144,"scale":-1,"weight":-0.800000011920929},[262,209],{"size":40,"scale":-1,"weight":-0.4000000059604645},[76,60],{"size":46,"scale":2,"weight":-0.6000000238418579},[85,67],{"size":88,"scale":-1,"weight":-0.6000000238418579},[162,127],{"size":183,"scale":1,"weight":0.4000000059604645},[286,231],{"size":151,"scale":-1,"weight":0.5600000023841858},[304,246],{"size":175,"scale":1,"weight":0},[263,214],{"size":60,"scale":2,"weight":-0.6000000238418579},[110,87],{"size":69,"scale":2,"weight":-0.800000011920929},[125,101],{"size":147,"scale":2,"weight":0},[280,220],{"size":148,"scale":3,"weight":-0.4000000059604645},[355,282],{"size":7,"scale":-1,"weight":0.6200000047683716},[15,12],{"size":162,"scale":1,"weight":-0.4000000059604645},[240,192],{"size":117,"scale":-1,"weight":0.4000000059604645},[232,187],{"size":76,"scale":-1,"weight":-0.800000011920929},[138,110],{"size":122,"scale":2,"weight":-0.800000011920929},[221,177],{"size":6,"scale":2,"weight":0.4000000059604645},[12,10],{"size":56,"scale":2,"weight":0.5600000023841858},[114,92],{"size":60,"scale":2,"weight":0.5600000023841858},[121,98],{"size":49,"scale":-1,"weight":0.6200000047683716},[101,82],{"size":95,"scale":3,"weight":-0.4000000059604645},[228,181],{"size":157,"scale":-1,"weight":-0.6000000238418579},[288,227],{"size":22,"scale":2,"weight":0.23000000417232513},[43,35],{"size":167,"scale":2,"weight":0.23000000417232513},[322,260],{"size":80,"scale":2,"weight":-0.4000000059604645},[150,120],{"size":149,"scale":3,"weight":0.23000000417232513},[367,295],{"size":164,"scale":-1,"weight":0},[311,245],{"size":44,"scale":-1,"weight":0.5600000023841858},[89,72],{"size":78,"scale":1,"weight":0.4000000059604645},[122,99],{"size":108,"scale":-1,"weight":0.30000001192092896},[211,170],{"size":38,"scale":-1,"weight":0.4000000059604645},[76,61],{"size":96,"scale":1,"weight":0.6200000047683716},[155,126],{"size":7,"scale":2,"weight":0.4000000059604645},[14,11],{"size":13,"scale":2,"weight":0.6200000047683716},[27,22],{"size":27,"scale":-1,"weight":0.23000000417232513},[53,43],{"size":190,"scale":1,"weight":0},[286,232],{"size":57,"scale":-1,"weight":0.6200000047683716},[118,95],{"size":178,"scale":-1,"weight":0.23000000417232513},[343,277],{"size":89,"scale":-1,"weight":0.5600000023841858},[179,146],{"size":125,"scale":-1,"weight":0.4000000059604645},[247,200],{"size":128,"scale":3,"weight":-0.6000000238418579},[302,240],{"size":176,"scale":2,"weight":0.4000000059604645},[348,281],{"size":40,"scale":-1,"weight":0.6200000047683716},[82,67],{"size":183,"scale":1,"weight":0.5600000023841858},[291,236],{"size":162,"scale":3,"weight":0},[394,315],{"size":41,"scale":2,"weight":0.30000001192092896},[81,65],{"size":18,"scale":-1,"weight":0.4000000059604645},[36,29],{"size":86,"scale":2,"weight":-0.6000000238418579},[158,125],{"size":192,"scale":1,"weight":0.4000000059604645},[299,243],{"size":62,"scale":3,"weight":-0.800000011920929},[146,117],{"size":142,"scale":-1,"weight":0.30000001192092896},[277,224],{"size":12,"scale":-1,"weight":0.6200000047683716},[25,20],{"size":178,"scale":1,"weight":0.30000001192092896},[274,222],{"size":71,"scale":3,"weight":0.30000001192092896},[177,142],{"size":65,"scale":1,"weight":0.30000001192092896},[101,82],{"size":80,"scale":2,"weight":0.23000000417232513},[154,125],{"size":171,"scale":2,"weight":0.4000000059604645},[338,273],{"size":182,"scale":-1,"weight":0.6200000047683716},[373,302],{"size":166,"scale":3,"weight":0},[403,323],{"size":158,"scale":1,"weight":0.5600000023841858},[251,204],{"size":111,"scale":1,"weight":-0.4000000059604645},[164,132],{"size":37,"scale":2,"weight":-0.6000000238418579},[68,54],{"size":49,"scale":3,"weight":0},[120,96],{"size":51,"scale":2,"weight":-0.6000000238418579},[94,74],{"size":21,"scale":3,"weight":0.23000000417232513},[52,42],{"size":134,"scale":-1,"weight":-0.800000011920929},[243,195],{"size":77,"scale":2,"weight":0.23000000417232513},[148,120],{"size":174,"scale":2,"weight":0.30000001192092896},[339,274],{"size":2,"scale":-1,"weight":-0.800000011920929},[4,3],{"size":11,"scale":2,"weight":-0.800000011920929},[21,17],{"size":29,"scale":3,"weight":-0.4000000059604645},[70,56],{"size":74,"scale":-1,"weight":0.4000000059604645},[147,119],{"size":102,"scale":3,"weight":0},[248,199],{"size":128,"scale":-1,"weight":0},[243,192],{"size":52,"scale":3,"weight":0.6200000047683716},[136,110],{"size":188,"scale":-1,"weight":-0.6000000238418579},[345,273],{"size":49,"scale":1,"weight":-0.4000000059604645},[72,59],{"size":25,"scale":-1,"weight":0.30000001192092896},[49,39],{"size":54,"scale":-1,"weight":-0.6000000238418579},[99,78],{"size":72,"scale":2,"weight":0.6200000047683716},[148,120],{"size":104,"scale":3,"weight":0.23000000417232513},[256,206],{"size":27,"scale":1,"weight":0.6200000047683716},[44,36],{"size":184,"scale":-1,"weight":0},[350,275],{"size":93,"scale":2,"weight":0},[177,140],{"size":196,"scale":3,"weight":0.5600000023841858},[504,407],{"size":25,"scale":1,"weight":-0.4000000059604645},[37,30],{"size":126,"scale":1,"weight":-0.4000000059604645},[186,150],{"size":85,"scale":1,"weight":0.5600000023841858},[136,110],{"size":33,"scale":1,"weight":-0.6000000238418579},[48,39],{"size":47,"scale":1,"weight":0.4000000059604645},[74,59],{"size":190,"scale":3,"weight":0},[461,370],{"size":80,"scale":3,"weight":0.30000001192092896},[199,160],{"size":173,"scale":2,"weight":0.4000000059604645},[342,276],{"size":22,"scale":2,"weight":0.6200000047683716},[46,37],{"size":200,"scale":2,"weight":-0.6000000238418579},[366,290],{"size":10,"scale":1,"weight":0.5600000023841858},[17,13],{"size":180,"scale":1,"weight":0},[271,220],{"size":181,"scale":1,"weight":0.23000000417232513},[276,224],{"size":183,"scale":1,"weight":0.6200000047683716},[296,240],{"size":37,"scale":1,"weight":0},[56,45],{"size":49,"scale":3,"weight":-0.4000000059604645},[118,94],{"size":53,"scale":-1,"weight":-0.6000000238418579},[98,77],{"size":166,"scale":-1,"weight":-0.6000000238418579},[305,241],{"size":52,"scale":2,"weight":0},[99,78],{"size":137,"scale":-1,"weight":-0.4000000059604645},[257,205],{"size":174,"scale":3,"weight":0.4000000059604645},[439,354],{"size":135,"scale":3,"weight":0.30000001192092896},[336,270],{"size":112,"scale":3,"weight":-0.4000000059604645},[269,214],{"size":17,"scale":3,"weight":0.23000000417232513},[43,34],{"size":143,"scale":-1,"weight":0.6200000047683716},[293,238],{"size":173,"scale":2,"weight":0.5600000023841858},[349,282],{"size":191,"scale":-1,"weight":-0.4000000059604645},[357,285],{"size":92,"scale":2,"weight":-0.800000011920929},[167,134],{"size":163,"scale":3,"weight":0.4000000059604645},[411,332],{"size":138,"scale":1,"weight":0.6200000047683716},[223,181],{"size":4,"scale":2,"weight":-0.4000000059604645},[8,7],{"size":123,"scale":-1,"weight":0.4000000059604645},[243,196],{"size":14,"scale":3,"weight":-0.800000011920929},[34,27],{"size":129,"scale":1,"weight":0.30000001192092896},[199,162],{"size":7,"scale":1,"weight":-0.6000000238418579},[10,9],{"size":165,"scale":-1,"weight":0.4000000059604645},[327,264],{"size":114,"scale":1,"weight":0},[172,140],{"size":4,"scale":-1,"weight":0.23000000417232513},[8,7],{"size":150,"scale":3,"weight":0.30000001192092896},[373,301],{"size":137,"scale":1,"weight":0.5600000023841858},[218,177],{"size":108,"scale":1,"weight":0},[163,132],{"size":11,"scale":1,"weight":0.30000001192092896},[18,15],{"size":177,"scale":1,"weight":0.6200000047683716},[286,231],{"size":164,"scale":-1,"weight":-0.6000000238418579},[300,238],{"size":158,"scale":2,"weight":0.6200000047683716},[324,263],{"size":105,"scale":2,"weight":0.23000000417232513},[202,163],{"size":22,"scale":1,"weight":0.5600000023841858},[36,29],{"size":69,"scale":3,"weight":0.4000000059604645},[174,141],{"size":194,"scale":2,"weight":-0.4000000059604645},[363,290],{"size":10,"scale":1,"weight":0.23000000417232513},[16,12],{"size":57,"scale":2,"weight":0.30000001192092896},[111,90],{"size":178,"scale":1,"weight":-0.800000011920929},[254,202],{"size":189,"scale":-1,"weight":0.6200000047683716},[388,314],{"size":148,"scale":2,"weight":0.30000001192092896},[288,233],{"size":5,"scale":2,"weight":0.4000000059604645},[10,9],{"size":19,"scale":2,"weight":-0.800000011920929},[35,28],{"size":126,"scale":1,"weight":-0.800000011920929},[180,143],{"size":101,"scale":2,"weight":0},[192,152],{"size":189,"scale":3,"weight":0.4000000059604645},[477,385],{"size":148,"scale":-1,"weight":0.23000000417232513},[286,231],{"size":125,"scale":2,"weight":-0.4000000059604645},[234,187],{"size":6,"scale":-1,"weight":-0.4000000059604645},[11,9],{"size":25,"scale":3,"weight":-0.800000011920929},[59,48],{"size":102,"scale":1,"weight":-0.6000000238418579},[148,117],{"size":106,"scale":2,"weight":0.4000000059604645},[209,169],{"size":45,"scale":2,"weight":-0.4000000059604645},[85,68],{"size":37,"scale":-1,"weight":0.4000000059604645},[74,59],{"size":41,"scale":3,"weight":-0.6000000238418579},[97,77],{"size":155,"scale":1,"weight":-0.4000000059604645},[229,184],{"size":141,"scale":1,"weight":-0.800000011920929},[202,160],{"size":188,"scale":2,"weight":0.30000001192092896},[367,296],{"size":47,"scale":-1,"weight":-0.800000011920929},[86,68],{"size":136,"scale":1,"weight":0.4000000059604645},[212,173],{"size":144,"scale":1,"weight":-0.6000000238418579},[208,165],{"size":113,"scale":1,"weight":-0.6000000238418579},[163,129],{"size":67,"scale":1,"weight":0.5600000023841858},[107,86],{"size":183,"scale":3,"weight":0},[444,356],{"size":169,"scale":3,"weight":-0.6000000238418579},[398,316],{"size":127,"scale":3,"weight":-0.800000011920929},[298,239],{"size":116,"scale":3,"weight":0.5600000023841858},[298,241],{"size":15,"scale":2,"weight":-0.6000000238418579},[28,23],{"size":129,"scale":3,"weight":-0.800000011920929},[302,242],{"size":120,"scale":-1,"weight":0},[228,179],{"size":109,"scale":2,"weight":-0.800000011920929},[198,159],{"size":151,"scale":1,"weight":0.5600000023841858},[240,195],{"size":193,"scale":1,"weight":0.30000001192092896},[297,241],{"size":37,"scale":-1,"weight":0.23000000417232513},[72,58],{"size":84,"scale":1,"weight":-0.4000000059604645},[124,100],{"size":122,"scale":-1,"weight":0.5600000023841858},[246,199],{"size":136,"scale":-1,"weight":-0.6000000238418579},[249,197],{"size":67,"scale":3,"weight":0.6200000047683716},[175,142],{"size":137,"scale":1,"weight":0.23000000417232513},[209,170],{"size":190,"scale":-1,"weight":0.4000000059604645},[376,303],{"size":43,"scale":3,"weight":-0.800000011920929},[101,81],{"size":175,"scale":1,"weight":0.6200000047683716},[283,229],{"size":19,"scale":2,"weight":-0.4000000059604645},[36,29],{"size":32,"scale":2,"weight":-0.6000000238418579},[59,47],{"size":12,"scale":-1,"weight":0.23000000417232513},[24,19],{"size":108,"scale":1,"weight":0.23000000417232513},[165,134],{"size":121,"scale":2,"weight":0.30000001192092896},[236,191],{"size":134,"scale":-1,"weight":0},[255,200],{"size":77,"scale":-1,"weight":-0.4000000059604645},[145,115],{"size":125,"scale":3,"weight":0.5600000023841858},[322,260],{"size":179,"scale":1,"weight":0.23000000417232513},[273,221],{"size":55,"scale":1,"weight":-0.800000011920929},[79,63],{"size":27,"scale":1,"weight":0.23000000417232513},[41,34],{"size":42,"scale":1,"weight":0.30000001192092896},[65,53],{"size":142,"scale":1,"weight":0.23000000417232513},[217,175],{"size":167,"scale":-1,"weight":-0.4000000059604645},[313,250],{"size":77,"scale":2,"weight":-0.800000011920929},[140,112],{"size":109,"scale":2,"weight":-0.6000000238418579},[200,158],{"size":199,"scale":1,"weight":0.4000000059604645},[311,251],{"size":18,"scale":1,"weight":-0.800000011920929},[27,20],{"size":124,"scale":3,"weight":0.23000000417232513},[306,246],{"size":146,"scale":1,"weight":0},[220,178],{"size":136,"scale":1,"weight":0},[205,167],{"size":99,"scale":3,"weight":0.5600000023841858},[255,206],{"size":157,"scale":2,"weight":0.4000000059604645},[310,250],{"size":178,"scale":-1,"weight":0},[338,266],{"size":125,"scale":1,"weight":0.30000001192092896},[193,156],{"size":91,"scale":3,"weight":0.23000000417232513},[224,180],{"size":19,"scale":2,"weight":0.30000001192092896},[37,30],{"size":48,"scale":2,"weight":0.30000001192092896},[94,76],{"size":177,"scale":1,"weight":0.30000001192092896},[272,221],{"size":66,"scale":-1,"weight":-0.4000000059604645},[123,100],{"size":186,"scale":2,"weight":-0.800000011920929},[338,270],{"size":20,"scale":-1,"weight":0.5600000023841858},[41,33],{"size":114,"scale":2,"weight":0.5600000023841858},[230,186],{"size":38,"scale":3,"weight":0.5600000023841858},[98,80],{"size":31,"scale":1,"weight":0.23000000417232513},[48,39],{"size":197,"scale":-1,"weight":0.23000000417232513},[380,306],{"size":61,"scale":2,"weight":0.4000000059604645},[121,98],{"size":122,"scale":1,"weight":-0.6000000238418579},[176,140],{"size":13,"scale":1,"weight":0},[20,17],{"size":180,"scale":2,"weight":0.23000000417232513},[347,280],{"size":123,"scale":2,"weight":-0.4000000059604645},[231,184],{"size":61,"scale":2,"weight":0},[116,91],{"size":138,"scale":3,"weight":0.23000000417232513},[340,273],{"size":187,"scale":-1,"weight":0.4000000059604645},[369,299],{"size":2,"scale":1,"weight":0.30000001192092896},[3,3],{"size":35,"scale":1,"weight":-0.6000000238418579},[51,41],{"size":8,"scale":2,"weight":-0.6000000238418579},[15,12],{"size":51,"scale":3,"weight":-0.4000000059604645},[122,97],{"size":96,"scale":2,"weight":-0.4000000059604645},[180,144],{"size":199,"scale":2,"weight":0.6200000047683716},[408,331],{"size":103,"scale":1,"weight":0.23000000417232513},[157,127],{"size":128,"scale":3,"weight":0},[311,250],{"size":91,"scale":3,"weight":0.30000001192092896},[227,182],{"size":66,"scale":3,"weight":0.23000000417232513},[162,131],{"size":121,"scale":3,"weight":0.6200000047683716},[316,255],{"size":94,"scale":-1,"weight":0.23000000417232513},[181,146],{"size":111,"scale":2,"weight":0.5600000023841858},[224,181],{"size":152,"scale":3,"weight":0.6200000047683716},[397,321],{"size":47,"scale":1,"weight":0},[71,57],{"size":88,"scale":1,"weight":0.6200000047683716},[143,115],{"size":69,"scale":1,"weight":0.23000000417232513},[105,85],{"size":92,"scale":1,"weight":-0.6000000238418579},[133,106],{"size":54,"scale":-1,"weight":0.4000000059604645},[107,86],{"size":53,"scale":1,"weight":0.30000001192092896},[82,66],{"size":141,"scale":3,"weight":-0.6000000238418579},[332,264],{"size":84,"scale":2,"weight":0.6200000047683716},[173,140],{"size":50,"scale":2,"weight":-0.4000000059604645},[94,75],{"size":46,"scale":-1,"weight":-0.4000000059604645},[86,69],{"size":146,"scale":1,"weight":0.4000000059604645},[228,185],{"size":195,"scale":3,"weight":0.6200000047683716},[509,412],{"size":33,"scale":3,"weight":0},[80,64],{"size":93,"scale":-1,"weight":-0.6000000238418579},[171,135],{"size":183,"scale":-1,"weight":-0.6000000238418579},[336,265],{"size":135,"scale":-1,"weight":0.23000000417232513},[261,211],{"size":41,"scale":1,"weight":-0.6000000238418579},[60,48],{"size":36,"scale":-1,"weight":-0.4000000059604645},[68,54],{"size":183,"scale":3,"weight":-0.6000000238418579},[431,342],{"size":145,"scale":-1,"weight":-0.800000011920929},[263,211],{"size":46,"scale":1,"weight":0.23000000417232513},[71,57],{"size":7,"scale":3,"weight":0.4000000059604645},[18,15],{"size":131,"scale":2,"weight":0.30000001192092896},[256,206],{"size":7,"scale":1,"weight":0.5600000023841858},[11,10],{"size":193,"scale":1,"weight":-0.6000000238418579},[279,220],{"size":65,"scale":-1,"weight":0.23000000417232513},[126,101],{"size":176,"scale":2,"weight":-0.6000000238418579},[323,255],{"size":40,"scale":-1,"weight":0.4000000059604645},[79,64],{"size":107,"scale":2,"weight":-0.4000000059604645},[200,161],{"size":152,"scale":2,"weight":-0.6000000238418579},[279,221],{"size":77,"scale":1,"weight":0.6200000047683716},[125,102],{"size":51,"scale":3,"weight":0.4000000059604645},[129,104],{"size":8,"scale":2,"weight":0.5600000023841858},[17,13],{"size":136,"scale":3,"weight":-0.800000011920929},[319,256],{"size":156,"scale":2,"weight":0},[297,233],{"size":197,"scale":-1,"weight":0.30000001192092896},[384,310],{"size":184,"scale":3,"weight":0.6200000047683716},[480,388],{"size":172,"scale":-1,"weight":-0.800000011920929},[313,250],{"size":43,"scale":3,"weight":0.6200000047683716},[112,91],{"size":139,"scale":3,"weight":-0.6000000238418579},[327,260],{"size":22,"scale":-1,"weight":-0.800000011920929},[40,33],{"size":49,"scale":-1,"weight":-0.800000011920929},[89,72],{"size":184,"scale":2,"weight":0.4000000059604645},[364,294],{"size":92,"scale":2,"weight":0.30000001192092896},[180,145],{"size":175,"scale":3,"weight":0.30000001192092896},[435,350],{"size":86,"scale":3,"weight":-0.6000000238418579},[203,161],{"size":145,"scale":-1,"weight":0},[275,217],{"size":69,"scale":-1,"weight":-0.800000011920929},[125,101],{"size":156,"scale":-1,"weight":0.4000000059604645},[309,249],{"size":168,"scale":3,"weight":0.6200000047683716},[439,355],{"size":30,"scale":1,"weight":0.6200000047683716},[49,40],{"size":4,"scale":2,"weight":0.23000000417232513},[8,7],{"size":25,"scale":1,"weight":0},[38,31],{"size":10,"scale":-1,"weight":0.6200000047683716},[21,17],{"size":36,"scale":2,"weight":0.6200000047683716},[74,60],{"size":193,"scale":3,"weight":0},[469,376],{"size":103,"scale":3,"weight":-0.4000000059604645},[247,196],{"size":70,"scale":-1,"weight":0},[133,105],{"size":7,"scale":3,"weight":0.6200000047683716},[19,16],{"size":44,"scale":2,"weight":0},[84,66],{"size":105,"scale":1,"weight":-0.6000000238418579},[152,120],{"size":73,"scale":2,"weight":0.30000001192092896},[142,115],{"size":26,"scale":1,"weight":0.5600000023841858},[42,34],{"size":131,"scale":-1,"weight":0},[249,196],{"size":1,"scale":2,"weight":-0.4000000059604645},[2,2],{"size":115,"scale":-1,"weight":-0.6000000238418579},[211,167],{"size":1,"scale":1,"weight":0.30000001192092896},[2,2],{"size":54,"scale":-1,"weight":0.5600000023841858},[109,88],{"size":5,"scale":1,"weight":0.30000001192092896},[8,7],{"size":164,"scale":3,"weight":0.5600000023841858},[421,341],{"size":186,"scale":3,"weight":0.23000000417232513},[458,368],{"size":74,"scale":-1,"weight":0.30000001192092896},[145,117],{"size":82,"scale":-1,"weight":-0.6000000238418579},[150,119],{"size":53,"scale":2,"weight":0.6200000047683716},[109,88],{"size":4,"scale":3,"weight":0.30000001192092896},[10,9],{"size":180,"scale":2,"weight":-0.4000000059604645},[337,269],{"size":59,"scale":1,"weight":0.4000000059604645},[93,75],{"size":159,"scale":2,"weight":-0.6000000238418579},[291,231],{"size":184,"scale":-1,"weight":0.23000000417232513},[354,286],{"size":108,"scale":2,"weight":0.30000001192092896},[211,170],{"size":40,"scale":3,"weight":-0.6000000238418579},[95,75],{"size":41,"scale":1,"weight":0.4000000059604645},[65,53],{"size":119,"scale":-1,"weight":0.4000000059604645},[235,190],{"size":2,"scale":2,"weight":0},[4,3],{"size":163,"scale":2,"weight":0},[310,244],{"size":34,"scale":1,"weight":-0.4000000059604645},[51,41],{"size":65,"scale":3,"weight":0.6200000047683716},[170,138],{"size":166,"scale":1,"weight":0.4000000059604645},[259,210],{"size":18,"scale":3,"weight":0.6200000047683716},[48,38],{"size":61,"scale":3,"weight":-0.4000000059604645},[146,117],{"size":17,"scale":3,"weight":-0.6000000238418579},[41,32],{"size":20,"scale":1,"weight":0.5600000023841858},[32,26],{"size":130,"scale":2,"weight":0.5600000023841858},[262,212],{"size":91,"scale":2,"weight":-0.4000000059604645},[171,137],{"size":78,"scale":2,"weight":-0.800000011920929},[142,114],{"size":98,"scale":3,"weight":0.30000001192092896},[244,196],{"size":7,"scale":-1,"weight":0.5600000023841858},[15,12],{"size":197,"scale":2,"weight":-0.800000011920929},[358,286],{"size":53,"scale":2,"weight":0.23000000417232513},[102,83],{"size":58,"scale":1,"weight":0.6200000047683716},[94,76],{"size":195,"scale":3,"weight":0.4000000059604645},[491,396],{"size":191,"scale":-1,"weight":0.23000000417232513},[368,297],{"size":188,"scale":3,"weight":0.30000001192092896},[468,376],{"size":119,"scale":-1,"weight":-0.4000000059604645},[223,179],{"size":181,"scale":1,"weight":-0.800000011920929},[258,206],{"size":174,"scale":1,"weight":0.6200000047683716},[282,228],{"size":62,"scale":-1,"weight":0},[118,93],{"size":65,"scale":2,"weight":0.6200000047683716},[133,108],{"size":39,"scale":-1,"weight":0.6200000047683716},[80,65],{"size":32,"scale":2,"weight":0},[61,48],{"size":72,"scale":2,"weight":0},[137,108],{"size":72,"scale":1,"weight":0.30000001192092896},[111,90],{"size":41,"scale":1,"weight":-0.800000011920929},[59,47],{"size":49,"scale":-1,"weight":0.30000001192092896},[95,78],{"size":90,"scale":2,"weight":-0.4000000059604645},[169,135],{"size":59,"scale":2,"weight":0.5600000023841858},[119,96],{"size":5,"scale":-1,"weight":-0.4000000059604645},[10,8],{"size":175,"scale":-1,"weight":0.6200000047683716},[359,291],{"size":42,"scale":-1,"weight":0.23000000417232513},[81,65],{"size":193,"scale":2,"weight":0.5600000023841858},[389,315],{"size":93,"scale":-1,"weight":0.30000001192092896},[182,146],{"size":47,"scale":2,"weight":0.23000000417232513},[91,73],{"size":112,"scale":2,"weight":0.23000000417232513},[216,175],{"size":147,"scale":3,"weight":0.5600000023841858},[378,305],{"size":136,"scale":2,"weight":0.30000001192092896},[265,214],{"size":186,"scale":1,"weight":0.5600000023841858},[296,239],{"size":91,"scale":3,"weight":0},[221,177],{"size":54,"scale":3,"weight":-0.4000000059604645},[129,103],{"size":80,"scale":2,"weight":-0.800000011920929},[146,117],{"size":161,"scale":1,"weight":0.4000000059604645},[251,204],{"size":153,"scale":2,"weight":0.4000000059604645},[302,245],{"size":164,"scale":1,"weight":0.5600000023841858},[261,211],{"size":102,"scale":2,"weight":0.23000000417232513},[197,159],{"size":153,"scale":-1,"weight":0.5600000023841858},[309,250],{"size":111,"scale":-1,"weight":0.5600000023841858},[224,181],{"size":132,"scale":-1,"weight":-0.4000000059604645},[247,198],{"size":181,"scale":2,"weight":0.30000001192092896},[352,285],{"size":24,"scale":3,"weight":0},[59,47],{"size":50,"scale":-1,"weight":0.4000000059604645},[99,80],{"size":38,"scale":3,"weight":-0.6000000238418579},[90,72],{"size":21,"scale":-1,"weight":-0.6000000238418579},[39,31],{"size":180,"scale":2,"weight":0},[342,270],{"size":144,"scale":-1,"weight":0.23000000417232513},[278,224],{"size":8,"scale":1,"weight":0.23000000417232513},[13,10],{"size":33,"scale":1,"weight":0},[51,41],{"size":177,"scale":2,"weight":0.5600000023841858},[357,289],{"size":199,"scale":-1,"weight":-0.800000011920929},[362,289],{"size":197,"scale":2,"weight":0.6200000047683716},[404,327],{"size":41,"scale":1,"weight":-0.4000000059604645},[61,49],{"size":154,"scale":1,"weight":-0.800000011920929},[220,175],{"size":96,"scale":2,"weight":-0.6000000238418579},[176,140],{"size":44,"scale":-1,"weight":0.4000000059604645},[87,71],{"size":68,"scale":3,"weight":0.23000000417232513},[168,135],{"size":101,"scale":1,"weight":0},[152,124],{"size":196,"scale":1,"weight":0.4000000059604645},[306,248],{"size":126,"scale":-1,"weight":0.30000001192092896},[246,199],{"size":12,"scale":1,"weight":0.30000001192092896},[19,16],{"size":41,"scale":2,"weight":0},[78,62],{"size":23,"scale":3,"weight":0.23000000417232513},[57,46],{"size":144,"scale":1,"weight":0.23000000417232513},[220,178],{"size":197,"scale":3,"weight":0.4000000059604645},[497,400],{"size":89,"scale":1,"weight":0.23000000417232513},[136,110],{"size":46,"scale":3,"weight":-0.6000000238418579},[109,86],{"size":19,"scale":1,"weight":-0.800000011920929},[28,22],{"size":102,"scale":2,"weight":-0.6000000238418579},[188,148],{"size":173,"scale":2,"weight":0},[329,259],{"size":159,"scale":1,"weight":0.23000000417232513},[242,197],{"size":86,"scale":1,"weight":0.6200000047683716},[140,113],{"size":43,"scale":1,"weight":-0.4000000059604645},[64,52],{"size":9,"scale":1,"weight":0.30000001192092896},[14,11],{"size":60,"scale":-1,"weight":-0.800000011920929},[109,87],{"size":197,"scale":-1,"weight":-0.800000011920929},[358,286],{"size":40,"scale":1,"weight":0.30000001192092896},[62,50],{"size":6,"scale":2,"weight":-0.4000000059604645},[11,9],{"size":155,"scale":3,"weight":0.23000000417232513},[382,307],{"size":74,"scale":2,"weight":0.23000000417232513},[143,116],{"size":44,"scale":1,"weight":0.23000000417232513},[67,55],{"size":195,"scale":1,"weight":0.5600000023841858},[310,251],{"size":41,"scale":3,"weight":0.30000001192092896},[102,82],{"size":77,"scale":-1,"weight":-0.800000011920929},[140,112],{"size":33,"scale":-1,"weight":0.5600000023841858},[67,54],{"size":64,"scale":1,"weight":0.23000000417232513},[98,80],{"size":63,"scale":3,"weight":0.23000000417232513},[155,125],{"size":152,"scale":-1,"weight":-0.800000011920929},[276,221],{"size":78,"scale":1,"weight":-0.6000000238418579},[113,90],{"size":49,"scale":2,"weight":-0.800000011920929},[89,72],{"size":93,"scale":2,"weight":0.4000000059604645},[185,149],{"size":194,"scale":2,"weight":0.23000000417232513},[374,302],{"size":116,"scale":2,"weight":0.30000001192092896},[227,183],{"size":135,"scale":2,"weight":0.4000000059604645},[267,216],{"size":144,"scale":1,"weight":0.6200000047683716},[233,189],{"size":13,"scale":3,"weight":0.6200000047683716},[34,28],{"size":105,"scale":1,"weight":0.30000001192092896},[162,131],{"size":187,"scale":2,"weight":0.6200000047683716},[384,311],{"size":19,"scale":2,"weight":0},[36,29],{"size":42,"scale":2,"weight":-0.6000000238418579},[77,61],{"size":199,"scale":3,"weight":-0.800000011920929},[466,374],{"size":53,"scale":-1,"weight":0.23000000417232513},[102,83],{"size":167,"scale":-1,"weight":0.6200000047683716},[343,277],{"size":42,"scale":-1,"weight":0.6200000047683716},[87,70],{"size":193,"scale":-1,"weight":0.4000000059604645},[381,309],{"size":137,"scale":-1,"weight":0.6200000047683716},[281,228],{"size":111,"scale":3,"weight":-0.4000000059604645},[266,212],{"size":107,"scale":3,"weight":0.5600000023841858},[275,222],{"size":197,"scale":-1,"weight":-0.6000000238418579},[361,285],{"size":84,"scale":-1,"weight":-0.4000000059604645},[157,126],{"size":97,"scale":1,"weight":-0.800000011920929},[139,110],{"size":194,"scale":3,"weight":-0.800000011920929},[454,364],{"size":179,"scale":1,"weight":-0.4000000059604645},[265,212],{"size":113,"scale":-1,"weight":0.23000000417232513},[218,176],{"size":132,"scale":3,"weight":0.5600000023841858},[340,275],{"size":80,"scale":2,"weight":0.6200000047683716},[164,133],{"size":14,"scale":1,"weight":0.6200000047683716},[23,19],{"size":163,"scale":3,"weight":0},[396,318],{"size":5,"scale":2,"weight":0.6200000047683716},[11,9],{"size":94,"scale":1,"weight":-0.6000000238418579},[136,108],{"size":6,"scale":1,"weight":0},[10,8],{"size":126,"scale":1,"weight":-0.6000000238418579},[182,144],{"size":139,"scale":2,"weight":-0.4000000059604645},[260,208],{"size":172,"scale":2,"weight":-0.4000000059604645},[322,257],{"size":50,"scale":3,"weight":-0.4000000059604645},[120,95],{"size":140,"scale":1,"weight":0.6200000047683716},[226,183],{"size":163,"scale":1,"weight":0.23000000417232513},[248,201],{"size":32,"scale":3,"weight":0.30000001192092896},[80,64],{"size":106,"scale":1,"weight":-0.800000011920929},[152,120],{"size":39,"scale":2,"weight":0.23000000417232513},[75,61],{"size":86,"scale":3,"weight":-0.4000000059604645},[206,164],{"size":199,"scale":3,"weight":-0.4000000059604645},[477,380],{"size":18,"scale":1,"weight":0.30000001192092896},[28,22],{"size":122,"scale":3,"weight":0.4000000059604645},[307,248],{"size":77,"scale":3,"weight":-0.6000000238418579},[181,144],{"size":26,"scale":3,"weight":0.5600000023841858},[67,55],{"size":156,"scale":-1,"weight":0.30000001192092896},[304,245],{"size":115,"scale":2,"weight":0.23000000417232513},[222,179],{"size":115,"scale":1,"weight":0.5600000023841858},[183,149],{"size":101,"scale":2,"weight":0.5600000023841858},[204,165],{"size":90,"scale":2,"weight":0.6200000047683716},[185,150],{"size":150,"scale":-1,"weight":-0.4000000059604645},[281,224],{"size":12,"scale":1,"weight":0.23000000417232513},[19,16],{"size":89,"scale":-1,"weight":0.23000000417232513},[172,139],{"size":159,"scale":-1,"weight":0.5600000023841858},[321,260],{"size":10,"scale":2,"weight":-0.4000000059604645},[19,16],{"size":122,"scale":3,"weight":-0.4000000059604645},[293,232],{"size":60,"scale":2,"weight":0.4000000059604645},[119,96],{"size":26,"scale":2,"weight":0},[50,40],{"size":139,"scale":-1,"weight":0.5600000023841858},[281,227],{"size":166,"scale":1,"weight":-0.6000000238418579},[240,190],{"size":177,"scale":3,"weight":-0.4000000059604645},[424,338],{"size":75,"scale":3,"weight":0.30000001192092896},[187,151],{"size":182,"scale":3,"weight":0.23000000417232513},[448,360],{"size":120,"scale":1,"weight":0.4000000059604645},[188,152],{"size":200,"scale":-1,"weight":-0.4000000059604645},[374,299],{"size":129,"scale":2,"weight":0.6200000047683716},[265,215],{"size":149,"scale":2,"weight":0.5600000023841858},[301,243],{"size":130,"scale":-1,"weight":0.4000000059604645},[257,208],{"size":111,"scale":2,"weight":0},[211,166],{"size":161,"scale":-1,"weight":0.4000000059604645},[318,257],{"size":156,"scale":-1,"weight":-0.800000011920929},[284,227],{"size":10,"scale":-1,"weight":0.5600000023841858},[21,17],{"size":44,"scale":2,"weight":0.30000001192092896},[86,70],{"size":101,"scale":3,"weight":0.5600000023841858},[260,210],{"size":139,"scale":-1,"weight":0.30000001192092896},[271,219],{"size":172,"scale":1,"weight":-0.800000011920929},[246,196],{"size":9,"scale":-1,"weight":0.6200000047683716},[19,16],{"size":45,"scale":1,"weight":0.4000000059604645},[70,57],{"size":22,"scale":3,"weight":-0.6000000238418579},[52,42],{"size":87,"scale":3,"weight":0.4000000059604645},[220,178],{"size":151,"scale":2,"weight":0.23000000417232513},[291,235],{"size":16,"scale":1,"weight":0.6200000047683716},[27,21],{"size":139,"scale":1,"weight":0.6200000047683716},[225,182],{"size":131,"scale":-1,"weight":-0.800000011920929},[239,191],{"size":160,"scale":3,"weight":-0.6000000238418579},[377,300],{"size":16,"scale":3,"weight":0.23000000417232513},[39,33],{"size":8,"scale":2,"weight":0.23000000417232513},[16,13],{"size":139,"scale":1,"weight":0.30000001192092896},[214,174],{"size":20,"scale":-1,"weight":0},[38,31],{"size":164,"scale":1,"weight":-0.800000011920929},[235,186],{"size":44,"scale":1,"weight":0.5600000023841858},[70,57],{"size":173,"scale":1,"weight":0.4000000059604645},[270,219],{"size":60,"scale":3,"weight":-0.6000000238418579},[141,113],{"size":180,"scale":3,"weight":0.6200000047683716},[470,381],{"size":144,"scale":2,"weight":0.4000000059604645},[284,230],{"size":102,"scale":-1,"weight":0.6200000047683716},[210,170],{"size":10,"scale":1,"weight":0.4000000059604645},[16,13],{"size":99,"scale":3,"weight":0.4000000059604645},[250,201],{"size":128,"scale":2,"weight":0},[243,192],{"size":182,"scale":-1,"weight":-0.4000000059604645},[341,273],{"size":92,"scale":3,"weight":-0.800000011920929},[216,173],{"size":35,"scale":1,"weight":-0.4000000059604645},[52,42],{"size":97,"scale":-1,"weight":0.23000000417232513},[188,151],{"size":104,"scale":2,"weight":0},[197,156],{"size":26,"scale":2,"weight":0.23000000417232513},[51,41],{"size":46,"scale":1,"weight":0.5600000023841858},[73,59],{"size":68,"scale":-1,"weight":0.6200000047683716},[140,113],{"size":148,"scale":2,"weight":0.5600000023841858},[299,242],{"size":46,"scale":2,"weight":0.23000000417232513},[89,72],{"size":23,"scale":2,"weight":-0.6000000238418579},[43,34],{"size":66,"scale":1,"weight":-0.6000000238418579},[95,76],{"size":196,"scale":3,"weight":-0.4000000059604645},[470,374],{"size":159,"scale":-1,"weight":0.23000000417232513},[307,248],{"size":1,"scale":1,"weight":0},[2,2],{"size":68,"scale":2,"weight":-0.800000011920929},[124,99],{"size":157,"scale":2,"weight":0.6200000047683716},[322,260],{"size":68,"scale":1,"weight":0.5600000023841858},[109,88],{"size":53,"scale":3,"weight":-0.6000000238418579},[125,100],{"size":188,"scale":-1,"weight":0.23000000417232513},[362,293],{"size":62,"scale":-1,"weight":-0.6000000238418579},[114,90],{"size":60,"scale":2,"weight":0.6200000047683716},[123,100],{"size":7,"scale":-1,"weight":0.30000001192092896},[14,11],{"size":19,"scale":1,"weight":-0.4000000059604645},[28,23],{"size":134,"scale":3,"weight":0.30000001192092896},[334,268],{"size":94,"scale":3,"weight":0.4000000059604645},[238,191],{"size":90,"scale":3,"weight":0.4000000059604645},[228,183],{"size":25,"scale":1,"weight":-0.800000011920929},[36,28],{"size":131,"scale":-1,"weight":-0.6000000238418579},[240,190],{"size":178,"scale":2,"weight":-0.6000000238418579},[327,258],{"size":133,"scale":-1,"weight":-0.6000000238418579},[244,193],{"size":102,"scale":-1,"weight":0.4000000059604645},[201,163],{"size":142,"scale":1,"weight":-0.800000011920929},[203,161],{"size":154,"scale":2,"weight":0},[293,230],{"size":168,"scale":1,"weight":0},[253,205],{"size":9,"scale":3,"weight":0},[23,18],{"size":178,"scale":1,"weight":0.6200000047683716},[288,233],{"size":40,"scale":2,"weight":0.5600000023841858},[81,66],{"size":140,"scale":3,"weight":0.6200000047683716},[365,296],{"size":11,"scale":2,"weight":0.30000001192092896},[22,18],{"size":32,"scale":1,"weight":0.30000001192092896},[49,40],{"size":51,"scale":-1,"weight":0.4000000059604645},[101,82],{"size":73,"scale":2,"weight":-0.4000000059604645},[137,110],{"size":45,"scale":2,"weight":-0.6000000238418579},[83,66],{"size":57,"scale":2,"weight":-0.4000000059604645},[107,86],{"size":64,"scale":1,"weight":0.30000001192092896},[99,80],{"size":32,"scale":2,"weight":0.30000001192092896},[63,51],{"size":48,"scale":-1,"weight":0},[91,73],{"size":110,"scale":1,"weight":0.30000001192092896},[169,138],{"size":197,"scale":-1,"weight":0.5600000023841858},[397,321],{"size":158,"scale":2,"weight":0},[300,237],{"size":19,"scale":2,"weight":0.4000000059604645},[38,30],{"size":64,"scale":2,"weight":0.5600000023841858},[129,105],{"size":185,"scale":1,"weight":-0.800000011920929},[264,210],{"size":171,"scale":1,"weight":0.30000001192092896},[263,213],{"size":117,"scale":1,"weight":-0.4000000059604645},[173,139],{"size":159,"scale":-1,"weight":-0.800000011920929},[289,231],{"size":93,"scale":1,"weight":-0.800000011920929},[133,106],{"size":159,"scale":1,"weight":0.4000000059604645},[248,201],{"size":146,"scale":2,"weight":0.23000000417232513},[281,227],{"size":118,"scale":1,"weight":-0.6000000238418579},[170,135],{"size":1,"scale":1,"weight":-0.6000000238418579},[2,2],{"size":66,"scale":1,"weight":0.6200000047683716},[107,87],{"size":54,"scale":1,"weight":0.23000000417232513},[83,67],{"size":189,"scale":1,"weight":-0.4000000059604645},[279,225],{"size":185,"scale":-1,"weight":0.23000000417232513},[357,288],{"size":44,"scale":-1,"weight":0},[84,66],{"size":122,"scale":-1,"weight":-0.6000000238418579},[224,177],{"size":36,"scale":2,"weight":0.30000001192092896},[71,57],{"size":137,"scale":-1,"weight":-0.800000011920929},[249,199],{"size":159,"scale":3,"weight":-0.800000011920929},[372,299],{"size":143,"scale":2,"weight":0.5600000023841858},[289,233],{"size":68,"scale":-1,"weight":0.4000000059604645},[134,109],{"size":181,"scale":2,"weight":0.5600000023841858},[365,296],{"size":173,"scale":-1,"weight":-0.800000011920929},[314,251],{"size":155,"scale":-1,"weight":-0.4000000059604645},[290,232],{"size":190,"scale":1,"weight":-0.6000000238418579},[275,217],{"size":158,"scale":3,"weight":0},[384,308],{"size":41,"scale":2,"weight":0.23000000417232513},[80,64],{"size":174,"scale":3,"weight":0.6200000047683716},[454,367],{"size":91,"scale":1,"weight":-0.6000000238418579},[132,104],{"size":26,"scale":1,"weight":-0.6000000238418579},[38,31],{"size":38,"scale":1,"weight":0.30000001192092896},[59,48],{"size":24,"scale":-1,"weight":0},[46,36],{"size":199,"scale":2,"weight":-0.4000000059604645},[373,298],{"size":2,"scale":3,"weight":0.23000000417232513},[6,4],{"size":106,"scale":2,"weight":-0.6000000238418579},[195,153],{"size":79,"scale":3,"weight":0.30000001192092896},[197,159],{"size":145,"scale":2,"weight":0},[275,217],{"size":58,"scale":-1,"weight":-0.4000000059604645},[109,87],{"size":171,"scale":-1,"weight":-0.6000000238418579},[314,248],{"size":193,"scale":-1,"weight":0.30000001192092896},[376,304],{"size":185,"scale":-1,"weight":0.5600000023841858},[373,301],{"size":69,"scale":-1,"weight":0},[132,103],{"size":75,"scale":2,"weight":-0.4000000059604645},[140,112],{"size":49,"scale":1,"weight":0.4000000059604645},[77,63],{"size":121,"scale":1,"weight":0.6200000047683716},[196,159],{"size":84,"scale":3,"weight":-0.800000011920929},[197,158],{"size":35,"scale":2,"weight":0.5600000023841858},[71,57],{"size":117,"scale":2,"weight":0.30000001192092896},[228,184],{"size":96,"scale":2,"weight":0.23000000417232513},[185,150],{"size":150,"scale":-1,"weight":0.4000000059604645},[296,239],{"size":69,"scale":2,"weight":0.30000001192092896},[135,109],{"size":177,"scale":2,"weight":0},[336,265],{"size":82,"scale":2,"weight":0.30000001192092896},[160,129],{"size":196,"scale":2,"weight":0.23000000417232513},[378,305],{"size":134,"scale":-1,"weight":0.6200000047683716},[275,222],{"size":99,"scale":1,"weight":0.30000001192092896},[152,124],{"size":38,"scale":3,"weight":0},[93,75],{"size":122,"scale":3,"weight":0.30000001192092896},[304,244],{"size":26,"scale":3,"weight":0},[63,51],{"size":174,"scale":3,"weight":-0.4000000059604645},[417,332],{"size":158,"scale":3,"weight":0.4000000059604645},[398,322],{"size":64,"scale":-1,"weight":-0.800000011920929},[117,93],{"size":128,"scale":-1,"weight":-0.4000000059604645},[240,191],{"size":134,"scale":1,"weight":0.23000000417232513},[204,165],{"size":60,"scale":2,"weight":0.23000000417232513},[116,93],{"size":112,"scale":1,"weight":0.23000000417232513},[171,138],{"size":95,"scale":3,"weight":0},[231,185],{"size":148,"scale":-1,"weight":0},[282,221],{"size":91,"scale":2,"weight":-0.800000011920929},[166,133],{"size":183,"scale":2,"weight":-0.4000000059604645},[343,274],{"size":187,"scale":3,"weight":0.5600000023841858},[480,388],{"size":199,"scale":2,"weight":0.23000000417232513},[384,310],{"size":32,"scale":2,"weight":0.5600000023841858},[65,53],{"size":199,"scale":-1,"weight":-0.4000000059604645},[373,298],{"size":154,"scale":-1,"weight":-0.6000000238418579},[282,223],{"size":194,"scale":1,"weight":0},[292,237],{"size":162,"scale":1,"weight":0.4000000059604645},[252,205],{"size":99,"scale":3,"weight":0},[241,193],{"size":54,"scale":1,"weight":0.6200000047683716},[88,71],{"size":162,"scale":-1,"weight":0.23000000417232513},[312,252],{"size":18,"scale":3,"weight":0.5600000023841858},[47,38],{"size":114,"scale":3,"weight":0.4000000059604645},[287,232],{"size":142,"scale":-1,"weight":-0.800000011920929},[258,207],{"size":165,"scale":2,"weight":-0.6000000238418579},[303,239],{"size":94,"scale":2,"weight":-0.6000000238418579},[173,136],{"size":35,"scale":3,"weight":0.5600000023841858},[90,73],{"size":194,"scale":-1,"weight":-0.4000000059604645},[363,290],{"size":72,"scale":3,"weight":0},[175,140],{"size":13,"scale":3,"weight":0.23000000417232513},[33,26],{"size":167,"scale":-1,"weight":0.30000001192092896},[325,263],{"size":145,"scale":2,"weight":-0.800000011920929},[263,211],{"size":11,"scale":1,"weight":0.6200000047683716},[19,15],{"size":18,"scale":2,"weight":0.4000000059604645},[36,29],{"size":27,"scale":-1,"weight":-0.800000011920929},[50,40],{"size":190,"scale":1,"weight":0.30000001192092896},[292,237],{"size":175,"scale":3,"weight":0.23000000417232513},[431,346],{"size":132,"scale":3,"weight":0.23000000417232513},[325,262],{"size":62,"scale":2,"weight":0.4000000059604645},[123,100],{"size":29,"scale":-1,"weight":0},[55,44],{"size":20,"scale":2,"weight":0.30000001192092896},[39,31],{"size":100,"scale":1,"weight":0.6200000047683716},[162,131],{"size":28,"scale":3,"weight":-0.6000000238418579},[66,53],{"size":126,"scale":3,"weight":0.4000000059604645},[317,256],{"size":147,"scale":1,"weight":0.30000001192092896},[226,184],{"size":151,"scale":2,"weight":0.4000000059604645},[299,241],{"size":106,"scale":-1,"weight":-0.800000011920929},[193,154],{"size":51,"scale":2,"weight":-0.4000000059604645},[96,77],{"size":124,"scale":-1,"weight":0.30000001192092896},[242,196],{"size":115,"scale":1,"weight":-0.4000000059604645},[170,137],{"size":127,"scale":1,"weight":-0.6000000238418579},[184,145],{"size":42,"scale":3,"weight":0},[103,82],{"size":193,"scale":1,"weight":0},[290,235],{"size":36,"scale":3,"weight":0.6200000047683716},[95,76],{"size":1,"scale":3,"weight":-0.4000000059604645},[3,2],{"size":195,"scale":3,"weight":0.5600000023841858},[501,405],{"size":77,"scale":3,"weight":-0.4000000059604645},[185,147],{"size":65,"scale":1,"weight":-0.6000000238418579},[94,75],{"size":187,"scale":1,"weight":0.30000001192092896},[288,234],{"size":136,"scale":2,"weight":-0.6000000238418579},[249,197],{"size":139,"scale":3,"weight":-0.800000011920929},[326,261],{"size":28,"scale":3,"weight":-0.800000011920929},[66,53],{"size":164,"scale":1,"weight":-0.6000000238418579},[237,187],{"size":147,"scale":1,"weight":-0.800000011920929},[210,167],{"size":187,"scale":3,"weight":-0.800000011920929},[438,351],{"size":145,"scale":2,"weight":0.5600000023841858},[292,236],{"size":163,"scale":2,"weight":0.5600000023841858},[329,265],{"size":86,"scale":3,"weight":0.4000000059604645},[217,175],{"size":187,"scale":-1,"weight":0.5600000023841858},[377,305],{"size":26,"scale":1,"weight":0},[39,33],{"size":149,"scale":1,"weight":0.30000001192092896},[230,186],{"size":35,"scale":3,"weight":0.23000000417232513},[87,70],{"size":191,"scale":1,"weight":0.5600000023841858},[304,246],{"size":63,"scale":3,"weight":0.30000001192092896},[157,126],{"size":136,"scale":3,"weight":0.23000000417232513},[335,270],{"size":20,"scale":1,"weight":-0.6000000238418579},[29,24],{"size":129,"scale":2,"weight":0.5600000023841858},[261,211],{"size":199,"scale":-1,"weight":0.30000001192092896},[388,313],{"size":66,"scale":2,"weight":0},[126,99],{"size":21,"scale":1,"weight":0.23000000417232513},[32,27],{"size":176,"scale":2,"weight":-0.4000000059604645},[330,264],{"size":122,"scale":3,"weight":0.5600000023841858},[314,253],{"size":17,"scale":-1,"weight":-0.6000000238418579},[32,25],{"size":31,"scale":-1,"weight":0.23000000417232513},[61,48],{"size":106,"scale":1,"weight":0},[160,129],{"size":71,"scale":1,"weight":-0.4000000059604645},[105,85],{"size":11,"scale":-1,"weight":-0.4000000059604645},[21,17],{"size":96,"scale":-1,"weight":0.23000000417232513},[185,150],{"size":38,"scale":3,"weight":0.30000001192092896},[94,77],{"size":62,"scale":1,"weight":-0.4000000059604645},[92,73],{"size":98,"scale":1,"weight":0.5600000023841858},[156,126],{"size":18,"scale":1,"weight":0.4000000059604645},[29,23],{"size":75,"scale":1,"weight":0.23000000417232513},[114,93],{"size":171,"scale":3,"weight":-0.800000011920929},[401,321],{"size":118,"scale":3,"weight":0.30000001192092896},[294,237],{"size":105,"scale":3,"weight":0.4000000059604645},[265,214],{"size":93,"scale":3,"weight":0.6200000047683716},[243,197],{"size":128,"scale":3,"weight":-0.800000011920929},[300,241],{"size":158,"scale":-1,"weight":0.5600000023841858},[319,258],{"size":133,"scale":3,"weight":0.23000000417232513},[328,263],{"size":18,"scale":3,"weight":-0.6000000238418579},[43,34],{"size":19,"scale":3,"weight":-0.6000000238418579},[45,36],{"size":91,"scale":2,"weight":0.6200000047683716},[187,151],{"size":124,"scale":1,"weight":0},[187,152],{"size":4,"scale":-1,"weight":0.5600000023841858},[9,7],{"size":103,"scale":1,"weight":0},[155,126],{"size":71,"scale":2,"weight":0.5600000023841858},[144,116],{"size":35,"scale":3,"weight":-0.4000000059604645},[84,67],{"size":79,"scale":-1,"weight":0.30000001192092896},[154,125],{"size":131,"scale":1,"weight":0},[197,160],{"size":185,"scale":2,"weight":-0.6000000238418579},[339,268],{"size":96,"scale":1,"weight":-0.4000000059604645},[142,114],{"size":73,"scale":1,"weight":-0.800000011920929},[105,83],{"size":104,"scale":-1,"weight":0.5600000023841858},[210,170],{"size":76,"scale":-1,"weight":0.4000000059604645},[151,121],{"size":129,"scale":2,"weight":0.23000000417232513},[249,201],{"size":60,"scale":1,"weight":0.6200000047683716},[98,79],{"size":101,"scale":2,"weight":-0.6000000238418579},[185,147],{"size":14,"scale":-1,"weight":0.6200000047683716},[29,23],{"size":19,"scale":1,"weight":-0.6000000238418579},[28,23],{"size":27,"scale":2,"weight":-0.4000000059604645},[51,41],{"size":46,"scale":3,"weight":0.6200000047683716},[120,97],{"size":187,"scale":1,"weight":-0.6000000238418579},[270,214],{"size":45,"scale":2,"weight":0},[86,68],{"size":2,"scale":2,"weight":-0.6000000238418579},[4,3],{"size":9,"scale":2,"weight":0.6200000047683716},[19,16],{"size":20,"scale":3,"weight":0.5600000023841858},[51,42],{"size":22,"scale":-1,"weight":0.6200000047683716},[46,37],{"size":67,"scale":1,"weight":0.6200000047683716},[109,88],{"size":142,"scale":2,"weight":0.30000001192092896},[277,224],{"size":90,"scale":1,"weight":0.23000000417232513},[137,111],{"size":93,"scale":3,"weight":0.23000000417232513},[229,184],{"size":91,"scale":2,"weight":0.4000000059604645},[180,146],{"size":100,"scale":1,"weight":0.5600000023841858},[159,129],{"size":65,"scale":1,"weight":0.5600000023841858},[104,84],{"size":108,"scale":2,"weight":-0.6000000238418579},[198,157],{"size":180,"scale":2,"weight":0.4000000059604645},[356,287],{"size":90,"scale":3,"weight":0.6200000047683716},[235,190],{"size":156,"scale":-1,"weight":-0.4000000059604645},[292,233],{"size":125,"scale":3,"weight":-0.4000000059604645},[300,238],{"size":166,"scale":1,"weight":-0.800000011920929},[237,189],{"size":104,"scale":-1,"weight":0.30000001192092896},[203,164],{"size":75,"scale":-1,"weight":0},[143,112],{"size":102,"scale":1,"weight":0.5600000023841858},[163,132],{"size":181,"scale":-1,"weight":0.6200000047683716},[372,301],{"size":11,"scale":2,"weight":0.5600000023841858},[23,18],{"size":132,"scale":2,"weight":0.5600000023841858},[266,215],{"size":93,"scale":1,"weight":0.6200000047683716},[151,122],{"size":181,"scale":1,"weight":-0.6000000238418579},[261,207],{"size":106,"scale":3,"weight":0.23000000417232513},[261,210],{"size":93,"scale":3,"weight":-0.800000011920929},[218,175],{"size":58,"scale":2,"weight":0.4000000059604645},[115,93],{"size":2,"scale":-1,"weight":0.4000000059604645},[4,3],{"size":121,"scale":2,"weight":0.6200000047683716},[249,201],{"size":112,"scale":2,"weight":0.6200000047683716},[230,187],{"size":92,"scale":3,"weight":0.30000001192092896},[229,185],{"size":100,"scale":2,"weight":0.23000000417232513},[193,155],{"size":117,"scale":2,"weight":0.5600000023841858},[236,191],{"size":6,"scale":-1,"weight":0.6200000047683716},[13,10],{"size":164,"scale":3,"weight":-0.800000011920929},[385,308],{"size":192,"scale":1,"weight":-0.800000011920929},[274,218],{"size":89,"scale":1,"weight":0.5600000023841858},[142,115],{"size":42,"scale":3,"weight":0.4000000059604645},[106,85],{"size":70,"scale":2,"weight":-0.4000000059604645},[131,105],{"size":105,"scale":3,"weight":0.23000000417232513},[259,208],{"size":29,"scale":1,"weight":-0.6000000238418579},[42,34],{"size":17,"scale":1,"weight":0},[26,21],{"size":179,"scale":2,"weight":0.6200000047683716},[367,297],{"size":17,"scale":1,"weight":-0.800000011920929},[25,19],{"size":137,"scale":3,"weight":0.30000001192092896},[341,275],{"size":178,"scale":1,"weight":0.4000000059604645},[278,225],{"size":70,"scale":3,"weight":0.30000001192092896},[174,141],{"size":22,"scale":-1,"weight":-0.6000000238418579},[41,32],{"size":28,"scale":3,"weight":-0.4000000059604645},[68,54],{"size":138,"scale":2,"weight":0.5600000023841858},[278,225],{"size":14,"scale":2,"weight":-0.800000011920929},[26,20],{"size":150,"scale":-1,"weight":-0.800000011920929},[272,218],{"size":192,"scale":3,"weight":0},[466,374],{"size":155,"scale":-1,"weight":0},[294,232],{"size":103,"scale":-1,"weight":0.6200000047683716},[212,171],{"size":71,"scale":1,"weight":0.4000000059604645},[112,90],{"size":12,"scale":3,"weight":0.5600000023841858},[31,26],{"size":135,"scale":-1,"weight":0.30000001192092896},[264,213],{"size":161,"scale":3,"weight":0.23000000417232513},[397,318],{"size":86,"scale":1,"weight":0},[129,105],{"size":133,"scale":-1,"weight":-0.800000011920929},[242,193],{"size":85,"scale":-1,"weight":0.6200000047683716},[174,142],{"size":108,"scale":-1,"weight":-0.4000000059604645},[202,162],{"size":73,"scale":-1,"weight":0.4000000059604645},[144,117],{"size":29,"scale":1,"weight":0.30000001192092896},[45,37],{"size":185,"scale":3,"weight":-0.4000000059604645},[444,353],{"size":90,"scale":1,"weight":0.6200000047683716},[146,118],{"size":144,"scale":2,"weight":0},[274,216],{"size":26,"scale":2,"weight":0.5600000023841858},[52,43],{"size":86,"scale":1,"weight":0.5600000023841858},[137,111],{"size":45,"scale":1,"weight":0.30000001192092896},[69,56],{"size":145,"scale":3,"weight":0.23000000417232513},[357,287],{"size":5,"scale":1,"weight":-0.4000000059604645},[8,7],{"size":134,"scale":3,"weight":-0.6000000238418579},[316,251],{"size":161,"scale":3,"weight":0.6200000047683716},[420,340],{"size":91,"scale":-1,"weight":0.30000001192092896},[177,144],{"size":159,"scale":1,"weight":-0.800000011920929},[227,181],{"size":119,"scale":-1,"weight":0.30000001192092896},[232,188],{"size":193,"scale":-1,"weight":0.6200000047683716},[396,321],{"size":87,"scale":2,"weight":-0.4000000059604645},[163,130],{"size":28,"scale":-1,"weight":-0.4000000059604645},[53,42],{"size":87,"scale":2,"weight":-0.800000011920929},[159,127],{"size":45,"scale":2,"weight":0.4000000059604645},[89,72],{"size":104,"scale":1,"weight":-0.6000000238418579},[150,119],{"size":147,"scale":-1,"weight":0.4000000059604645},[291,235],{"size":45,"scale":1,"weight":-0.800000011920929},[65,51],{"size":171,"scale":1,"weight":0.4000000059604645},[267,216],{"size":26,"scale":3,"weight":-0.4000000059604645},[62,50],{"size":120,"scale":1,"weight":0.5600000023841858},[191,154],{"size":153,"scale":2,"weight":0.6200000047683716},[314,254],{"size":66,"scale":2,"weight":0.30000001192092896},[129,105],{"size":52,"scale":1,"weight":-0.800000011920929},[75,59],{"size":169,"scale":1,"weight":-0.6000000238418579},[244,193],{"size":30,"scale":1,"weight":0},[46,37],{"size":200,"scale":-1,"weight":0.5600000023841858},[403,326],{"size":105,"scale":-1,"weight":0},[200,157],{"size":9,"scale":1,"weight":-0.6000000238418579},[14,11],{"size":117,"scale":-1,"weight":-0.6000000238418579},[215,169],{"size":174,"scale":-1,"weight":-0.6000000238418579},[319,252],{"size":125,"scale":1,"weight":0.6200000047683716},[203,164],{"size":91,"scale":1,"weight":0.4000000059604645},[142,115],{"size":129,"scale":-1,"weight":0.23000000417232513},[249,201],{"size":162,"scale":2,"weight":-0.4000000059604645},[303,242],{"size":123,"scale":1,"weight":0.5600000023841858},[196,159],{"size":69,"scale":-1,"weight":0.4000000059604645},[136,110],{"size":132,"scale":2,"weight":-0.4000000059604645},[247,198],{"size":125,"scale":-1,"weight":-0.4000000059604645},[234,187],{"size":109,"scale":2,"weight":0.23000000417232513},[210,170],{"size":20,"scale":-1,"weight":0.23000000417232513},[39,31],{"size":28,"scale":1,"weight":-0.6000000238418579},[41,33],{"size":156,"scale":3,"weight":-0.800000011920929},[365,293],{"size":196,"scale":-1,"weight":0.30000001192092896},[382,308],{"size":93,"scale":-1,"weight":0.6200000047683716},[191,154],{"size":128,"scale":1,"weight":0.4000000059604645},[200,163],{"size":147,"scale":2,"weight":0.6200000047683716},[302,245],{"size":101,"scale":-1,"weight":0.5600000023841858},[204,165],{"size":141,"scale":1,"weight":0.30000001192092896},[217,176],{"size":56,"scale":3,"weight":0},[137,110],{"size":120,"scale":2,"weight":0.23000000417232513},[232,187],{"size":104,"scale":2,"weight":-0.6000000238418579},[191,151],{"size":57,"scale":-1,"weight":0.30000001192092896},[111,90],{"size":89,"scale":3,"weight":0},[216,174],{"size":127,"scale":1,"weight":0.4000000059604645},[199,160],{"size":139,"scale":3,"weight":0.30000001192092896},[346,278],{"size":176,"scale":-1,"weight":0.6200000047683716},[361,293],{"size":148,"scale":2,"weight":0.6200000047683716},[304,246],{"size":154,"scale":1,"weight":0.30000001192092896},[237,192],{"size":140,"scale":3,"weight":0.4000000059604645},[353,285],{"size":127,"scale":1,"weight":0.6200000047683716},[205,166],{"size":147,"scale":-1,"weight":0.30000001192092896},[286,232],{"size":134,"scale":2,"weight":0.6200000047683716},[275,222],{"size":100,"scale":-1,"weight":0},[190,150],{"size":4,"scale":-1,"weight":0},[8,7],{"size":191,"scale":-1,"weight":-0.800000011920929},[347,277],{"size":14,"scale":3,"weight":-0.6000000238418579},[34,27],{"size":94,"scale":3,"weight":0},[228,183],{"size":70,"scale":3,"weight":-0.6000000238418579},[165,132],{"size":173,"scale":3,"weight":0},[420,337],{"size":20,"scale":3,"weight":0.30000001192092896},[51,41],{"size":56,"scale":2,"weight":0.30000001192092896},[110,89],{"size":95,"scale":-1,"weight":0.23000000417232513},[183,149],{"size":80,"scale":-1,"weight":0.30000001192092896},[156,126],{"size":192,"scale":-1,"weight":0.30000001192092896},[374,302],{"size":9,"scale":2,"weight":-0.4000000059604645},[17,14],{"size":37,"scale":-1,"weight":0.30000001192092896},[73,58],{"size":25,"scale":3,"weight":0.5600000023841858},[65,53],{"size":86,"scale":1,"weight":0.23000000417232513},[131,107],{"size":133,"scale":3,"weight":-0.800000011920929},[312,250],{"size":87,"scale":-1,"weight":-0.6000000238418579},[160,126],{"size":99,"scale":2,"weight":-0.4000000059604645},[186,148],{"size":40,"scale":3,"weight":-0.800000011920929},[94,75],{"size":197,"scale":2,"weight":-0.4000000059604645},[369,294],{"size":116,"scale":-1,"weight":-0.6000000238418579},[213,168],{"size":69,"scale":3,"weight":0.6200000047683716},[180,146],{"size":183,"scale":1,"weight":0.23000000417232513},[279,226],{"size":63,"scale":-1,"weight":-0.800000011920929},[115,92],{"size":72,"scale":2,"weight":0.23000000417232513},[139,113],{"size":146,"scale":3,"weight":-0.800000011920929},[342,274],{"size":126,"scale":3,"weight":0.30000001192092896},[314,252],{"size":189,"scale":2,"weight":0.6200000047683716},[388,314],{"size":64,"scale":1,"weight":0.4000000059604645},[100,82],{"size":15,"scale":3,"weight":-0.4000000059604645},[36,29],{"size":86,"scale":3,"weight":0.23000000417232513},[212,170],{"size":134,"scale":2,"weight":0.23000000417232513},[259,208],{"size":126,"scale":3,"weight":0.5600000023841858},[324,261],{"size":108,"scale":1,"weight":-0.800000011920929},[155,123],{"size":83,"scale":3,"weight":0.4000000059604645},[210,169],{"size":3,"scale":3,"weight":-0.6000000238418579},[8,6],{"size":4,"scale":2,"weight":0.6200000047683716},[9,7],{"size":3,"scale":1,"weight":0.30000001192092896},[5,4],{"size":172,"scale":-1,"weight":-0.6000000238418579},[315,249],{"size":156,"scale":-1,"weight":-0.6000000238418579},[286,226],{"size":80,"scale":1,"weight":0},[120,98],{"size":161,"scale":3,"weight":-0.800000011920929},[377,302],{"size":101,"scale":2,"weight":0.23000000417232513},[195,158],{"size":60,"scale":1,"weight":0.23000000417232513},[92,74],{"size":111,"scale":2,"weight":0.4000000059604645},[219,177],{"size":199,"scale":2,"weight":0.4000000059604645},[393,318],{"size":172,"scale":1,"weight":-0.4000000059604645},[254,205],{"size":36,"scale":-1,"weight":0.30000001192092896},[71,57],{"size":120,"scale":2,"weight":0.30000001192092896},[234,189],{"size":195,"scale":-1,"weight":0.6200000047683716},[400,324],{"size":30,"scale":3,"weight":0},[73,59],{"size":161,"scale":3,"weight":0.5600000023841858},[413,334],{"size":195,"scale":-1,"weight":0.30000001192092896},[380,307],{"size":129,"scale":3,"weight":0.6200000047683716},[336,272],{"size":66,"scale":2,"weight":0.6200000047683716},[136,110],{"size":29,"scale":2,"weight":0.23000000417232513},[56,46],{"size":150,"scale":3,"weight":0.23000000417232513},[370,297],{"size":129,"scale":-1,"weight":0.6200000047683716},[265,215],{"size":128,"scale":1,"weight":0.30000001192092896},[197,160],{"size":174,"scale":3,"weight":0.30000001192092896},[433,348],{"size":190,"scale":3,"weight":-0.800000011920929},[445,357],{"size":65,"scale":-1,"weight":0.5600000023841858},[131,106],{"size":199,"scale":1,"weight":0.30000001192092896},[307,248],{"size":31,"scale":3,"weight":0.30000001192092896},[78,62],{"size":30,"scale":-1,"weight":0.5600000023841858},[61,49],{"size":120,"scale":1,"weight":-0.4000000059604645},[177,142],{"size":132,"scale":3,"weight":-0.6000000238418579},[311,248],{"size":73,"scale":-1,"weight":-0.6000000238418579},[134,106],{"size":21,"scale":1,"weight":0.5600000023841858},[33,28],{"size":163,"scale":-1,"weight":0.23000000417232513},[314,253],{"size":172,"scale":2,"weight":-0.800000011920929},[313,250],{"size":44,"scale":3,"weight":-0.6000000238418579},[104,83],{"size":114,"scale":3,"weight":0.30000001192092896},[283,229],{"size":32,"scale":3,"weight":-0.6000000238418579},[76,60],{"size":83,"scale":3,"weight":0.23000000417232513},[205,165],{"size":135,"scale":2,"weight":-0.6000000238418579},[248,196],{"size":134,"scale":3,"weight":0.4000000059604645},[338,272],{"size":28,"scale":2,"weight":0.23000000417232513},[54,44],{"size":168,"scale":1,"weight":-0.4000000059604645},[248,200],{"size":1,"scale":3,"weight":0.5600000023841858},[3,2],{"size":155,"scale":2,"weight":0.5600000023841858},[313,253],{"size":153,"scale":-1,"weight":-0.6000000238418579},[281,222],{"size":43,"scale":2,"weight":-0.800000011920929},[79,63],{"size":92,"scale":2,"weight":0.23000000417232513},[178,143],{"size":17,"scale":3,"weight":-0.4000000059604645},[41,33],{"size":76,"scale":-1,"weight":-0.6000000238418579},[140,110],{"size":50,"scale":-1,"weight":0},[96,75],{"size":93,"scale":-1,"weight":0.4000000059604645},[185,149],{"size":3,"scale":3,"weight":-0.800000011920929},[8,6],{"size":12,"scale":-1,"weight":-0.6000000238418579},[23,18],{"size":108,"scale":-1,"weight":0.23000000417232513},[208,168],{"size":5,"scale":3,"weight":-0.6000000238418579},[13,10],{"size":53,"scale":3,"weight":0.5600000023841858},[136,111],{"size":72,"scale":3,"weight":0.6200000047683716},[188,152],{"size":81,"scale":2,"weight":0.6200000047683716},[166,135],{"size":49,"scale":3,"weight":0.5600000023841858},[126,102],{"size":5,"scale":1,"weight":-0.800000011920929},[8,6],{"size":78,"scale":3,"weight":0},[190,153],{"size":145,"scale":1,"weight":-0.4000000059604645},[215,172],{"size":147,"scale":1,"weight":0},[222,179],{"size":149,"scale":1,"weight":-0.4000000059604645},[220,177],{"size":74,"scale":-1,"weight":0.5600000023841858},[149,121],{"size":97,"scale":3,"weight":0.4000000059604645},[245,198],{"size":133,"scale":1,"weight":0.23000000417232513},[203,164],{"size":67,"scale":2,"weight":0.5600000023841858},[136,110],{"size":106,"scale":1,"weight":0.5600000023841858},[169,136],{"size":122,"scale":-1,"weight":0},[232,183],{"size":64,"scale":3,"weight":0},[156,125],{"size":91,"scale":1,"weight":0.30000001192092896},[140,113],{"size":155,"scale":2,"weight":-0.6000000238418579},[284,225],{"size":137,"scale":2,"weight":0},[261,205],{"size":136,"scale":1,"weight":-0.800000011920929},[195,155],{"size":162,"scale":-1,"weight":-0.4000000059604645},[303,242],{"size":109,"scale":2,"weight":0.30000001192092896},[213,172],{"size":72,"scale":2,"weight":0.30000001192092896},[140,114],{"size":94,"scale":2,"weight":0.5600000023841858},[189,153],{"size":45,"scale":1,"weight":-0.6000000238418579},[66,52],{"size":154,"scale":1,"weight":0},[232,188],{"size":160,"scale":-1,"weight":-0.4000000059604645},[300,240],{"size":45,"scale":2,"weight":0.23000000417232513},[88,71],{"size":198,"scale":2,"weight":0.5600000023841858},[399,323],{"size":69,"scale":1,"weight":-0.800000011920929},[99,78],{"size":50,"scale":1,"weight":-0.6000000238418579},[73,58],{"size":171,"scale":2,"weight":0.5600000023841858},[344,279],{"size":123,"scale":-1,"weight":-0.4000000059604645},[231,184],{"size":73,"scale":3,"weight":0.30000001192092896},[182,146],{"size":97,"scale":1,"weight":0.6200000047683716},[157,127],{"size":160,"scale":2,"weight":-0.6000000238418579},[294,232],{"size":38,"scale":-1,"weight":-0.6000000238418579},[70,56],{"size":87,"scale":1,"weight":0},[132,107],{"size":77,"scale":3,"weight":-0.800000011920929},[181,144],{"size":183,"scale":3,"weight":0.6200000047683716},[478,386],{"size":128,"scale":-1,"weight":-0.6000000238418579},[235,185],{"size":87,"scale":-1,"weight":0.23000000417232513},[168,136],{"size":171,"scale":2,"weight":0},[325,256],{"size":65,"scale":1,"weight":0.23000000417232513},[100,81],{"size":18,"scale":3,"weight":0.30000001192092896},[45,36],{"size":166,"scale":-1,"weight":-0.4000000059604645},[311,249],{"size":23,"scale":1,"weight":0.5600000023841858},[37,30],{"size":97,"scale":-1,"weight":0.30000001192092896},[190,153],{"size":56,"scale":1,"weight":-0.6000000238418579},[82,65],{"size":57,"scale":-1,"weight":0},[108,86],{"size":27,"scale":3,"weight":0.5600000023841858},[70,56],{"size":5,"scale":-1,"weight":0.6200000047683716},[11,9],{"size":41,"scale":1,"weight":0.30000001192092896},[64,52],{"size":125,"scale":1,"weight":-0.800000011920929},[179,142],{"size":50,"scale":-1,"weight":0.6200000047683716},[103,84],{"size":145,"scale":-1,"weight":-0.6000000238418579},[266,210],{"size":66,"scale":2,"weight":-0.6000000238418579},[122,96],{"size":63,"scale":-1,"weight":-0.4000000059604645},[119,95],{"size":42,"scale":2,"weight":-0.4000000059604645},[79,63],{"size":200,"scale":2,"weight":0},[380,299],{"size":77,"scale":2,"weight":0.5600000023841858},[156,125],{"size":183,"scale":-1,"weight":-0.4000000059604645},[343,274],{"size":80,"scale":1,"weight":-0.800000011920929},[115,91],{"size":192,"scale":-1,"weight":0.6200000047683716},[394,318],{"size":133,"scale":3,"weight":0.5600000023841858},[342,276],{"size":160,"scale":1,"weight":0.5600000023841858},[255,206],{"size":22,"scale":2,"weight":0.5600000023841858},[45,36],{"size":72,"scale":-1,"weight":-0.800000011920929},[131,105],{"size":185,"scale":-1,"weight":-0.4000000059604645},[346,277],{"size":170,"scale":3,"weight":0.5600000023841858},[437,353],{"size":123,"scale":1,"weight":-0.800000011920929},[176,140],{"size":87,"scale":-1,"weight":-0.800000011920929},[159,127],{"size":163,"scale":-1,"weight":0},[310,244],{"size":72,"scale":1,"weight":0.23000000417232513},[110,89],{"size":105,"scale":-1,"weight":0.6200000047683716},[216,174],{"size":142,"scale":2,"weight":0.5600000023841858},[286,232],{"size":58,"scale":1,"weight":-0.4000000059604645},[86,69],{"size":4,"scale":2,"weight":-0.6000000238418579},[8,7],{"size":85,"scale":-1,"weight":0.23000000417232513},[164,133],{"size":82,"scale":-1,"weight":0.5600000023841858},[166,134],{"size":48,"scale":2,"weight":0.4000000059604645},[95,77],{"size":61,"scale":1,"weight":0.4000000059604645},[96,77],{"size":35,"scale":1,"weight":0.5600000023841858},[56,46],{"size":53,"scale":-1,"weight":0.4000000059604645},[105,85],{"size":127,"scale":2,"weight":-0.800000011920929},[231,185],{"size":173,"scale":-1,"weight":0.23000000417232513},[334,269],{"size":8,"scale":1,"weight":-0.4000000059604645},[12,10],{"size":90,"scale":2,"weight":0.30000001192092896},[176,142],{"size":126,"scale":2,"weight":0.23000000417232513},[243,196],{"size":182,"scale":2,"weight":0},[346,272],{"size":140,"scale":2,"weight":-0.800000011920929},[255,203],{"size":165,"scale":3,"weight":-0.4000000059604645},[396,315],{"size":144,"scale":2,"weight":0.23000000417232513},[278,224],{"size":105,"scale":3,"weight":-0.4000000059604645},[252,201],{"size":60,"scale":-1,"weight":0.6200000047683716},[123,100],{"size":164,"scale":2,"weight":0.23000000417232513},[316,256],{"size":176,"scale":3,"weight":0},[428,343],{"size":19,"scale":-1,"weight":0.6200000047683716},[40,32],{"size":126,"scale":2,"weight":-0.4000000059604645},[236,189],{"size":51,"scale":2,"weight":0},[97,77],{"size":28,"scale":-1,"weight":0.30000001192092896},[55,45],{"size":87,"scale":2,"weight":0},[166,131],{"size":60,"scale":2,"weight":-0.4000000059604645},[113,90],{"size":148,"scale":3,"weight":0.23000000417232513},[364,293],{"size":133,"scale":1,"weight":0.6200000047683716},[215,174],{"size":19,"scale":3,"weight":0.4000000059604645},[48,39],{"size":56,"scale":1,"weight":0.4000000059604645},[88,72],{"size":39,"scale":3,"weight":-0.800000011920929},[92,74],{"size":98,"scale":2,"weight":-0.4000000059604645},[183,147],{"size":18,"scale":2,"weight":0.23000000417232513},[35,28],{"size":43,"scale":1,"weight":0},[65,53],{"size":11,"scale":2,"weight":0.23000000417232513},[21,18],{"size":62,"scale":1,"weight":0.6200000047683716},[101,81],{"size":45,"scale":3,"weight":0.4000000059604645},[114,92],{"size":104,"scale":1,"weight":0.4000000059604645},[163,132],{"size":30,"scale":-1,"weight":-0.4000000059604645},[57,45],{"size":113,"scale":-1,"weight":0.5600000023841858},[228,185],{"size":118,"scale":3,"weight":-0.800000011920929},[277,222],{"size":200,"scale":1,"weight":-0.6000000238418579},[289,228],{"size":141,"scale":-1,"weight":0.4000000059604645},[279,226],{"size":120,"scale":2,"weight":0.5600000023841858},[242,196],{"size":188,"scale":-1,"weight":0.5600000023841858},[379,307],{"size":136,"scale":-1,"weight":0.30000001192092896},[265,214],{"size":25,"scale":1,"weight":0.30000001192092896},[39,31],{"size":73,"scale":2,"weight":0.4000000059604645},[144,117],{"size":93,"scale":3,"weight":-0.4000000059604645},[223,178],{"size":116,"scale":2,"weight":-0.6000000238418579},[213,168],{"size":147,"scale":2,"weight":0.23000000417232513},[283,229],{"size":136,"scale":-1,"weight":0},[258,204],{"size":85,"scale":2,"weight":-0.6000000238418579},[156,124],{"size":188,"scale":3,"weight":0.4000000059604645},[474,382],{"size":151,"scale":2,"weight":0.6200000047683716},[310,250],{"size":88,"scale":3,"weight":0.6200000047683716},[229,186],{"size":84,"scale":2,"weight":-0.4000000059604645},[157,126],{"size":191,"scale":3,"weight":0.5600000023841858},[491,397],{"size":21,"scale":2,"weight":-0.4000000059604645},[40,32],{"size":74,"scale":3,"weight":0.6200000047683716},[194,157],{"size":111,"scale":1,"weight":0.23000000417232513},[169,137],{"size":113,"scale":2,"weight":-0.4000000059604645},[212,170],{"size":89,"scale":3,"weight":-0.6000000238418579},[210,167],{"size":84,"scale":-1,"weight":-0.6000000238418579},[155,122],{"size":169,"scale":2,"weight":0.6200000047683716},[347,280],{"size":38,"scale":2,"weight":0.30000001192092896},[74,61],{"size":186,"scale":1,"weight":0.30000001192092896},[287,232],{"size":37,"scale":2,"weight":0.6200000047683716},[77,61],{"size":10,"scale":-1,"weight":0},[19,15],{"size":21,"scale":1,"weight":-0.4000000059604645},[32,26],{"size":152,"scale":1,"weight":0.6200000047683716},[246,199],{"size":68,"scale":1,"weight":0},[102,83],{"size":178,"scale":-1,"weight":0.6200000047683716},[365,296],{"size":16,"scale":3,"weight":-0.800000011920929},[38,31],{"size":48,"scale":2,"weight":-0.4000000059604645},[90,72],{"size":184,"scale":-1,"weight":-0.4000000059604645},[344,275],{"size":148,"scale":1,"weight":0},[223,180],{"size":80,"scale":3,"weight":0.6200000047683716},[209,169],{"size":79,"scale":-1,"weight":0.23000000417232513},[153,123],{"size":51,"scale":3,"weight":0},[124,99],{"size":25,"scale":2,"weight":0.23000000417232513},[48,39],{"size":184,"scale":1,"weight":0.4000000059604645},[287,233],{"size":99,"scale":1,"weight":0.23000000417232513},[151,123],{"size":68,"scale":-1,"weight":0},[130,102],{"size":154,"scale":3,"weight":0.6200000047683716},[402,326],{"size":5,"scale":2,"weight":-0.6000000238418579},[10,8],{"size":159,"scale":3,"weight":0.5600000023841858},[409,331],{"size":25,"scale":2,"weight":0.4000000059604645},[50,40],{"size":136,"scale":-1,"weight":0.5600000023841858},[274,222],{"size":64,"scale":3,"weight":0.23000000417232513},[158,127],{"size":180,"scale":3,"weight":-0.4000000059604645},[431,344],{"size":171,"scale":1,"weight":-0.6000000238418579},[247,195],{"size":197,"scale":2,"weight":0},[374,295],{"size":173,"scale":3,"weight":0.6200000047683716},[451,365],{"size":58,"scale":2,"weight":0.6200000047683716},[120,97],{"size":128,"scale":3,"weight":0.23000000417232513},[315,254],{"size":144,"scale":1,"weight":0},[217,176],{"size":116,"scale":3,"weight":0},[282,226],{"size":167,"scale":1,"weight":0.30000001192092896},[258,209],{"size":42,"scale":2,"weight":-0.800000011920929},[76,61],{"size":163,"scale":1,"weight":-0.4000000059604645},[241,193],{"size":42,"scale":1,"weight":0.4000000059604645},[66,54],{"size":66,"scale":1,"weight":-0.4000000059604645},[98,79],{"size":95,"scale":-1,"weight":-0.6000000238418579},[174,138],{"size":192,"scale":3,"weight":0.30000001192092896},[478,384],{"size":31,"scale":-1,"weight":-0.800000011920929},[57,45],{"size":17,"scale":2,"weight":-0.800000011920929},[32,25],{"size":170,"scale":2,"weight":0.5600000023841858},[343,278],{"size":62,"scale":3,"weight":0.23000000417232513},[153,123],{"size":122,"scale":2,"weight":-0.6000000238418579},[224,177],{"size":33,"scale":2,"weight":0},[63,50],{"size":12,"scale":1,"weight":-0.800000011920929},[18,14],{"size":178,"scale":3,"weight":0.23000000417232513},[438,352],{"size":14,"scale":-1,"weight":-0.4000000059604645},[27,21],{"size":196,"scale":1,"weight":-0.6000000238418579},[283,224],{"size":45,"scale":2,"weight":0.30000001192092896},[89,71],{"size":134,"scale":1,"weight":0.5600000023841858},[214,172],{"size":83,"scale":1,"weight":0.23000000417232513},[127,103],{"size":5,"scale":3,"weight":0.23000000417232513},[13,10],{"size":87,"scale":1,"weight":0.4000000059604645},[136,110],{"size":160,"scale":3,"weight":-0.800000011920929},[374,300],{"size":193,"scale":3,"weight":0.30000001192092896},[480,386],{"size":118,"scale":1,"weight":0.5600000023841858},[188,152],{"size":30,"scale":-1,"weight":-0.6000000238418579},[56,44],{"size":141,"scale":-1,"weight":0.30000001192092896},[275,222],{"size":126,"scale":2,"weight":0.4000000059604645},[249,201],{"size":78,"scale":2,"weight":0.5600000023841858},[157,128],{"size":49,"scale":2,"weight":0.30000001192092896},[95,78],{"size":181,"scale":-1,"weight":0.23000000417232513},[349,282],{"size":192,"scale":2,"weight":0},[365,287],{"size":57,"scale":3,"weight":0.23000000417232513},[141,113],{"size":188,"scale":1,"weight":0.4000000059604645},[294,238],{"size":79,"scale":3,"weight":-0.4000000059604645},[189,151],{"size":164,"scale":-1,"weight":0.23000000417232513},[316,256],{"size":104,"scale":1,"weight":0.23000000417232513},[158,129],{"size":154,"scale":-1,"weight":0.6200000047683716},[316,256],{"size":63,"scale":1,"weight":0.4000000059604645},[98,80],{"size":171,"scale":-1,"weight":0.5600000023841858},[344,279],{"size":69,"scale":2,"weight":0.6200000047683716},[142,115],{"size":1,"scale":1,"weight":0.6200000047683716},[2,2],{"size":29,"scale":3,"weight":0},[71,57],{"size":130,"scale":3,"weight":0.4000000059604645},[328,264],{"size":36,"scale":1,"weight":0.30000001192092896},[56,45],{"size":158,"scale":1,"weight":-0.4000000059604645},[234,188],{"size":7,"scale":1,"weight":0.23000000417232513},[11,9],{"size":63,"scale":2,"weight":-0.6000000238418579},[116,92],{"size":30,"scale":1,"weight":0.5600000023841858},[48,39],{"size":130,"scale":2,"weight":-0.6000000238418579},[239,189],{"size":152,"scale":-1,"weight":-0.4000000059604645},[284,228],{"size":132,"scale":-1,"weight":-0.800000011920929},[240,192],{"size":180,"scale":1,"weight":0.30000001192092896},[278,225],{"size":57,"scale":2,"weight":0},[108,86],{"size":70,"scale":2,"weight":-0.6000000238418579},[129,102],{"size":36,"scale":3,"weight":0},[88,70],{"size":114,"scale":-1,"weight":0.4000000059604645},[226,182],{"size":153,"scale":3,"weight":-0.4000000059604645},[366,291],{"size":7,"scale":1,"weight":0},[11,9],{"size":81,"scale":3,"weight":-0.4000000059604645},[194,154],{"size":188,"scale":1,"weight":0.23000000417232513},[286,233],{"size":77,"scale":1,"weight":0.5600000023841858},[122,100],{"size":59,"scale":2,"weight":-0.800000011920929},[108,86],{"size":54,"scale":1,"weight":0.4000000059604645},[85,68],{"size":150,"scale":-1,"weight":0.5600000023841858},[303,245],{"size":89,"scale":3,"weight":0.23000000417232513},[220,176],{"size":183,"scale":3,"weight":0.30000001192092896},[455,366],{"size":198,"scale":1,"weight":0.23000000417232513},[302,245],{"size":5,"scale":2,"weight":-0.800000011920929},[9,8],{"size":134,"scale":1,"weight":0},[202,163],{"size":9,"scale":3,"weight":-0.4000000059604645},[22,18],{"size":95,"scale":3,"weight":0.5600000023841858},[245,197],{"size":189,"scale":-1,"weight":-0.800000011920929},[343,275],{"size":129,"scale":2,"weight":-0.4000000059604645},[241,194],{"size":194,"scale":1,"weight":-0.4000000059604645},[287,231],{"size":157,"scale":-1,"weight":-0.800000011920929},[285,228],{"size":155,"scale":1,"weight":0},[233,189],{"size":87,"scale":-1,"weight":0.5600000023841858},[176,142],{"size":54,"scale":2,"weight":0.30000001192092896},[105,85],{"size":138,"scale":-1,"weight":0},[263,207],{"size":68,"scale":3,"weight":-0.4000000059604645},[163,130],{"size":11,"scale":2,"weight":-0.6000000238418579},[21,16],{"size":151,"scale":2,"weight":-0.6000000238418579},[277,219],{"size":56,"scale":-1,"weight":0.23000000417232513},[108,88],{"size":124,"scale":3,"weight":0},[302,242],{"size":69,"scale":2,"weight":0},[132,103],{"size":43,"scale":2,"weight":0.23000000417232513},[83,68],{"size":174,"scale":3,"weight":0.23000000417232513},[428,344],{"size":135,"scale":2,"weight":-0.4000000059604645},[253,203],{"size":117,"scale":3,"weight":0.23000000417232513},[288,231],{"size":40,"scale":2,"weight":0.4000000059604645},[79,64],{"size":12,"scale":1,"weight":0.4000000059604645},[19,16],{"size":73,"scale":1,"weight":0.23000000417232513},[111,91],{"size":21,"scale":1,"weight":0.6200000047683716},[34,28],{"size":127,"scale":1,"weight":0.30000001192092896},[196,158],{"size":54,"scale":-1,"weight":-0.4000000059604645},[102,81],{"size":134,"scale":3,"weight":0.23000000417232513},[330,265],{"size":101,"scale":3,"weight":-0.6000000238418579},[238,190],{"size":156,"scale":1,"weight":0.23000000417232513},[238,193],{"size":90,"scale":1,"weight":0.5600000023841858},[143,116],{"size":145,"scale":2,"weight":0.6200000047683716},[298,241],{"size":128,"scale":1,"weight":0},[193,157],{"size":110,"scale":2,"weight":0},[210,165],{"size":73,"scale":3,"weight":-0.4000000059604645},[176,139],{"size":149,"scale":3,"weight":0.6200000047683716},[389,315],{"size":149,"scale":3,"weight":-0.4000000059604645},[357,285],{"size":10,"scale":2,"weight":0},[19,15],{"size":68,"scale":2,"weight":0.30000001192092896},[132,107],{"size":160,"scale":3,"weight":0.30000001192092896},[398,320],{"size":156,"scale":1,"weight":-0.6000000238418579},[225,178],{"size":196,"scale":-1,"weight":-0.6000000238418579},[359,284],{"size":91,"scale":-1,"weight":0.6200000047683716},[187,151],{"size":131,"scale":-1,"weight":0.23000000417232513},[253,204],{"size":112,"scale":-1,"weight":-0.4000000059604645},[210,168],{"size":144,"scale":-1,"weight":-0.6000000238418579},[264,209],{"size":107,"scale":2,"weight":0.4000000059604645},[211,171],{"size":194,"scale":-1,"weight":0.30000001192092896},[378,305],{"size":159,"scale":2,"weight":0.5600000023841858},[321,260],{"size":100,"scale":3,"weight":0.30000001192092896},[249,201],{"size":15,"scale":2,"weight":0},[29,23],{"size":192,"scale":3,"weight":-0.6000000238418579},[452,359],{"size":47,"scale":1,"weight":-0.6000000238418579},[68,54],{"size":4,"scale":2,"weight":0.5600000023841858},[9,7],{"size":174,"scale":-1,"weight":-0.800000011920929},[316,253],{"size":168,"scale":2,"weight":0},[319,251],{"size":56,"scale":3,"weight":-0.4000000059604645},[135,108],{"size":185,"scale":3,"weight":-0.800000011920929},[434,348],{"size":72,"scale":2,"weight":-0.800000011920929},[131,105],{"size":105,"scale":2,"weight":0.6200000047683716},[216,174],{"size":22,"scale":3,"weight":0.4000000059604645},[56,45],{"size":7,"scale":1,"weight":-0.800000011920929},[10,8],{"size":113,"scale":2,"weight":0},[215,169],{"size":7,"scale":2,"weight":-0.800000011920929},[14,10],{"size":26,"scale":-1,"weight":-0.800000011920929},[48,39],{"size":19,"scale":1,"weight":0},[29,24],{"size":137,"scale":1,"weight":-0.6000000238418579},[198,157],{"size":9,"scale":2,"weight":0},[18,14],{"size":92,"scale":2,"weight":0},[175,138],{"size":142,"scale":-1,"weight":-0.4000000059604645},[266,213],{"size":156,"scale":-1,"weight":0.23000000417232513},[301,243],{"size":17,"scale":2,"weight":0.23000000417232513},[34,27],{"size":79,"scale":-1,"weight":-0.6000000238418579},[145,115],{"size":110,"scale":1,"weight":0.6200000047683716},[178,144],{"size":76,"scale":3,"weight":0},[185,148],{"size":38,"scale":2,"weight":-0.6000000238418579},[70,56],{"size":48,"scale":1,"weight":-0.4000000059604645},[71,58],{"size":187,"scale":2,"weight":-0.4000000059604645},[350,280],{"size":20,"scale":3,"weight":0},[49,40],{"size":20,"scale":-1,"weight":0.30000001192092896},[39,31],{"size":33,"scale":1,"weight":-0.800000011920929},[48,38],{"size":19,"scale":1,"weight":0.5600000023841858},[31,25],{"size":79,"scale":3,"weight":0.4000000059604645},[200,161],{"size":92,"scale":-1,"weight":-0.6000000238418579},[169,134],{"size":44,"scale":1,"weight":-0.800000011920929},[64,50],{"size":71,"scale":3,"weight":-0.4000000059604645},[170,136],{"size":48,"scale":-1,"weight":0.6200000047683716},[99,80],{"size":61,"scale":1,"weight":0.23000000417232513},[93,75],{"size":172,"scale":3,"weight":-0.6000000238418579},[405,322],{"size":121,"scale":2,"weight":0.23000000417232513},[234,188],{"size":83,"scale":1,"weight":-0.800000011920929},[119,94],{"size":126,"scale":2,"weight":0.30000001192092896},[246,199],{"size":138,"scale":3,"weight":-0.6000000238418579},[325,258],{"size":26,"scale":-1,"weight":0.4000000059604645},[51,42],{"size":109,"scale":3,"weight":0.23000000417232513},[268,216],{"size":100,"scale":1,"weight":-0.800000011920929},[143,114],{"size":124,"scale":1,"weight":-0.4000000059604645},[183,147],{"size":83,"scale":2,"weight":-0.6000000238418579},[152,120],{"size":92,"scale":3,"weight":0.5600000023841858},[237,192],{"size":193,"scale":2,"weight":0.6200000047683716},[396,321],{"size":88,"scale":2,"weight":0.30000001192092896},[172,138],{"size":185,"scale":2,"weight":0.4000000059604645},[366,295],{"size":117,"scale":1,"weight":0.23000000417232513},[178,145],{"size":192,"scale":2,"weight":0.5600000023841858},[387,313],{"size":77,"scale":3,"weight":0.30000001192092896},[192,154],{"size":75,"scale":3,"weight":0.5600000023841858},[193,156],{"size":149,"scale":3,"weight":-0.6000000238418579},[351,280],{"size":89,"scale":2,"weight":0.30000001192092896},[174,141],{"size":118,"scale":1,"weight":-0.800000011920929},[169,134],{"size":124,"scale":-1,"weight":0.6200000047683716},[254,206],{"size":17,"scale":3,"weight":-0.800000011920929},[40,33],{"size":36,"scale":3,"weight":-0.6000000238418579},[85,68],{"size":69,"scale":3,"weight":-0.800000011920929},[162,130],{"size":71,"scale":-1,"weight":0.5600000023841858},[144,116],{"size":146,"scale":2,"weight":-0.6000000238418579},[268,211],{"size":138,"scale":-1,"weight":-0.4000000059604645},[258,207],{"size":167,"scale":2,"weight":-0.4000000059604645},[313,250],{"size":158,"scale":3,"weight":-0.4000000059604645},[379,302],{"size":58,"scale":-1,"weight":0.4000000059604645},[115,93],{"size":92,"scale":-1,"weight":0.30000001192092896},[180,145],{"size":114,"scale":3,"weight":-0.800000011920929},[268,214],{"size":9,"scale":3,"weight":0.23000000417232513},[23,18],{"size":36,"scale":1,"weight":0.4000000059604645},[57,46],{"size":127,"scale":2,"weight":0.23000000417232513},[245,198],{"size":121,"scale":1,"weight":0.23000000417232513},[185,150],{"size":113,"scale":2,"weight":0.6200000047683716},[232,188],{"size":27,"scale":-1,"weight":-0.4000000059604645},[51,41],{"size":165,"scale":3,"weight":0.23000000417232513},[406,326],{"size":80,"scale":2,"weight":0.5600000023841858},[162,131],{"size":105,"scale":-1,"weight":0.30000001192092896},[205,165],{"size":155,"scale":1,"weight":0.6200000047683716},[251,203]] \ No newline at end of file From a1685ac65b89ed1b2d0f16ded7179d0a6b241565 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Fri, 22 Aug 2025 07:03:22 +0200 Subject: [PATCH 37/42] updated --- .../NSListContentView+ImageViewAlt.swift | 162 ------------------ .../NSListContentView+ImageViewAlt1.swift | 94 ---------- 2 files changed, 256 deletions(-) delete mode 100644 Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt.swift delete mode 100644 Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt1.swift diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt.swift deleted file mode 100644 index 5002e56c..00000000 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt.swift +++ /dev/null @@ -1,162 +0,0 @@ -// -// NSList+ImageV.swift -// -// -// Created by Florian Zand on 21.08.25. -// - -import AppKit -import FZSwiftUtils -import FZUIKit -import SwiftUI - -/* -extension NSListContentView { - class ListImageView: NSImageView { - override var image: NSImage? { - didSet { isHidden = image == nil } - } - - override var intrinsicContentSize: NSSize { - var intrinsicContentSize = super.intrinsicContentSize - - intrinsicContentSize = intrinsicContentSize.clamped(min: _reservedLayoutSize ?? .zero) - - if _reservedLayoutSize?.width == 0, image?.isSymbolImage == true, properties.position.orientation == .horizontal { - intrinsicContentSize.width = (intrinsicContentSize.height * 2.5).rounded(.towardZero) - return intrinsicContentSize - } - - if _reservedLayoutSize?.width == NSListContentConfiguration.ImageProperties.standardDimension { - // intrinsicContentSize.width = intrinsicContentSize.width.c - } - - if let calculatedSize = calculatedSize { - return calculatedSize - } - - return intrinsicContentSize - } - - var properties: NSListContentConfiguration.ImageProperties { - didSet { - guard oldValue != properties else { return } - update() - } - } - - func update() { - imageScaling = .scaleNone - symbolConfiguration = properties.symbolConfiguration?.nsSymbolConfiguration() - border = properties.resolvedBorder() - backgroundColor = properties.resolvedBackgroundColor() - contentTintColor = properties.resolvedTintColor() - cornerRadius = properties.cornerRadius - outerShadow = properties.resolvedShadow() - toolTip = properties.toolTip - _reservedLayoutSize = properties.reservedLayoutSize - invalidateIntrinsicContentSize() - } - - init(properties: NSListContentConfiguration.ImageProperties) { - self.properties = properties - super.init(frame: .zero) - wantsLayer = true - update() - } - - var verticalConstraint: NSLayoutConstraint? - - var calculatedSize: CGSize? { - didSet { - invalidateIntrinsicContentSize() - } - } - - @available(*, unavailable) - required init?(coder _: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - var _reservedLayoutSize: CGSize? { - get { (cell as? ImageCell)?.reservedLayoutSize } - set { - guard var newValue = newValue else { return } - if newValue.width == NSListContentConfiguration.ImageProperties.standardDimension { - newValue.width = 36.0 - } - if newValue.height == NSListContentConfiguration.ImageProperties.standardDimension { - newValue.height = 9.0 - } - (cell as? ImageCell)?.reservedLayoutSize = newValue - } - } - - override class var cellClass: AnyClass? { - get { ImageCell.self } - set { } - } - - private class ImageCell: NSImageCell { - var reservedLayoutSize: CGSize? = .zero - var symbolConfiguration: NSImage.SymbolConfiguration? { - if #available(macOS 12.0, *) { - return (controlView as? NSImageView)?.symbolConfiguration ?? image?.symbolConfiguration - } else { - return (controlView as? NSImageView)?.symbolConfiguration - } - } - - override var cellSize: NSSize { - guard let reservedLayoutSize = reservedLayoutSize, let image = image else { return super.cellSize } - var cellSize = reservedLayoutSize - if cellSize.width == 0 || cellSize.height == 0 { - if image.isSymbolImage { - let symbolSize = CGSize(width: 36, height: 16) - if cellSize.width == 0 { cellSize.width = symbolSize.width } - if cellSize.height == 0 { cellSize.height = symbolSize.height } - } else { - if cellSize.width == 0 { cellSize.width = image.size.width } - if cellSize.height == 0 { cellSize.height = image.size.height } - } - } - return cellSize - } - - override func draw(withFrame cellFrame: NSRect, in controlView: NSView) { - guard reservedLayoutSize != nil, let image = image else { - super.draw(withFrame: cellFrame, in: controlView) - return - } - let reservedSize = cellSize - var imageRect: CGRect = CGRect(.zero, image.size) - switch imageAlignment { - case .alignLeft, .alignTopLeft, .alignBottomLeft: - imageRect.origin.x = cellFrame.origin.x - case .alignRight, .alignTopRight, .alignBottomRight: - imageRect.origin.x = cellFrame.maxX - reservedSize.width - case .alignCenter, .alignTop, .alignBottom: - imageRect.origin.x = cellFrame.midX - (reservedSize.width / 2.0) - default: - imageRect.origin.x = cellFrame.origin.x - } - switch imageAlignment { - case .alignBottom, .alignBottomLeft, .alignBottomRight: - imageRect.origin.y = cellFrame.origin.y - case .alignTop, .alignTopLeft, .alignTopRight: - imageRect.origin.y = cellFrame.maxY - reservedSize.height - case .alignCenter, .alignLeft, .alignRight: - imageRect.origin.y = cellFrame.midY - (reservedSize.height / 2.0) - default: - imageRect.origin.y = cellFrame.origin.y - } - imageRect.origin.x += (reservedSize.width - image.size.width) / 2 - imageRect.origin.y += (reservedSize.height - image.size.height) / 2 - // image.draw(in: imageRect) - Swift.print("draw", imageRect) - super.draw(withFrame: imageRect, in: controlView) - } - } - } -} -*/ diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt1.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt1.swift deleted file mode 100644 index 57633057..00000000 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageViewAlt1.swift +++ /dev/null @@ -1,94 +0,0 @@ -// -// NSListContentView+ImageViewAlt1.swift -// -// -// Created by Florian Zand on 22.08.25. -// - -import AppKit -import FZSwiftUtils -import FZUIKit -import SwiftUI - -/* -extension NSListContentView { - class ListImageView: ImageView { - var properties: NSListContentConfiguration.ImageProperties { - didSet { - guard oldValue != properties else { return } - update() - } - } - - override var image: NSImage? { - didSet { isHidden = image == nil } - } - - override var intrinsicContentSize: NSSize { - var intrinsicContentSize = super.intrinsicContentSize - - intrinsicContentSize = intrinsicContentSize.clamped(min: _reservedLayoutSize) - - if _reservedLayoutSize.width == 0, image?.isSymbolImage == true, properties.position.orientation == .horizontal { - intrinsicContentSize.width = (intrinsicContentSize.height * 2.5).rounded(.towardZero) - return intrinsicContentSize - } - - if _reservedLayoutSize.width == NSListContentConfiguration.ImageProperties.standardDimension { - // intrinsicContentSize.width = intrinsicContentSize.width.c - } - - if let calculatedSize = calculatedSize { - return calculatedSize - } - - return intrinsicContentSize - } - - var calculatedSize: CGSize? { - didSet { - invalidateIntrinsicContentSize() - } - } - - var verticalConstraint: NSLayoutConstraint? - var _reservedLayoutSize: CGSize = .zero { - didSet { - if _reservedLayoutSize.width == NSListContentConfiguration.ImageProperties.standardDimension { - _reservedLayoutSize.width = 36.0 - } - if _reservedLayoutSize.height == NSListContentConfiguration.ImageProperties.standardDimension { - _reservedLayoutSize.height = 9.0 - } - } - } - - func update() { - imageScaling = image?.isSymbolImage == true ? .none : properties.scaling.imageScaling - symbolConfiguration = properties.symbolConfiguration?.nsSymbolConfiguration() - border = properties.resolvedBorder() - backgroundColor = properties.resolvedBackgroundColor() - tintColor = properties.resolvedTintColor() - cornerRadius = properties.cornerRadius - outerShadow = properties.resolvedShadow() - toolTip = properties.toolTip - _reservedLayoutSize = properties.reservedLayoutSize - reservedLayoutSize - invalidateIntrinsicContentSize() - } - - init(properties: NSListContentConfiguration.ImageProperties) { - self.properties = properties - super.init(frame: .zero) - wantsLayer = true - imageAlignment = .alignCenter - update() - } - - @available(*, unavailable) - required init?(coder _: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - } -} - */ From 193875fae0d6b7cc983ab5f7d9f6fb532e714221 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Fri, 22 Aug 2025 07:03:53 +0200 Subject: [PATCH 38/42] Update NSListContentView+ImageView.swift --- .../NSListContentConfiguration/NSListContentView+ImageView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift index 14f4d52e..263fc87d 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift @@ -117,6 +117,7 @@ extension NSListContentView { self.properties = properties super.init(frame: .zero) wantsLayer = true + imageView.imageAlignment = .alignCenter addSubview(imageView) update() } From e13ebc7af095bf35b6fbaf6716312ee84cc1aa94 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Thu, 6 Nov 2025 13:50:40 +0100 Subject: [PATCH 39/42] updated --- .../NSCollectionView/NSCollectionView+ReconfigureItem.swift | 2 +- .../NSCollectionView/unused/NSCollectionView+SelfSizing.swift | 2 +- .../Extensions/NSTableView/NSTableView+Register.swift | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+ReconfigureItem.swift b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+ReconfigureItem.swift index 2fa5d434..7f5185cd 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+ReconfigureItem.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionView+ReconfigureItem.swift @@ -47,7 +47,7 @@ extension NSCollectionView { guard !didSwizzleMakeItem else { return } didSwizzleMakeItem = true do { - _ = try Swizzle(NSCollectionView.self) { + try NSCollectionView.swizzle { #selector(makeItem(withIdentifier:for:)) <-> #selector(swizzled_makeItem(withIdentifier:for:)) } } catch { diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/unused/NSCollectionView+SelfSizing.swift b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/unused/NSCollectionView+SelfSizing.swift index 6d0be2e4..26a93043 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/unused/NSCollectionView+SelfSizing.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/unused/NSCollectionView+SelfSizing.swift @@ -47,7 +47,7 @@ extension NSCollectionViewItem { static func swizzleCollectionViewItemIfNeeded() { if didSwizzleCollectionViewItem == false { do { - _ = try Swizzle(NSCollectionViewItem.self) { + try NSCollectionViewItem.swizzle { #selector(viewDidLayout) <-> #selector(swizzled_viewDidLayout) #selector(apply(_:)) <-> #selector(swizzled_apply(_:)) #selector(preferredLayoutAttributesFitting(_:)) <-> #selector(swizzled_preferredLayoutAttributesFitting(_:)) diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift index 20dc934e..47a720cf 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableView+Register.swift @@ -96,7 +96,7 @@ extension NSTableView { static func swizzleViewRegistration() { guard !didSwizzleViewRegistration else { return } do { - _ = try Swizzle(NSTableView.self) { + try NSTableView.swizzle { #selector(makeView(withIdentifier:owner:)) <-> #selector(swizzled_makeView(withIdentifier:owner:)) #selector((register(_:forIdentifier:)) as (NSTableView) -> (NSNib?, NSUserInterfaceItemIdentifier) -> Void) <-> #selector(swizzled_register(_:forIdentifier:)) } From b5dd9982f5822bbef2508c6c18c696925403f86b Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Thu, 20 Nov 2025 13:54:42 +0100 Subject: [PATCH 40/42] Reapply .gitignore --- .gitignore | 39 ++++++++++++--- .../contents.xcworkspacedata | 7 --- .../IDEFindNavigatorScopes.plist | 5 -- .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 --- .../xcschemes/xcschememanagement.plist | 47 ------------------- .../xcshareddata/swiftpm/Package.resolved | 33 ------------- .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 --- .../xcschemes/xcschememanagement.plist | 24 ---------- .../NSTableView+/NSTableCellVew+.swift | 19 ++++---- 9 files changed, 43 insertions(+), 143 deletions(-) delete mode 100644 .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata delete mode 100644 .swiftpm/xcode/package.xcworkspace/xcuserdata/florianzand.xcuserdatad/IDEFindNavigatorScopes.plist delete mode 100644 .swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 .swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved delete mode 100644 Example/Example.xcodeproj/xcuserdata/florianzand.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 Example/Example.xcodeproj/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.gitignore b/.gitignore index 8e5106c0..b2fef480 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,34 @@ +## macOS +.DS_Store +.netrc -*.resolved -**/.DS_Store -.swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist -*.xcuserstate -*.resolved -*.resolved +## Obj-C/Swift specific +*.hmap + +## Xcode +xcuserdata/ +.build/ + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Swift Package Manager +Packages/ +Package.resolved +Package.pins +.swiftpm + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +## Carthage +Carthage/Build/ + +## fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output \ No newline at end of file diff --git a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a6..00000000 --- a/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/florianzand.xcuserdatad/IDEFindNavigatorScopes.plist b/.swiftpm/xcode/package.xcworkspace/xcuserdata/florianzand.xcuserdatad/IDEFindNavigatorScopes.plist deleted file mode 100644 index 5dd5da85..00000000 --- a/.swiftpm/xcode/package.xcworkspace/xcuserdata/florianzand.xcuserdatad/IDEFindNavigatorScopes.plist +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/.swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/.swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fecc4f4d..00000000 --- a/.swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/.swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist b/.swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index dee1de60..00000000 --- a/.swiftpm/xcode/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - SchemeUserState - - AdvancedCollectionTableView-Package.xcscheme_^#shared#^_ - - orderHint - 1 - - AdvancedCollectionTableView.xcscheme_^#shared#^_ - - orderHint - 0 - - AdvancedCollectionTableViewInterpose-Package.xcscheme_^#shared#^_ - - orderHint - 0 - - AdvancedCollectionTableViewInterpose.xcscheme_^#shared#^_ - - orderHint - 1 - - AdvancedCollectionTableViewObjC.xcscheme_^#shared#^_ - - orderHint - 2 - - - SuppressBuildableAutocreation - - AdvancedCollectionTableView - - primary - - - AdvancedCollectionTableViewObjC - - primary - - - - - diff --git a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 2f798ee7..00000000 --- a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,33 +0,0 @@ -{ - "originHash" : "9a3fc9d4e8c660ad4f02d3fe7cb14be2d4a8737c02d84fc43a36ece1c84e8b31", - "pins" : [ - { - "identity" : "fzquicklook", - "kind" : "remoteSourceControl", - "location" : "https://github.com/flocked/FZQuicklook.git", - "state" : { - "branch" : "main", - "revision" : "835a344797c7b7bf4dbf98d77dd60a7cb6d4c7cf" - } - }, - { - "identity" : "fzswiftutils", - "kind" : "remoteSourceControl", - "location" : "https://github.com/flocked/FZSwiftUtils.git", - "state" : { - "branch" : "main", - "revision" : "11bc4fb9781f48917d8d4548fd9ee541255027f9" - } - }, - { - "identity" : "fzuikit", - "kind" : "remoteSourceControl", - "location" : "https://github.com/flocked/FZUIKit.git", - "state" : { - "branch" : "main", - "revision" : "5c610909d2ec3f8896fc3bf3a3a5acd5dd944a5f" - } - } - ], - "version" : 3 -} diff --git a/Example/Example.xcodeproj/xcuserdata/florianzand.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Example/Example.xcodeproj/xcuserdata/florianzand.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index 4f4c0b95..00000000 --- a/Example/Example.xcodeproj/xcuserdata/florianzand.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/Example/Example.xcodeproj/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist b/Example/Example.xcodeproj/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 1b16d39b..00000000 --- a/Example/Example.xcodeproj/xcuserdata/florianzand.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - SchemeUserState - - CollectionViewSidebarTemplate.xcscheme_^#shared#^_ - - orderHint - 0 - - CollectionViewTemplate.xcscheme_^#shared#^_ - - orderHint - 0 - - Example.xcscheme_^#shared#^_ - - orderHint - 0 - - - - diff --git a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift index 56baab85..a4f16018 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Extensions/NSTableView+/NSTableCellVew+.swift @@ -86,16 +86,17 @@ extension NSTableCellView { } else { contentView = contentConfiguration.makeContentView() translatesAutoresizingMaskIntoConstraints = false - addSubview(withConstraint: contentView!) + let constraints = addSubview(withConstraint: contentView!) + constraints[1].priority = .init(999) /* - if let contentView = contentView as? NSListContentView { - textField = contentView.textField - imageView = contentView.imageView - } else { - textField = nil - imageView = nil - } - */ + if let contentView = contentView as? NSListContentView { + textField = contentView.textField + imageView = contentView.imageView + } else { + textField = nil + imageView = nil + } + */ } setNeedsDisplay() From e8e2bf669754a278a7eb33c535456e94e5a0d518 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Fri, 21 Nov 2025 06:36:47 +0100 Subject: [PATCH 41/42] updated --- Package.swift | 3 +-- .../NSItemContentConfiguration/NSItemContentView+Content.swift | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index b8458bdf..f9e03606 100644 --- a/Package.swift +++ b/Package.swift @@ -15,13 +15,12 @@ let package = Package( ), ], dependencies: [ - .package(url: "https://github.com/flocked/FZSwiftUtils.git", branch: "main"), .package(url: "https://github.com/flocked/FZUIKit.git", branch: "main"), .package(url: "https://github.com/flocked/FZQuicklook.git", branch: "main"), ], targets: [ .target( name: "AdvancedCollectionTableView", - dependencies: ["FZSwiftUtils", "FZUIKit", "FZQuicklook"], path: "Sources/AdvancedCollectionTableView", resources: [.process("Resources")]), + dependencies: ["FZUIKit", "FZQuicklook"], path: "Sources/AdvancedCollectionTableView", resources: [.process("Resources")]), ] ) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView+Content.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView+Content.swift index a69db67c..1ff4eb88 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView+Content.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSItemContentConfiguration/NSItemContentView+Content.swift @@ -102,6 +102,7 @@ extension NSItemContentView { imageView.frame.size = bounds.size view?.frame.size = bounds.size overlayView?.frame.size = bounds.size + badgeViews.forEach({ $0.layoutBadge() }) /* if let imageSize = image?.size, contentProperties.imageScaling.shouldResize { var size = frame.size From ab684f980a9ae0bc7d01c11339a305fec2a38175 Mon Sep 17 00:00:00 2001 From: Florian Zand Date: Fri, 2 Jan 2026 23:20:44 +0100 Subject: [PATCH 42/42] updated --- .../Example/TableSidebarViewController.swift | 13 ++++--- Package.swift | 2 +- .../NSListContentView+ImageView.swift | 2 +- ...TableViewDiffableDataSource+Delegate.swift | 23 +++++------- .../TableViewDiffableDataSource.swift | 35 ++++++++++++++++-- .../Shared/QuicklookPreviewItem.swift | 2 +- .../NSCollectionViewDiffableDataSource+.swift | 4 +- .../NSTableViewDiffableDataSource+.swift | 4 +- .../NSTableView/CellRegistration.swift | 37 +++++++++++++++++-- 9 files changed, 89 insertions(+), 33 deletions(-) diff --git a/Example/Example/TableSidebarViewController.swift b/Example/Example/TableSidebarViewController.swift index 1a3794ce..c999f054 100644 --- a/Example/Example/TableSidebarViewController.swift +++ b/Example/Example/TableSidebarViewController.swift @@ -33,10 +33,10 @@ class TableSidebarViewController: NSViewController { configuration.text = section.title sectionHeaderCell.contentConfiguration = configuration } - + override func viewDidLoad() { super.viewDidLoad() - + tableView.draggingDestinationFeedbackStyle = .gap tableView.dataSource = dataSource dataSource.applySectionHeaderRegistration(sectionHeaderRegistration) @@ -67,10 +67,10 @@ class TableSidebarViewController: NSViewController { if edge == .leading { /// Left swipe return [NSTableViewRowAction.regular(symbolName: swippedItem.isFavorite ? "star" : "star.fill", color: .systemYellow) { _,_ in - swippedItem.isFavorite = !swippedItem.isFavorite - self.dataSource.reconfigureItems([swippedItem]) - self.tableView.rowActionsVisible = false - }] + swippedItem.isFavorite = !swippedItem.isFavorite + self.dataSource.reconfigureItems([swippedItem]) + self.tableView.rowActionsVisible = false + }] } else { /// Right swipe return [NSTableViewRowAction.destructive(symbolName: "trash.fill") { _,_ in @@ -80,6 +80,7 @@ class TableSidebarViewController: NSViewController { }] } } + applySnapshot() } diff --git a/Package.swift b/Package.swift index f9e03606..a454e76c 100644 --- a/Package.swift +++ b/Package.swift @@ -21,6 +21,6 @@ let package = Package( targets: [ .target( name: "AdvancedCollectionTableView", - dependencies: ["FZUIKit", "FZQuicklook"], path: "Sources/AdvancedCollectionTableView", resources: [.process("Resources")]), + dependencies: ["FZQuicklook", "FZUIKit"], path: "Sources/AdvancedCollectionTableView", resources: [.process("Resources")]), ] ) diff --git a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift index 263fc87d..65fe99c2 100644 --- a/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift +++ b/Sources/AdvancedCollectionTableView/Configuration/Configurations/NSListContentConfiguration/NSListContentView+ImageView.swift @@ -254,7 +254,7 @@ extension NSListContentView.ListImageView { fileprivate extension NSImage.SymbolConfiguration { var pointSize: CGFloat { get { value(forKey: "pointSize") ?? 0.0 } - set { setIvarValue(Double(newValue), of: "_pointSize") } + set { setIvarValue(Double(newValue), named: "_pointSize") } } var scale: NSImage.SymbolScale { diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource+Delegate.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource+Delegate.swift index d06858f1..430e5924 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource+Delegate.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource+Delegate.swift @@ -51,23 +51,18 @@ extension TableViewDiffableDataSource { guard dataSource.selectionHandlers.shouldSelect != nil || dataSource.selectionHandlers.shouldDeselect != nil else { return proposedSelectionIndexes } - let selectedRows = Array(dataSource.tableView.selectedRowIndexes) - let proposedRows = Array(proposedSelectionIndexes) + let diff = dataSource.tableView.selectedRowIndexes.difference(to: proposedSelectionIndexes) - let diff = selectedRows.difference(to: proposedRows) - let selectedItems = diff.added.compactMap { dataSource.item(forRow: $0) } - let deselectedItems = diff.removed.compactMap { dataSource.item(forRow: $0) } - - var selections: [Item] = selectedItems - if !selectedItems.isEmpty, let shouldSelectRows = dataSource.selectionHandlers.shouldSelect?(selectedItems) { - selections = selectedItems.filter({ shouldSelectRows.contains($0) }) + let selectedItems = diff.added.compactMap({ dataSource.indexedItem(forRow: $0) }) + let deselectedItems = diff.added.compactMap({ dataSource.indexedItem(forRow: $0) }) + var selection = selectedItems + if !selectedItems.isEmpty, let shouldSelectRows = dataSource.selectionHandlers.shouldSelect?(selectedItems.map(\.item)) { + selection = selection.filter({ shouldSelectRows.contains($0.item) }) } - - if !deselectedItems.isEmpty, let shouldDeselectRows = dataSource.selectionHandlers.shouldDeselect?(deselectedItems) { - selections += deselectedItems.filter({ !shouldDeselectRows.contains($0) }) + if !deselectedItems.isEmpty, let shouldDeselectRows = dataSource.selectionHandlers.shouldDeselect?(deselectedItems.map(\.item)) { + selection += deselectedItems.filter({ !shouldDeselectRows.contains($0.item) }) } - - return IndexSet(selections.compactMap { dataSource.row(for: $0) }) + return IndexSet(selection.map(\.row)) } // MARK: - View diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift index 3f16b970..cee8f69d 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/NSTableView/TableViewDiffableDataSource.swift @@ -10,6 +10,26 @@ import FZQuicklook import FZSwiftUtils import FZUIKit +class SectionHeaderRowView: NSTableRowView { + init() { + super.init(frame: .zero) + isGroupRowStyle = true + } + + var headerView: NSView? { + didSet { + guard oldValue != headerView else { return } + oldValue?.removeFromSuperview() + guard let headerView = headerView else { return } + addSubview(withConstraint: headerView) + } + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + /** A `NSTableViewDiffableDataSource` with additional functionality. @@ -126,10 +146,15 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData if let sectionHeaderCellProvider = sectionHeaderCellProvider { dataSource.sectionHeaderViewProvider = { [weak self] tableView, row, sectionID in guard let self = self, let section = self.sections[id: sectionID] else { return NSTableCellView() } + + let rowView = tableView.makeView(withIdentifier: "SectionHeaderRowView", owner: nil) as? SectionHeaderRowView ?? SectionHeaderRowView() + rowView.identifier = "SectionHeaderRowView" + var view: NSTableCellView? NSAnimationContext.performWithoutAnimation { view = sectionHeaderCellProvider(tableView, row, section) } + rowView.headerView = view ?? NSTableCellView() return view ?? NSTableCellView() } } else { @@ -517,7 +542,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData // MARK: Dropping open func tableView(_ tableView: NSTableView, validateDrop draggingInfo: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation { - Swift.print("validateDrop") + // Swift.print("validateDrop") canDrop = false dropTargetRow = nil if !dragingRowIndexes.isEmpty { @@ -649,7 +674,6 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData } } } - if sectionHeaderCellProvider != nil, let canReorderSection = reorderingHandlers.canReorderSection, rowIndexes.count == 1, let row = rowIndexes.first, let section = section(forRow: row) { reorderingSectionRow = canReorderSection(section) ? row : nil } else { @@ -702,7 +726,7 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData public func tableView(_ tableView: NSTableView, updateDraggingItemsForDrag draggingInfo: NSDraggingInfo) { if canDrop, droppingHandlers.previewItems, let items = droppingHandlers.items?(draggingInfo.dropInfo(for: tableView)), !items.isEmpty, let image = previewImage(for: items) { - Swift.print("DraggingItems", tableView.frame.size, image.size) + // Swift.print("DraggingItems", tableView.frame.size, image.size) draggingInfo.setDraggedImage(image) } /* @@ -757,6 +781,11 @@ open class TableViewDiffableDataSource: NSObject, NSTableViewData return nil } + func indexedItem(forRow row: Int) -> (row: Int, item: Item)? { + guard let item = item(forRow: row) else { return nil } + return (row, item) + } + /// Returns the row for the specified item. open func row(for item: Item) -> Int? { dataSource.row(forItemIdentifier: item.id) diff --git a/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/QuicklookPreviewItem.swift b/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/QuicklookPreviewItem.swift index e8a3b4ef..05ff5f36 100644 --- a/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/QuicklookPreviewItem.swift +++ b/Sources/AdvancedCollectionTableView/DiffableDataSource/Shared/QuicklookPreviewItem.swift @@ -60,5 +60,5 @@ class QuicklookPreviewItem: NSObject, QLPreviewItem, QuicklookPreviewable { extension NSPasteboard.PasteboardType { /// Collection view and table view drag & drop type. - static let itemID: NSPasteboard.PasteboardType = .init("DiffableDataSource.ItemID") + static let itemID: NSPasteboard.PasteboardType = .init("com.advancedTableCollectionView.item-id") } diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionViewDiffableDataSource+.swift b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionViewDiffableDataSource+.swift index 4fad9997..a23653d5 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionViewDiffableDataSource+.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSCollectionView/NSCollectionViewDiffableDataSource+.swift @@ -12,7 +12,7 @@ extension NSCollectionViewDiffableDataSource { /// The item provider of the datasource. public var itemProvider: ItemProvider { typealias itemProviderBlock = @convention(block) (NSCollectionView, IndexPath, Any) -> NSCollectionViewItem? - guard let object: NSObject = getIvarValue(for: "_impl"), let cellProvider: itemProviderBlock = object.getIvarValue(for: "_collectionViewItemProvider") else { return { _,_,_ in return nil } } + guard let object: NSObject = ivarValue(named: "_impl"), let cellProvider: itemProviderBlock = object.ivarValue(named: "_collectionViewItemProvider") else { return { _,_,_ in return nil } } return cellProvider } @@ -44,7 +44,7 @@ extension NSCollectionViewDiffableDataSource { } private var collectionView: NSCollectionView { - guard let object: NSObject = getIvarValue(for: "_impl"), let collectionView: NSCollectionView = object.getIvarValue(for: "_nsCollectionView") else { return NSCollectionView() } + guard let object: NSObject = ivarValue(named: "_impl"), let collectionView: NSCollectionView = object.ivarValue(named: "_nsCollectionView") else { return NSCollectionView() } return collectionView } } diff --git a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+.swift b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+.swift index 8af5403c..2d70eefb 100644 --- a/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+.swift +++ b/Sources/AdvancedCollectionTableView/Extensions/NSTableView/NSTableViewDiffableDataSource+.swift @@ -22,9 +22,9 @@ public extension NSTableViewDiffableDataSource { */ func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { let selector = NSSelectorFromString("_tableView:viewForTableColumn:row:") + typealias ClosureType = @convention(c) (AnyObject, Selector, NSTableView, NSTableColumn?, Int) -> NSView? if let meth = class_getInstanceMethod(object_getClass(self), selector) { let imp = method_getImplementation(meth) - typealias ClosureType = @convention(c) (AnyObject, Selector, NSTableView, NSTableColumn?, Int) -> NSView? let method: ClosureType = unsafeBitCast(imp, to: ClosureType.self) let view = method(self, selector, tableView, tableColumn, row) return view @@ -77,7 +77,7 @@ public extension NSTableViewDiffableDataSource { /// The cell provider of the datasource. var cellProvider: ((NSTableView, NSTableColumn, Int, ItemIdentifierType)->(NSView)) { typealias CellProviderBlock = @convention(block) (_ tableView: NSTableView, _ tableColumn: NSTableColumn, _ row: Int, _ identifier: Any) -> NSView - guard let cellProvider: CellProviderBlock = getIvarValue(for: "_cellProvider") else { return { _,_,_,_ in return NSTableCellView() } } + guard let cellProvider: CellProviderBlock = ivarValue(named: "_cellProvider") else { return { _,_,_,_ in return NSTableCellView() } } return cellProvider } diff --git a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift index 8219fcee..5be04bee 100644 --- a/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift +++ b/Sources/AdvancedCollectionTableView/Registrations/NSTableView/CellRegistration.swift @@ -95,11 +95,26 @@ public extension NSTableView { - columnIdentifiers: The identifiers of the table columns. The default value is `[]`, which indicates that the cell isn't restricted to specific columns. - handler: The handler to configurate the cell. */ - public init(columnIdentifiers: [NSUserInterfaceItemIdentifier] = [], handler: @escaping Handler) { + public init(for columnIdentifiers: [NSUserInterfaceItemIdentifier] = [], handler: @escaping Handler) { self.handler = handler self.nib = nil self.columnIdentifiers = columnIdentifiers } + + /** + Creates a cell registration with the specified registration handler. + + The column identifier is used when the registration is applied to ``TableViewDiffableDataSource`` using ``TableViewDiffableDataSource/init(tableView:cellRegistrations:)``. + + You only have to provide a column identifier when your table view has multiple columns. The table cell is displayed for the columns with the same identifier. + + - Parameters: + - columnIdentifier: The identifier of the table column. + - handler: The handler to configurate the cell. + */ + public init(for columnIdentifier: NSUserInterfaceItemIdentifier, handler: @escaping Handler) { + self.init(for: [columnIdentifier], handler: handler) + } /** Creates a cell registration with the specified registration handler and nib file. @@ -111,15 +126,31 @@ public extension NSTableView { An empty array indicates that the cell isn't restricted to any specific columns. - Parameters: - - nib: The nib of the cell. - columnIdentifiers: The identifiers of the table columns. The default value is `[]`, which indicates that the cell isn't restricted to specific columns. + - nib: The nib of the cell. - handler: The handler to configurate the cell. */ - public init(nib: NSNib, columnIdentifiers: [NSUserInterfaceItemIdentifier] = [], handler: @escaping Handler) { + public init(for columnIdentifiers: [NSUserInterfaceItemIdentifier] = [], nib: NSNib, handler: @escaping Handler) { self.handler = handler self.nib = nib self.columnIdentifiers = columnIdentifiers } + + /** + Creates a cell registration with the specified registration handler and nib file. + + The column identifier is used when the registration is applied to ``TableViewDiffableDataSource`` using ``TableViewDiffableDataSource/init(tableView:cellRegistrations:)``. + + You only have to provide a column identifier when your table view has multiple columns. The table cell is displayed for the columns with the same identifier. + + - Parameters: + - columnIdentifier: The identifier of the table column. + - nib: The nib of the cell. + - handler: The handler to configurate the cell. + */ + public init(for columnIdentifier: NSUserInterfaceItemIdentifier, nib: NSNib, handler: @escaping Handler) { + self.init(for: [columnIdentifier], nib: nib, handler: handler) + } /// A closure that handles the cell registration and configuration. public typealias Handler = (_ cellView: Cell, _ tableColumn: NSTableColumn, _ row: Int, _ item: Item) -> Void