From 4ebc00a5f37cea46839d4dacf8f334e0701549cd Mon Sep 17 00:00:00 2001 From: Brian Eschrich Date: Wed, 18 Mar 2020 15:43:15 +0100 Subject: [PATCH 1/9] added GuiFactory to include all default components --- src/ofxInterface.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/ofxInterface.h b/src/ofxInterface.h index 4f5afc7..455c454 100644 --- a/src/ofxInterface.h +++ b/src/ofxInterface.h @@ -9,18 +9,15 @@ #ifndef __ofxInterface_h__ #define __ofxInterface_h__ -#include "Node.h" -#include "AnimatableNode.h" #include "TouchEvent.h" #include "TouchManager.h" #include "VirtualTouch.h" /****** - * include default components + * include GuiFactory */ -#include "components/TextureButton.h" -#include "components/BitmapTextButton.h" -#include "components/SolidColorPanel.h" -#include "components/LambdaView.h" +#include "GuiFactory.h" + +#include "AnimatableNode.h" #endif From 4350811db7de49b00c92a60718a30fd9f4f2eb26 Mon Sep 17 00:00:00 2001 From: Brian Eschrich Date: Wed, 18 Mar 2020 15:48:06 +0100 Subject: [PATCH 2/9] main refactoring of Node - NodeSettings struct to setup Node from - lambda functions for Touch took from lambda node - json export node properties - pre and postDraw functions for more variablity in drawing - group render functionality --- src/Node.cpp | 265 +++++++++++++++++++++++++++++++++++++++++++++++++-- src/Node.h | 67 ++++++++++++- 2 files changed, 319 insertions(+), 13 deletions(-) diff --git a/src/Node.cpp b/src/Node.cpp index 1b48880..73e965f 100644 --- a/src/Node.cpp +++ b/src/Node.cpp @@ -66,6 +66,11 @@ Node::Node() #ifdef USE_OFX_HISTORY_PLOT historyPlot = NULL; #endif + + ofAddListener(eventTouchDown, this, &Node::onTouchDown); + ofAddListener(eventTouchMove, this, &Node::onTouchMove); + ofAddListener(eventTouchUp, this, &Node::onTouchUp); + ofAddListener(eventClick, this, &Node::onClick); } Node::Node(const Node& mom) : ofNode(mom) @@ -100,13 +105,29 @@ Node::Node() for (auto& c: mom.getChildren()) { addChild(c->clone()); } - + ofAddListener(eventTouchDown, this, &Node::onTouchDown); + ofAddListener(eventTouchMove, this, &Node::onTouchMove); + ofAddListener(eventTouchUp, this, &Node::onTouchUp); } Node* Node::clone() { return new Node(*this); } + +void Node::setup(NodeSettings settings) { + setName(settings.name); + setPosition(settings.position); + setSize(settings.size); + setPlane(settings.plane); + setRenderClip(settings.renderClip); + if (settings.isActive) { + activate(); + } + else { + deactivate(); + } +} int Node::getNumNodesAlive(){ return numInterfaceNodes; @@ -181,6 +202,9 @@ void Node::drawBounds() void Node::render(bool forceAll) { + //not yet finally tested + renderDynamic(forceAll); + /* std::list sortedNodes; std::list::iterator it; @@ -216,6 +240,7 @@ void Node::render(bool forceAll) ofPopMatrix(); ofPopStyle(); } + */ } void Node::renderDebug(bool forceAll) @@ -250,6 +275,79 @@ void Node::renderDebug(bool forceAll) } } +void Node::renderDynamic(bool forceAll) +{ + std::list sortedNodes; + std::list::iterator it; + + if (forceAll) { + // get all nodes (visible and invisible) + getSubTreeList(sortedNodes); + } + else { + // get only visible nodes + getVisibleSubTreeList(sortedNodes); + } + + // sort scene by z (+z goes outside of the screen), plane is z + sortedNodes.sort(Node::bottomPlaneFirst); + + for (it = sortedNodes.begin(); it != sortedNodes.end(); it++) + { + ofPushStyle(); + ofPushMatrix(); + ofMultMatrix((*it)->getGlobalTransformMatrix()); + // use anchor + + if ((*it)->getGlobalRenderClip()) { + (*it)->enableScissor((*it)->getRenderClipRect()); + } + if ((*it)->getRenderChildrenInGroup()) { + (*it)->renderGroups(); + } + else { + (*it)->draw(); + } + + if ((*it)->getGlobalRenderClip()) { + (*it)->disableScissor(); + } + + ofPopMatrix(); + ofPopStyle(); + } +} + +void Node::renderGroups(bool forceAll) +{ + for (auto& child : childNodes) { + if (forceAll || child->getVisible()) { + + //if (child->getName() != "") cout << child->getName() << " predraw " <preDraw(); + //ofPushStyle(); + ofPushMatrix(); + ofMultMatrix(child->getGlobalTransformMatrix()); + // use anchor + + if (child->getGlobalRenderClip()) { + child->enableScissor(child->getRenderClipRect()); + } + //if (child->getName() != "") cout << child->getName() << " draw " << endl; + child->draw(); + if (child->getGlobalRenderClip()) { + child->disableScissor(); + } + + ofPopMatrix(); + //ofPopStyle(); + child->renderGroups(); + //if (child->getName() != "") cout << child->getName() << " postDraw" << endl; + child->postDraw(); + } + } +} + void Node::updateSubtree(float dt, bool forceAll) { update(dt); @@ -307,6 +405,7 @@ ofRectangle Node::getRenderClipRect() ofRectangle rect; if (bClipRender) { ofVec2f pos = getGlobalPosition(); + rect = ofRectangle(pos.x, pos.y, getGlobalWidth(), getGlobalHeight()); } @@ -333,7 +432,11 @@ void Node::enableScissor(float x, float y, float w, float h) ofVec2f local = toLocal(ofVec2f(x, y)); ofVec2f localScale = ofVec2f(w, h)*getGlobalScale(); glEnable(GL_SCISSOR_TEST); - glScissor(local.x, local.y, localScale.x, localScale.y); + //glScissor(local.x, local.y, localScale.x, localScale.y); + // openGL uses an inverted y - axis, so we need to invert the y value + float dy = ofGetWindowHeight()-h -y; + + glScissor(x, dy, localScale.x, localScale.y); } void Node::disableScissor() @@ -369,6 +472,30 @@ void Node::setCentered() (((Node*)parent)->getLocalHeight() - getLocalHeight())/2); } +void Node::onTouchDown(TouchEvent & event) { + if (touchDownFunc) { + touchDownFunc(event); + } +} + +void Node::onTouchMove(TouchEvent & event) { + if (touchMoveFunc) { + touchMoveFunc(event); + } +} + +void Node::onTouchUp(TouchEvent & event) { + if (touchUpFunc) { + touchUpFunc(event); + } +} + +void Node::onClick(TouchEvent & event) { + if (clickFunc) { + clickFunc(event); + } +} + void Node::touchDown(int id, TouchEvent* event) { if (bNodeAllowOneTouch && bNodeTouched && nodeCurrentTouchId!=id) { @@ -399,6 +526,10 @@ void Node::touchMove(int id, TouchEvent* event) return; } + if (event->velocitySmoothed.length() > 20) { + isClickAllowed = false; + } + #ifdef OFXUINODE_DEBUG debugBorderColor.a -= 10; #endif @@ -424,11 +555,12 @@ void Node::touchUp(int id, TouchEvent* event) #endif ofNotifyEvent(eventTouchUp, *event); - if (contains(event->position)) { + if (contains(event->position) && isClickAllowed) { ofNotifyEvent(eventClick, *event); } bNodeTouched = false; + isClickAllowed = true; } void Node::touchExit(int id, TouchEvent *event) @@ -455,6 +587,33 @@ void Node::touchEnter(int id, TouchEvent *event) ofNotifyEvent(eventTouchEnter, *event); } +const ofJson Node::toJson(glm::vec3 val) +{ + ofJson ret; + ret.push_back(val.x); + ret.push_back(val.y); + ret.push_back(val.z); + return ret; +} + +const ofJson Node::toJson(glm::vec2 val) +{ + ofJson ret; + ret.push_back(val.x); + ret.push_back(val.y); + return ret; +} + +const ofJson Node::toJson(glm::quat val) +{ + ofJson ret; + ret.push_back(val.w); + ret.push_back(val.x); + ret.push_back(val.y); + ret.push_back(val.z); + return ofJson(); +} + ofVec3f Node::toLocal(const ofVec3f &screenPoint) { #ifdef GLM_SWIZZLE //this version of OF is using GLM for math ops @@ -565,6 +724,22 @@ bool Node::contains(const ofVec3f &globalPoint) return true; } +void Node::setTouchDownFunction(std::function _func) { + touchDownFunc = _func; +} + +void Node::setTouchMoveFunction(std::function _func) { + touchMoveFunc = _func; +} + +void Node::setTouchUpFunction(std::function _func) { + touchUpFunc = _func; +} + +void Node::setClickFunction(std::function _func) { + clickFunc = _func; +} + void Node::addChild(Node *child, int insertAt, bool bMaintainChildGlobalTransform) { child->setParent(*this, bMaintainChildGlobalTransform); @@ -617,17 +792,20 @@ void Node::sortChildren(const function& comp std::sort(childNodes.begin(), childNodes.end(), compareFunction); } -void Node::getSubTreeList(std::list& list) +void Node::getSubTreeList(std::list& list, bool returnAllGroupElements) { list.push_back(this); - for (int i=0; igetSubTreeList(list); + if (!bRenderChildrenInGroup) { + for (int i = 0; i < childNodes.size(); i++) + { + childNodes[i]->getSubTreeList(list); + } } + } -void Node::getVisibleSubTreeList(std::list& list) +void Node::getVisibleSubTreeList(std::list& list, bool returnAllGroupElements) { if (!getVisible()) { return; @@ -635,8 +813,10 @@ void Node::getVisibleSubTreeList(std::list& list) list.push_back(this); - for (int i=0; igetVisibleSubTreeList(list); + if (!bRenderChildrenInGroup) { + for (int i = 0; i < childNodes.size(); i++) { + childNodes[i]->getVisibleSubTreeList(list); + } } } @@ -710,5 +890,70 @@ float Node::getAngleTo(ofxInterface::Node *node) return atan2(translate.y, translate.x)*180/PI; } +ofJson Node::getSceneDescription() +{ + ofJson ret; + ret = getNodeJson(); + ofJson jChild; + for (auto& child:getChildren()){ + jChild.push_back(child->getSceneDescription()); + } + ret["children"] = jChild; + return ret; +} + +ofJson Node::getSceneDescription(vector attributes,bool onlyActiveNodes) +{ + return filterSceneDescription(getSceneDescription(), attributes , onlyActiveNodes); +} + +ofJson Node::getNodeJson() +{ + ofJson ret; + ret["nodeType"] = "Node"; + ret["name"] = getName(); + ret["size"] = toJson(getSize()); + ret["position"] = toJson(getPosition()); + ret["orientation"] = toJson(getOrientationQuat()); + ret["scale"] = toJson(getScale()); + ret["isVisible"] = getVisible(); + ret["isEnabled"] = getEnabled(); + ret["isReceivingTouch"] = getReceivingTouch(); + ret["plane"] = getPlane(); + return ret; +} + +string Node::listActiveNodes(int depth) +{ + string ret; + if (getEnabled()) { + for (size_t i = 0; i < depth; i++){ + ret += " "; + } + ret += name + "\n"; + for (auto n : getChildren()) { + ret += n->listActiveNodes(depth+1); + } + } + return ret; +} + +ofJson Node::filterSceneDescription(ofJson desc, vector attributes, bool onlyActiveNodes) +{ + ofJson ret; + if (onlyActiveNodes == false || (onlyActiveNodes == true && getEnabled()) ) { + for (auto& attr : attributes) { + if (desc[attr] != nullptr) ret[attr] = desc[attr]; + } + + if (desc["children"] != nullptr && desc["children"].size() > 0) { + for (auto& child : desc["children"]) { + ret["children"].push_back(filterSceneDescription(child, attributes, onlyActiveNodes)); + } + } + } + return ret; +} + } // namespace diff --git a/src/Node.h b/src/Node.h index 069b81c..2aabbc2 100644 --- a/src/Node.h +++ b/src/Node.h @@ -23,6 +23,15 @@ namespace ofxInterface { + struct NodeSettings { + string name; + ofVec2f position; + ofVec2f size; + bool renderClip = false; + bool isActive = true; + float plane = 10; +}; + class Node : public ofNode { friend class TouchManager; @@ -34,6 +43,8 @@ class Node : public ofNode Node(const Node& mom); virtual Node* clone(); + void setup(NodeSettings settings); + /****** * Node Names: * @@ -65,8 +76,10 @@ class Node : public ofNode // functions to override // - virtual void update(float dt) {} // please override with update code + virtual void update(float dt) {}; // please override with update code virtual void draw() {}; // please override! draw your object in local space + virtual void preDraw() {}; // affects group rendering, executed before the draw function + virtual void postDraw() {}; // affects group rendering, executed after the draw function // for debugging virtual void drawDebug(); // debug debugging stuff (will be called by renderDebug) @@ -89,6 +102,13 @@ class Node : public ofNode ofEvent eventTouchEnter; ofEvent eventClick; + // interaction functions (register lambda functions here) + void setTouchDownFunction(std::function _func); + void setTouchMoveFunction(std::function _func); + void setTouchUpFunction(std::function _func); + void setClickFunction(std::function _func); + + // use this to enforce only one touch at a time (single touch) void setAllowOnlyOneTouch(bool set) { bNodeAllowOneTouch = set; } bool isTouched() { return bNodeTouched; } @@ -107,6 +127,10 @@ class Node : public ofNode */ void render(bool forceAll = false); void renderDebug(bool forceAll = false); // same as render but calls drawDebug instead of draw. + + //TODO : description + void renderDynamic(bool forceAll = false); + void renderGroups(bool forceAll = false); /****** * call the 'update' function of !!visible!! children @@ -125,6 +149,10 @@ class Node : public ofNode bool getRenderClip() { return bClipRender; } bool getGlobalRenderClip(); ofRectangle getRenderClipRect(); + // if group is activated then all children are rendered afterwards and using the plane of this node (enables group masking) + void setRenderChildrenInGroup(bool set) {bRenderChildrenInGroup = set;}; + bool getRenderChildrenInGroup() { return bRenderChildrenInGroup; }; + // override these functions if you use some other renderer such as NanoVG virtual void enableScissor(const ofRectangle& rect) { enableScissor(rect.x, rect.y, rect.width, rect.height); } virtual void enableScissor(float x, float y, float w, float h); @@ -251,9 +279,9 @@ class Node : public ofNode } } // returns a list representation of all childNodes in sub graph - void getSubTreeList(std::list& list); + void getSubTreeList(std::list& list, bool returnAllGroupElements = true); // returns a list of visible elements in subtree - void getVisibleSubTreeList(std::list& list); + void getVisibleSubTreeList(std::list& list, bool returnAllGroupElements = true); // returns a list of enabled elements in subtree void getEnabledSubTreeList(std::list& list); @@ -408,8 +436,21 @@ class Node : public ofNode ofVec3f getTranslationTo(Node* node); float getAngleTo(Node* node); + /****** + * Exporting + * + * export the node as json + * + */ + + ofJson getSceneDescription(); + ofJson getSceneDescription(vector attributes, bool onlyActiveNodes = false); + virtual ofJson getNodeJson(); + string listActiveNodes(int depth = 0); protected: + ofJson filterSceneDescription(ofJson desc, vector attributes,bool onlyActiveNodes); + std::string name; ofVec2f size; @@ -418,6 +459,7 @@ class Node : public ofNode bool bReceivingTouch; bool bClipRender; bool bClipTouch; + bool bRenderChildrenInGroup = false; vector childNodes; @@ -461,12 +503,25 @@ class Node : public ofNode } } + // lambda functions here + std::function touchDownFunc; + std::function touchMoveFunc; + std::function touchUpFunc; + std::function clickFunc; + + void onTouchDown(TouchEvent& event); + void onTouchMove(TouchEvent& event); + void onTouchUp(TouchEvent& event); + void onClick(TouchEvent& event); + bool bSendDestroy; bool bNodeAllowOneTouch; bool bNodeUpdateWhenHidden; bool bNodeTouched; int nodeCurrentTouchId; + bool isClickAllowed = true; + #ifdef OLD_SORT /****** * sameDepthOffset: @@ -485,6 +540,12 @@ class Node : public ofNode void touchUp(int id, TouchEvent* event); void touchExit(int id, TouchEvent* event); void touchEnter(int id, TouchEvent* event); + + + //helper functions for export json + const ofJson toJson(glm::vec3 val); + const ofJson toJson(glm::vec2 val); + const ofJson toJson(glm::quat val); }; } From ca751802e8c502c6c2900334f7e78c27f2d39c27 Mon Sep 17 00:00:00 2001 From: Brian Eschrich Date: Wed, 18 Mar 2020 15:48:49 +0100 Subject: [PATCH 3/9] GuiFactory creates Nodes from json --- src/GuiFactory.cpp | 533 +++++++++++++++++++++++++++++++++++++++++++++ src/GuiFactory.h | 104 +++++++++ 2 files changed, 637 insertions(+) create mode 100644 src/GuiFactory.cpp create mode 100644 src/GuiFactory.h diff --git a/src/GuiFactory.cpp b/src/GuiFactory.cpp new file mode 100644 index 0000000..3d6cf60 --- /dev/null +++ b/src/GuiFactory.cpp @@ -0,0 +1,533 @@ +#include "GuiFactory.h" + +namespace ofxInterface +{ + GuiFactory::GuiFactory() { + } + + + GuiFactory::~GuiFactory() { + } + + void GuiFactory::setup(ofJson config, shared_ptr assets_) { + assets = assets_; + + // init colors + if (!config["colors"].is_null()) { + for (auto& color : config["colors"]) { + colors.insert(pair(color["id"].get(), colorFromJson(color["color"]))); + } + }else { + ofLogError("GuiFactory::setup", "no font colors defined, gui elements will use predefined ones"); + } + + // init font styles + if (!config["fontStyles"].is_null()) { + for (auto& font : config["fontStyles"]) { + ofxFontStash2::Style style; + style.fontID = font["fontId"].get(); + style.fontSize = font["fontSize"].get() * 1.5; + style.color = colors[font["color"].get()]; + if (!font["lineHeight"].is_null()) style.lineHeightMult = font["lineHeight"].get(); + + assets->getFonts()->addStyle(font["name"].get(), style); + } + } else { + ofLogError("GuiFactory::setup", "no font styles defined, gui elements using fonts won't be available" ); + } + + // init elements + if (!config["elements"].is_null()) { + styles = config["elements"]; + }else { + ofLogVerbose("GuiFactory::setup", "no elements defined"); + } + + + // register creation functions + registerCreationFunction("node", [this](ofJson config, ofJson style) {return this->getNode(config, style); }); + registerCreationFunction("label", [this](ofJson config, ofJson style) {return this->getLabel(config, style); }); + registerCreationFunction("textField", [this](ofJson config, ofJson style) {return this->getTextField(config, style); }); + registerCreationFunction("colorPanel", [this](ofJson config, ofJson style) {return this->getColorPanel(config, style); }); + registerCreationFunction("scrollableContainer", [this](ofJson config, ofJson style) {return this->getScrollableContainer(config, style); }); + registerCreationFunction("texture", [this](ofJson config, ofJson style) {return this->getTextureNode(config, style); }); + registerCreationFunction("modalElement", [this](ofJson config, ofJson style) {return this->getModal(config, style); }); + registerCreationFunction("simpleChecker", [this](ofJson config, ofJson style) {return this->getSimpleChecker(config, style); }); + registerCreationFunction("softKeyboard", [this](ofJson config, ofJson style) {return this->getSoftKeyboard(config, style); }); + registerCreationFunction("textInput", [this](ofJson config, ofJson style) {return this->getTextInput(config, style); }); + } + + ///\brief create all GUI elements from json and add them to parent node + void GuiFactory::createElements(Node * parent, ofJson config) { + for (auto& e : config["elements"]) { + auto elem = getElement(e); + if (elem != nullptr) { + parent->addChild(elem); + // create child elements + if (!e["elements"].is_null() && e["elements"].is_array()) { + createElements(elem, e); + } + } + } + } + + Node * GuiFactory::getElement(ofJson config) { + ofJson styleConfig = getStyle(config["class"].get()); + + if (styleConfig["id"] != "#error") { + string elemClass = styleConfig["class"].get(); + DEBUG("create element : " << config["id"].get() << " ( " << elemClass << " -> " << styleConfig["id"].get() << " )"); + Node* ret = nullptr; + if (creationTable.find(elemClass) != creationTable.end()) { + ret = (this->creationTable[elemClass])(config, styleConfig); + } else { + ofLogError("GuiFactory", "Can't create element \"" + config["id"].get() + "\" : no definition for class \"" + elemClass + "\" available."); + return nullptr; + } + return ret; + } + return nullptr; + } + Node * GuiFactory::getNode(ofJson config, ofJson style) { + NodeSettings s; + readNodeSettings(s,config,style); + Node* n = new Node(); + n->setup(s); + return n; + } + // -------------------------------------------------------------------------------------------------------------- + Node * GuiFactory::getLabel(ofJson config, ofJson style) { + + LabelSettings s; + readNodeSettings(s, config, style); + + s.font = assets->getFonts(); + if (hasValue("font", config, style)) { + s.style = assets->getFonts()->getStyle(getValue("font", config, style)); + } + + if (hasValue("text", config, style)) { + s.text = getValue("text", config, style); + } + + if (hasValue("alignment", config, style)) { + if (getValue("alignment", config, style) == "center") { + s.alignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; + } else if (getValue("alignment", config, style) == "right") { + s.alignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; + } + } + + if (hasValue("shadow", config, style)) { + s.isDropshadow = true; + if (hasValue("size", config["shadow"], style["shadow"])) { + s.shadowSize = getValue("size", config["shadow"], style["shadow"]); + } + if (hasValue("x", config["shadow"], style["shadow"])) { + s.shadowPos.x = getValue("x", config["shadow"], style["shadow"]); + } + if (hasValue("y", config["shadow"], style["shadow"])) { + s.shadowPos.y = getValue("y", config["shadow"], style["shadow"]); + } + if (hasValue("color", config["shadow"], style["shadow"])) { + + s.shadowColor = colors[getValue("color", config["shadow"], style["shadow"])]; + } + } + + Label* label = new Label(); + label->setup(s); + + return label; + } + + Node * GuiFactory::getTextField(ofJson config, ofJson style) { + TextFieldSettings s; + readNodeSettings(s, config, style); + + s.font = assets->getFonts(); + + if (!config["text"].is_null()) { + if (config["text"].is_array()) { + for (auto elem : config["text"]) { + s.text += elem.get(); + } + } else { + s.text = config["text"].get(); + } + } + if (hasValue("alignment", config, style)) { + string al = getValue("alignment", config, style); + if (al == "left") { + s.alignment = ofAlignHorz::OF_ALIGN_HORZ_LEFT; + } else if (al == "right") { + s.alignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; + } else if (al == "center") { + s.alignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; + } + } + + + TextField* textField = new TextField(); + textField->setup(s); + return textField; + } + + Node * GuiFactory::getColorPanel(ofJson config, ofJson style) { + ColorPanelSettings s; + readColorpanelSettings(s, config, style); + + ColorPanel* p = new ColorPanel(); + p->setup(s); + return p; + + } + + + + Node * GuiFactory::getScrollableContainer(ofJson config, ofJson style) { + ScrollableContainerSettings s; + readScrollableContainerSettings(s, config, style); + ScrollableContainer * p = new ScrollableContainer(); + p->setup(s); + return p; + } + + Node * GuiFactory::getTextureNode(ofJson config, ofJson style) { + TextureNodeSettings s; + readNodeSettings(s,config,style); + TextureNode* tex = new TextureNode(); + + if (hasValue("texture", config, style)) { + s.texture = assets->getTexture(getValue("texture", config, style)); + if (!hasValue("size", config, style)) { + s.size = ofVec2f(assets->getTexture(getValue("texture", config, style)).getWidth(), + assets->getTexture(getValue("texture", config, style)).getHeight()); + } + } + if (hasValue("tint", config, style)) { + s.tinting = colors[getValue("tint", config, style)]; + } + + if (hasValue("blendmode", config, style)) { + string al = getValue("blendmode", config, style); + if (al == "alpha") { + s.blendmode = OF_BLENDMODE_ALPHA; + } else if (al == "none") { + s.blendmode = OF_BLENDMODE_DISABLED; + } else if (al == "add") { + s.blendmode = OF_BLENDMODE_ADD; + } else if (al == "multiply") { + s.blendmode = OF_BLENDMODE_MULTIPLY; + } else if (al == "screen") { + s.blendmode = OF_BLENDMODE_SCREEN; + } else if (al == "subtract") { + s.blendmode = OF_BLENDMODE_SUBTRACT; + } + } + tex->setup(s); + return tex; + } + + Node * GuiFactory::getModal(ofJson config, ofJson style) { + ModalElementSettings s; + readModalElementSettings(s, config, style); + ModalElement* ret = new ModalElement(); + ret->setup(s); + return ret; + } + + Node * GuiFactory::getSimpleChecker(ofJson config, ofJson style) { + ModalElementSettings s; + readModalElementSettings(s, config, style); + + SimpleChecker* ret = new SimpleChecker(); + ret->setup(s); + return ret; + } + + Node * GuiFactory::getSoftKeyboard(ofJson config, ofJson style) + { + SoftKeyboardSettings settings; + readNodeSettings(settings, config, style); + + SoftKeyboard* ret = new SoftKeyboard(); + + settings.font = assets->getFonts(); + if (hasValue("font", config, style)) { + settings.style = assets->getFonts()->getStyle(getValue("font", config, style)); + } + if (hasValue("bgColor", config, style)) { + settings.bgColor = colors[getValue("bgColor", config, style)]; + } + if (hasValue("colorActive", config, style)) { + settings.colorActive = colors[getValue("colorActive", config, style)]; + } + if (hasValue("colorInactive", config, style)) { + settings.colorInactive = colors[getValue("colorInactive", config, style)]; + } + if (hasValue("colorSelected", config, style)) { + settings.colorSelected = colors[getValue("colorSelected", config, style)]; + } + + if (hasValue("borderRadius", config, style)) { + settings.borderRadius = getValue("borderRadius", config, style); + } + if (hasValue("borderWidth", config, style)) { + settings.borderWidth = getValue("borderWidth", config, style); + } + if (hasValue("margin", config, style)) { + settings.margin = getValue("margin", config, style); + } + if (hasValue("padding", config, style)) { + settings.padding = getValue("padding", config, style); + } + + ret->setup(settings); + return ret; + } + + Node * GuiFactory::getTextInput(ofJson config, ofJson style) + { + TextInputSettings settings; + readModalElementSettings(settings,config,style); + + settings.font = assets->getFonts(); + if (hasValue("font", config, style)) { + settings.style = assets->getFonts()->getStyle(getValue("font", config, style)); + } + + if (hasValue("maxChars", config, style)) { + settings.maxChars = getValue("maxChars", config, style); + } + if (hasValue("description", config, style)) { + settings.descriptionText = getValue("description", config, style); + } + + TextInput* t = new TextInput(); + t->setup(settings); + return t; + } + + ofJson GuiFactory::getStyle(string id) { + for (auto& s : styles) { + if (s["id"] == id) { + return s; + } + } + if (id != "canvas") { + ofLogError("GuiFactory::getStyle", "style <" + id + "> not found"); + } + + return ofJson({ {"id","#error"} }); + } + void GuiFactory::readNodeSettings(NodeSettings & settings, ofJson config, ofJson style) { + settings.name = config["id"].get(); + if (hasValue("position", config, style)) { + settings.position = vec2fFromJson(getValue("position", config, style)); + } + if (hasValue("size", config, style)) { + settings.size = vec2fFromJson(getValue("size", config, style)); + } + if (hasValue("plane", config, style)) { + settings.plane = getValue("plane", config, style); + } + if (hasValue("renderClip", config, style)) { + settings.renderClip = getValue("plane", config, style); + } + if (hasValue("active", config, style)) { + settings.isActive = getValue("active", config, style); + } + } + + void GuiFactory::readModalElementSettings(ModalElementSettings & settings, ofJson config, ofJson style) { + readNodeSettings(settings, config, style); + if (hasValue("type", config, style)) { + string val = getValue("type", config, style); + if (val == "button") { + settings.type = BUTTON; + }else if (val == "checker") { + settings.type = CHECKER; + } else if (val == "radio") { + settings.type = RADIO; + } + } + if (hasValue("colorActive", config, style)) { + settings.colorActive = colors[getValue("colorActive", config, style)]; + } + if (hasValue("colorInactive", config, style)) { + settings.colorInactive = colors[getValue("colorInactive", config, style)]; + } + if (hasValue("colorSelected", config, style)) { + settings.colorSelected = colors[getValue("colorSelected", config, style)]; + } + } + + void GuiFactory::readScrollableContainerSettings(ScrollableContainerSettings & settings, ofJson config, ofJson style) { + readNodeSettings(settings, config, style); + if (hasValue("sizeScrollableArea", config, style)) { + settings.sizeScrollableArea = vec2fFromJson(getValue("sizeScrollableArea", config, style)); + } else { + settings.sizeScrollableArea = settings.size; + } + if (hasValue("bgColor", config, style)) { + settings.bgColor = colors[getValue("bgColor", config, style)]; + } + if (hasValue("scrollActiveColor", config, style)) { + settings.scrollActiveColor = colors[getValue("scrollActiveColor", config, style)]; + } + if (hasValue("scrollInactiveColor", config, style)) { + settings.scrollInactiveColor = colors[getValue("scrollInactiveColor", config, style)]; + } + } + + void GuiFactory::readColorpanelSettings(ColorPanelSettings & settings, ofJson config, ofJson style) { + readNodeSettings(settings, config, style); + + if (hasValue("strokeWidth", config, style)) { + settings.strokeWidth = getValue("strokeWidth", config, style); + } + if (hasValue("drawBackground", config, style)) { + settings.bDrawBackground = getValue("drawBackground", config, style); + } + if (hasValue("borderRadius", config, style)) { + settings.borderRadius = getValue("borderRadius", config, style); + } + if (hasValue("color", config, style)) { + settings.bgColor = colors[getValue("color", config, style)]; + } + if (hasValue("strokeColor", config, style)) { + settings.strokeColor = colors[getValue("strokeColor", config, style)]; + } + } + + ofColor GuiFactory::colorFromJson(ofJson val) { + switch (val.size()) { + case 1: + // interprete string + if (val.is_string()) { + + if (ofIsStringInString(val.get(), ".")) { + ofParameter pTemp; + pTemp.fromString(val); + return pTemp.get(); + } else { + ofParameter pTemp; + pTemp.fromString(val); + return pTemp.get(); + } + + }// interprete array + else + return ofColor(val[0].get()); + + break; + case 2: + return ofColor(val[0], val[0], val[0], val[1]); + break; + case 3: + return ofColor(val[0], val[1], val[2]); + break; + case 4: + return ofColor(val[0], val[1], val[2], val[3]); + break; + default: + return ofColor(); + break; + } + } + + ofVec2f GuiFactory::vec2fFromJson(ofJson val) { + switch (val.size()) { + case 1: + // interprete string + if (val.is_string()) { + ofParameter pTemp; + pTemp.fromString(val); + return pTemp.get(); + }// interprete array + else + return ofVec2f(val[0].get()); + + break; + case 2: + return ofVec2f(val[0], val[1]); + break; + default: + return ofVec2f(); + break; + } + } + + ofVec3f GuiFactory::vec3fFromJson(ofJson val) { + switch (val.size()) { + case 1: + // interprete string + if (val.is_string()) { + ofParameter pTemp; + pTemp.fromString(val); + return pTemp.get(); + }// interprete array + else + return ofVec3f(val[0].get()); + + break; + case 2: + return ofVec3f(val[0], val[1]); + break; + case 3: + return ofVec3f(val[0], val[1], val[2]); + break; + default: + return ofVec2f(); + break; + } + } + + void GuiFactory::addStyle(ofJson style, ofJson& styleConfig, bool overwrite) + { + vector styleList; + bool hasStyle = false; + for (auto& elem : styleConfig) { + if (elem["id"] == style["id"]) { + hasStyle = true; + if (overwrite) { + styleList.push_back(style); + } else { + styleList.push_back(elem); + } + } else { + styleList.push_back(elem); + } + } + if (!hasStyle) { + styleList.push_back(style); + } + styleConfig = styleList; + } + + bool GuiFactory::hasValue(string valueName, ofJson config, ofJson style) { + if (!config[valueName].is_null()) { + return true; + } + if (!style[valueName].is_null()) { + return true; + } + return false; + } + ///\brief register a creation function + /// + /// since it is not self-explanatory, here you have an example (using a lamda function) + /// registerCreationFunction("a functionname", [this](ofJson config, ofJson style) {return this->myFunction(config, style); }) + /// + /// if someone finds a way to achive this easier, please edit ;) + void GuiFactory::registerCreationFunction(string name, creationFunction fct) { + // register function in table + creationTable[name] = fct; + + // create base style for factory + addStyle(ofJson{ {"id",name },{"class",name} }, styles); + } + + +} \ No newline at end of file diff --git a/src/GuiFactory.h b/src/GuiFactory.h new file mode 100644 index 0000000..fd7a11e --- /dev/null +++ b/src/GuiFactory.h @@ -0,0 +1,104 @@ +#pragma once +#include "ofMain.h" +#include "ofxAssetManager.h" + +#include "Label.h" +#include "TextField.h" +#include "ColorPanel.h" +#include "ScrollableContainer.h" +#include "TextureNode.h" +#include "SimpleChecker.h" +#include "SoftKeyboard.h" +#include "TextInput.h" + + +#define DEBUG(X) if(isDebug) ofLogNotice() << X + + +///\brief defines a function for creating gui elements +/// +/// since it looks a little overcomplicated (maybe it is) i try to explain it +/// the GuiFactory should be subclassed and therefore you need to register creation functions +/// for your own gui elements. Every function is set in the form of: +/// ofxInterface::Node*(ofJson, ofJson) +/// to register function from subclasses you need to use a std::function template +/// +/// typedef does not work with std::function thats why we used a struct +/// https://stackoverflow.com/questions/27002263/c11-typedef-stdfunction-and-argument-on-itself +struct creationFunction : std::function < ofxInterface::Node*(ofJson, ofJson)> { + using std::function < ofxInterface::Node*(ofJson, ofJson)>::function; +}; + +namespace ofxInterface +{ + class GuiFactory + { + public: + GuiFactory(); + ~GuiFactory(); + + virtual void setup(ofJson config, shared_ptr assets); + + void createElements(Node* parent, ofJson config); + Node* getElement(ofJson config); + + Node* getNode(ofJson config, ofJson style); + Node* getLabel(ofJson config, ofJson style); + Node* getTextField(ofJson config, ofJson style); + Node* getColorPanel(ofJson config, ofJson style); + Node* getScrollableContainer(ofJson config, ofJson style); + Node* getTextureNode(ofJson config, ofJson style); + Node* getModal(ofJson config, ofJson style); + Node* getSimpleChecker(ofJson config, ofJson style); + Node* getSoftKeyboard(ofJson config, ofJson style); + Node* getTextInput(ofJson config, ofJson style); + + + protected: + // -- Helper functions -- // + ofJson getStyle(string id); + + bool hasValue(string valueName, ofJson config, ofJson style); + static ofColor colorFromJson(ofJson val); + static ofVec2f vec2fFromJson(ofJson val); + static ofVec3f vec3fFromJson(ofJson val); + + void addStyle(ofJson style, ofJson& styleConfig, bool overwrite = false); + + template + ValueType getValue(string valueName, ofJson config, ofJson style); + + // -- function registration -- // + void registerCreationFunction(string name, creationFunction fct); + + // -- class functions --// + void readNodeSettings(NodeSettings& settings, ofJson config, ofJson style); + void readModalElementSettings(ModalElementSettings& settings, ofJson config, ofJson style); + void readScrollableContainerSettings(ScrollableContainerSettings& settings, ofJson config, ofJson style); + void readColorpanelSettings(ColorPanelSettings& settings, ofJson config, ofJson style); + + // -- variables -- // + shared_ptr assets; + map colors; + bool isDebug = true; + + + + private: + + ofJson styles; + std::map creationTable; + + }; + + template + inline ValueType GuiFactory::getValue(string valueName, ofJson config, ofJson style) { + ValueType ret; + if (config[valueName] != nullptr) { + ret = config[valueName].get(); + }else if (style[valueName] != nullptr) { + ret = style[valueName].get(); + } + return ret; + } +} From 42c810bdff887071b7d7e91575b0b96e7dbfd26f Mon Sep 17 00:00:00 2001 From: Brian Eschrich Date: Wed, 18 Mar 2020 15:49:32 +0100 Subject: [PATCH 4/9] set of Base Gui elements --- src/components/BitmapTextButton.cpp | 48 ----- src/components/BitmapTextButton.h | 49 ----- src/components/ColorPanel.cpp | 87 ++++++++ src/components/ColorPanel.h | 50 +++++ src/components/Label.cpp | 73 +++++++ src/components/Label.h | 46 ++++ src/components/LambdaView.cpp | 39 ---- src/components/LambdaView.h | 10 - src/components/ModalElement.cpp | 84 ++++++++ src/components/ModalElement.h | 45 ++++ src/components/ScrollableContainer.cpp | 220 ++++++++++++++++++++ src/components/ScrollableContainer.h | 70 +++++++ src/components/SimpleChecker.cpp | 60 ++++++ src/components/SimpleChecker.h | 27 +++ src/components/SoftKeyboard.cpp | 215 +++++++++++++++++++ src/components/SoftKeyboard.h | 80 +++++++ src/components/SoftKeyboardKey.cpp | 277 +++++++++++++++++++++++++ src/components/SoftKeyboardKey.h | 64 ++++++ src/components/SolidColorPanel.cpp | 53 ----- src/components/SolidColorPanel.h | 46 ---- src/components/TextField.cpp | 41 ++++ src/components/TextField.h | 31 +++ src/components/TextInput.cpp | 184 ++++++++++++++++ src/components/TextInput.h | 64 ++++++ src/components/TextureButton.cpp | 76 ------- src/components/TextureButton.h | 57 ----- src/components/TextureNode.cpp | 137 ++++++++++++ src/components/TextureNode.h | 56 +++++ 28 files changed, 1911 insertions(+), 378 deletions(-) delete mode 100644 src/components/BitmapTextButton.cpp delete mode 100644 src/components/BitmapTextButton.h create mode 100644 src/components/ColorPanel.cpp create mode 100644 src/components/ColorPanel.h create mode 100644 src/components/Label.cpp create mode 100644 src/components/Label.h create mode 100644 src/components/ModalElement.cpp create mode 100644 src/components/ModalElement.h create mode 100644 src/components/ScrollableContainer.cpp create mode 100644 src/components/ScrollableContainer.h create mode 100644 src/components/SimpleChecker.cpp create mode 100644 src/components/SimpleChecker.h create mode 100644 src/components/SoftKeyboard.cpp create mode 100644 src/components/SoftKeyboard.h create mode 100644 src/components/SoftKeyboardKey.cpp create mode 100644 src/components/SoftKeyboardKey.h delete mode 100644 src/components/SolidColorPanel.cpp delete mode 100644 src/components/SolidColorPanel.h create mode 100644 src/components/TextField.cpp create mode 100644 src/components/TextField.h create mode 100644 src/components/TextInput.cpp create mode 100644 src/components/TextInput.h delete mode 100644 src/components/TextureButton.cpp delete mode 100644 src/components/TextureButton.h create mode 100644 src/components/TextureNode.cpp create mode 100644 src/components/TextureNode.h diff --git a/src/components/BitmapTextButton.cpp b/src/components/BitmapTextButton.cpp deleted file mode 100644 index 8b726ee..0000000 --- a/src/components/BitmapTextButton.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// -// BitmapTextButton.cpp -// ofxInterface -// -// Created by Gal Sasson on 1/19/15. -// -// - -#include "BitmapTextButton.h" - -namespace ofxInterface -{ - -void BitmapTextButton::setup(const string &_label) -{ - label = _label; - setSize(label.length()*8 + 10, 20); - setName(label); - - bDrawBorder = true; - bDrawBackground = true; - - borderColor = ofColor(0); - bgColor = ofColor(255); - labelColor = ofColor(0); -} - -void BitmapTextButton::draw() -{ - if (bDrawBackground) { - ofSetColor(bgColor * (isTouched()?0.5:1)); - ofFill(); - ofDrawRectangle(0, 0, getWidth(), getHeight()); - } - - ofSetColor(labelColor); - ofDrawBitmapString(label, 5, getHeight()-5); - - if (bDrawBorder) { - ofSetColor(borderColor); - ofNoFill(); - ofSetLineWidth(1); - ofDrawRectangle(0, 0, getWidth(), getHeight()); - } -} - - -} // namespace diff --git a/src/components/BitmapTextButton.h b/src/components/BitmapTextButton.h deleted file mode 100644 index 7b15cec..0000000 --- a/src/components/BitmapTextButton.h +++ /dev/null @@ -1,49 +0,0 @@ -// -// BitmapTextButton.h -// AnimationBreaker -// -// Created by Gal Sasson on 1/19/15. -// -// - -#ifndef __ofxInterface__BitmapTextButton__ -#define __ofxInterface__BitmapTextButton__ - -#include -#include "ofMain.h" - -#include "ofxInterface.h" - -namespace ofxInterface -{ - -class BitmapTextButton : public Node -{ -public: - - void setup(const string& label); - - void setBackground(bool set) { bDrawBackground = set; } - void setBorder(bool set) { bDrawBorder = set; } - - void setLabelColor(const ofColor& c) { labelColor = c; } - void setBGColor(const ofColor& c) { bgColor = c; } - void setBorderColor(const ofColor& c) { borderColor = c; } - - void draw(); - -private: - - bool bDrawBackground; - bool bDrawBorder; - - ofColor borderColor; - ofColor bgColor; - ofColor labelColor; - - string label; -}; - -} // namespace - -#endif /* defined(__ofxUINode__BitmapTextButton__) */ diff --git a/src/components/ColorPanel.cpp b/src/components/ColorPanel.cpp new file mode 100644 index 0000000..9e95c1f --- /dev/null +++ b/src/components/ColorPanel.cpp @@ -0,0 +1,87 @@ +#include "ColorPanel.h" + +namespace ofxInterface { + + +void ColorPanel::setup(ofColor color, float w, float h) +{ + setSize(w, h); + setColor(color); + bDrawBackground = true; +} + +void ColorPanel::setup(ColorPanelSettings settings) { + Node::setup(settings); + borderWidth = settings.strokeWidth; + bDrawBackground = settings.bDrawBackground; + roundAngle = settings.borderRadius; + bgColor = settings.bgColor; + strokeColor = settings.strokeColor; +} + +ofColor ColorPanel::getColor() { + return bgColor; +} + +ofColor ColorPanel::getStrokeColor() { + return strokeColor; +} + +void ColorPanel::setStrokeColor(const ofColor & c) { + strokeColor = c; +} + +bool ColorPanel::isDrawBackground() { + return bDrawBackground; +} + +void ColorPanel::setDrawBackground(bool set) { + bDrawBackground = set; +} + +float ColorPanel::getBorderWidth() { + return borderWidth; +} + +void ColorPanel::setBorderWidth(float set) { + borderWidth = set; +} + +float ColorPanel::getRoundedEdge() { + return roundAngle; +} + +void ColorPanel::setRoundedEdge(float ang) { + roundAngle = ang; +} + +void ColorPanel::draw() +{ + + if (bDrawBackground) { + ofFill(); + ofSetColor(bgColor); + + if (roundAngle > 0) { + ofDrawRectRounded(0, 0, getWidth(), getHeight(), roundAngle); + } + else { + ofDrawRectangle(0, 0, getWidth(), getHeight()); + } + } + + if (borderWidth > 0) { + ofNoFill(); + ofSetLineWidth(borderWidth); + ofSetColor(strokeColor); + if (roundAngle > 0) { + ofDrawRectRounded(0, 0, getWidth(), getHeight(), roundAngle); + } else { + ofDrawRectangle(0, 0, getWidth(), getHeight()); + } + } +} + + + +} // namespace \ No newline at end of file diff --git a/src/components/ColorPanel.h b/src/components/ColorPanel.h new file mode 100644 index 0000000..15bc7b2 --- /dev/null +++ b/src/components/ColorPanel.h @@ -0,0 +1,50 @@ +#pragma once + +#include "ofMain.h" + +#include "Node.h" + +namespace ofxInterface { + struct ColorPanelSettings : NodeSettings{ + float strokeWidth = 0; + bool bDrawBackground = true; + float borderRadius = 0; + + ofColor bgColor = ofColor(0); + ofColor strokeColor = ofColor(0); + }; + + class ColorPanel : public ofxInterface::Node + { + public: + void setup(ofColor color, float w, float h); + void setup(ColorPanelSettings settings); + + void draw(); + + ofColor getColor(); + void setColor(const ofColor& c) { bgColor = c; } + + ofColor getStrokeColor(); + void setStrokeColor(const ofColor& c); + + bool isDrawBackground(); + void setDrawBackground(bool set); + + float getBorderWidth(); + void setBorderWidth(float set); + + float getRoundedEdge(); + void setRoundedEdge(float ang); + + private: + float borderWidth; + bool bDrawBackground = true; + float roundAngle; + + ofColor bgColor; + ofColor strokeColor; + }; + +} + diff --git a/src/components/Label.cpp b/src/components/Label.cpp new file mode 100644 index 0000000..4325180 --- /dev/null +++ b/src/components/Label.cpp @@ -0,0 +1,73 @@ +#include "Label.h" + + +namespace ofxInterface { + Label::Label() :Node() + { + + } + + + Label::~Label() + { + } + + void Label::draw() + { + auto bounds = font->getTextBounds(text, style, 0, 0); + float dy = bounds.height*0.5; + + bounds.y += dy; + + // since fontstash uses its own clip functions, we need to manually disable the draw + // masks out the text completely, when out of clip + // need to find a more appropriate function + ofRectangle boundsGlobal( toGlobal(ofVec3f(bounds.x,bounds.y)),toGlobal(ofVec3f(bounds.width,bounds.height)) ); + boundsGlobal.width -= boundsGlobal.x; + boundsGlobal.height -= boundsGlobal.y; + + if (!getGlobalRenderClip() || getRenderClipRect().intersects(boundsGlobal)) { + if (isDropshadow) { + font->drawColumn(text, shadow, shadowPos.x, shadowPos.y + dy, getWidth(), alignment); + } + font->drawColumn(text, style, 0, dy, getWidth(), alignment); + } + + + } + + void ofxInterface::Label::setup(LabelSettings s) + { + Node::setup(s); + font = s.font; + style = s.style; + text = s.text; + alignment = s.alignment; + setShadow(s.isDropshadow, s.shadowSize, s.shadowPos.x, s.shadowPos.y, s.shadowColor); + + } + + void Label::setText(string text_) + { + text = text_; + } + + void Label::setAlignment(ofAlignHorz alignment_) + { + alignment = alignment_; + } + void Label::setShadow(bool isEnabled, float w, float x, float y, ofColor color) { + isDropshadow = isEnabled; + shadow = style; + shadow.blur = w; + shadow.color = color; + shadowPos = ofVec2f(x, y); + } + void Label::setFontSize(float size) { + style.fontSize = size; + shadow.fontSize = size; + } + float Label::getFontSize() { + return style.fontSize; + } +} \ No newline at end of file diff --git a/src/components/Label.h b/src/components/Label.h new file mode 100644 index 0000000..274cfec --- /dev/null +++ b/src/components/Label.h @@ -0,0 +1,46 @@ +#pragma once +#include "Node.h" +#include "ofxFontStash2.h" + +namespace ofxInterface { + struct LabelSettings :NodeSettings{ + shared_ptr font; + ofxFontStash2::Style style; + string text; + ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + + bool isDropshadow = false; + ofxFontStash2::Style shadow; + ofVec2f shadowPos; + float shadowSize; + ofColor shadowColor; + }; + + class Label : + public Node + { + public: + Label(); + ~Label(); + + virtual void draw(); + virtual void setup(LabelSettings s); + void setText(string text); + void setAlignment(ofAlignHorz alignment); + void setShadow(bool isEnabled, float w = 0, float x= 0, float y = 0, ofColor color = ofColor(0)); + void setFontSize(float size); + float getFontSize(); + + + private: + shared_ptr font; + ofxFontStash2::Style style; + string text; + ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + + bool isDropshadow = false; + ofxFontStash2::Style shadow; + ofVec2f shadowPos; + }; +} + diff --git a/src/components/LambdaView.cpp b/src/components/LambdaView.cpp index 209de57..280751e 100644 --- a/src/components/LambdaView.cpp +++ b/src/components/LambdaView.cpp @@ -14,9 +14,6 @@ namespace ofxInterface LambdaView::LambdaView(const string& name) { setName(name); - ofAddListener(eventTouchDown, this, &LambdaView::onTouchDown); - ofAddListener(eventTouchMove, this, &LambdaView::onTouchMove); - ofAddListener(eventTouchUp, this, &LambdaView::onTouchUp); } void LambdaView::setDrawFunction(std::function _func) @@ -34,21 +31,6 @@ void LambdaView::setUpdateFunction(std::function _func) updateFunc = _func; } -void LambdaView::setTouchDownFunction(std::function _func) -{ - touchDownFunc = _func; -} - -void LambdaView::setTouchMoveFunction(std::function _func) -{ - touchMoveFunc = _func; -} - -void LambdaView::setTouchUpFunction(std::function _func) -{ - touchUpFunc = _func; -} - void LambdaView::setContainsFunction(std::function _func) { containsFunc = _func; @@ -85,25 +67,4 @@ bool LambdaView::contains(const ofVec3f& global) } } -void LambdaView::onTouchDown(TouchEvent& event) -{ - if (touchDownFunc) { - touchDownFunc(event); - } -} - -void LambdaView::onTouchMove(TouchEvent& event) -{ - if (touchMoveFunc) { - touchMoveFunc(event); - } -} - -void LambdaView::onTouchUp(TouchEvent& event) -{ - if (touchUpFunc) { - touchUpFunc(event); - } -} - } \ No newline at end of file diff --git a/src/components/LambdaView.h b/src/components/LambdaView.h index 5e147bb..e15c7a6 100644 --- a/src/components/LambdaView.h +++ b/src/components/LambdaView.h @@ -22,9 +22,6 @@ class LambdaView : public Node void setDrawFunction(std::function _func); void setDrawDebugFunction(std::function _func); void setUpdateFunction(std::function _func); - void setTouchDownFunction(std::function _func); - void setTouchMoveFunction(std::function _func); - void setTouchUpFunction(std::function _func); void setContainsFunction(std::function _func); void update(float dt); void draw(); @@ -35,14 +32,7 @@ class LambdaView : public Node std::function drawFunc; std::function drawDebugFunc = [&](){Node::drawDebug();}; std::function updateFunc; - std::function touchDownFunc; - std::function touchMoveFunc; - std::function touchUpFunc; std::function containsFunc; - - void onTouchDown(TouchEvent& event); - void onTouchMove(TouchEvent& event); - void onTouchUp(TouchEvent& event); }; } diff --git a/src/components/ModalElement.cpp b/src/components/ModalElement.cpp new file mode 100644 index 0000000..3a50e66 --- /dev/null +++ b/src/components/ModalElement.cpp @@ -0,0 +1,84 @@ +#include "ModalElement.h" + + +namespace ofxInterface { + ModalElement::ModalElement() + { + } + + + ModalElement::~ModalElement() + { + } + + void ModalElement::setup(ModalElementSettings s) + { + Node::setup(s); + type = s.type; + colorActive = s.colorActive; + colorInactive = s.colorInactive; + colorSelected = s.colorSelected; + + ofAddListener(eventClick, this, &ModalElement::onClicked,100); + ofAddListener(eventTouchDown, this, &ModalElement::onTouchDown, 100); + ofAddListener(eventTouchUp, this, &ModalElement::onTouchUp, 100); + isSelected.addListener(this, &ModalElement::onStateChanged); + } + + void ModalElement::draw() + { + if (getEnabled()) { + ofSetColor(colorActive); + ofDrawRectangle(0, 0, getWidth(), getHeight()); + if (isSelected) { + ofSetColor(colorSelected); + ofDrawRectangle(2, 2, getWidth()-4, getHeight()-4); + } + } else { + ofSetColor(colorInactive); + ofDrawRectangle(0, 0, getWidth(), getHeight()); + } + + + + } + void ModalElement::onClicked(TouchEvent & e) + { + switch (type) { + case ofxInterface::BUTTON: + break; + case ofxInterface::CHECKER: + isSelected = !isSelected; + break; + case ofxInterface::RADIO: + if (!isSelected) { + isSelected = true; + } + break; + default: + break; + } + + } + + void ModalElement::onTouchDown(TouchEvent & e) { + if (type == BUTTON) { + isSelected = true; + } + } + + void ModalElement::onTouchUp(TouchEvent & e) { + if (type == BUTTON) { + isSelected = false; + } + } + + void ModalElement::setModalType(ModalType type_) { + type = type_; + } + + ModalType ModalElement::getModalType() { + return type; + } + +} \ No newline at end of file diff --git a/src/components/ModalElement.h b/src/components/ModalElement.h new file mode 100644 index 0000000..de3b2df --- /dev/null +++ b/src/components/ModalElement.h @@ -0,0 +1,45 @@ +#pragma once +#include "Node.h" + +namespace ofxInterface { + enum ModalType { + BUTTON, + CHECKER, + RADIO + }; + + struct ModalElementSettings : NodeSettings{ + ModalType type = BUTTON; + ofColor colorActive = ofColor(200); + ofColor colorSelected = ofColor(100); + ofColor colorInactive = ofColor(50); + }; + + class ModalElement : public Node + { + public: + ModalElement(); + ~ModalElement(); + + void setup(ModalElementSettings s); + virtual void draw(); + + void onClicked(TouchEvent& e); + void onTouchDown(TouchEvent& e); + void onTouchUp(TouchEvent& e); + virtual void onStateChanged(bool& isActive) {}; + ofParameter isSelected = false; + + void setModalType(ModalType type); + ModalType getModalType(); + + protected: + ofColor colorActive; + ofColor colorSelected; + ofColor colorInactive; + + private: + ModalType type; + + }; +} diff --git a/src/components/ScrollableContainer.cpp b/src/components/ScrollableContainer.cpp new file mode 100644 index 0000000..f597cc0 --- /dev/null +++ b/src/components/ScrollableContainer.cpp @@ -0,0 +1,220 @@ +#include "ScrollableContainer.h" + + +namespace ofxInterface { + ScrollableContainer::ScrollableContainer():Node() + { + } + + + ScrollableContainer::~ScrollableContainer() + { + } + + void ScrollableContainer::setup(ScrollableContainerSettings s) { + Node::setup(s); + setRenderClip(true); + setTouchClip(true); + + scrollableArea = new Node(); + scrollableArea->setName("scrollableArea"); + scrollableArea->setSize(s.sizeScrollableArea); + addChild(scrollableArea); + + bgColor = s.bgColor; + scrollActiveColor = s.scrollActiveColor; + scrollInactiveColor = s.scrollInactiveColor; + + ofAddListener(eventChildAdded, this, &ScrollableContainer::onChildAdded); + ofAddListener(scrollableArea->eventTouchMove, this, &ScrollableContainer::onTouchMove); + ofAddListener(scrollableArea->eventTouchUp, this, &ScrollableContainer::onTouchUp); + ofAddListener(scrollableArea->eventTouchDown, this, &ScrollableContainer::onTouchDown); + + edgeAnimation.setCurve(AnimCurve::SWIFT_GOOGLE); + edgeAnimation.setAnimFinishedLambda([this]() { + if (animationReady) { + edgeAnimation.animateTo(finalPoint); + animationReady = false; + } + }); + } + + + void ScrollableContainer::draw() + { + // animate elements if scrolled on edge + if (edgeAnimation.isAnimating()) { + edgeAnimation.update(ofGetLastFrameTime()); + scrollableArea->setPosition(edgeAnimation.getCurrentPosition()); + + // animate elements right after touchUp + } + if (isAutoScroll) { + currentVelocity *= friction; + + ofVec2f newPos = ofVec2f(scrollableArea->getPosition()) + currentVelocity* ofGetLastFrameTime(); + + newPos.x = ofClamp(newPos.x, getWidth() - scrollableArea->getWidth(), 0); + newPos.y = ofClamp(newPos.y, getHeight() - scrollableArea->getHeight(), 0); + + scrollableArea->setPosition(newPos); + + if (abs(currentVelocity.x) < 1 && abs(currentVelocity.y) < 1) { + isAutoScroll = false; + } + else if( ((newPos.x == 0 || newPos.x == getWidth() - scrollableArea->getWidth()) && + (newPos.y == 0 || newPos.y == getHeight() - scrollableArea->getHeight()))) { + isAutoScroll = false; + + edgeAnimation.setPosition(scrollableArea->getPosition()); + edgeAnimation.setDuration(0.15); + + ofVec2f d; + d.x = currentVelocity.x < 0 ? -50 : 50; + d.y = currentVelocity.y < 0 ? -50 : 50; + if (getWidth() == scrollableArea->getWidth()) { + d.x = 0; + } + if (getHeight() == scrollableArea->getHeight()) { + d.y = 0; + } + + edgeAnimation.animateTo(ofVec2f(scrollableArea->getPosition()) + d); + finalPoint = scrollableArea->getPosition(); + animationReady = false; + } + } + + ofSetColor(bgColor); + ofDrawRectangle(0, 0, getWidth(), getHeight()); + + // draw slider + float wSlider = 6; + float marginSlider = 20; + + if (scrollableArea->getWidth() > getWidth()) { + ofVec2f d0 = ofVec2f(marginSlider, getHeight() - marginSlider - wSlider); + ofSetColor(scrollInactiveColor); + float width = getWidth() - 3 * marginSlider; + ofDrawRectangle(d0, width, wSlider); + + ofSetColor(scrollActiveColor); + float wActive = width * getWidth() / scrollableArea->getWidth(); + if (edgeAnimation.isAnimating()) { + wActive -= (1.0 - edgeAnimation.getPercentDone()) * 25; + } + float pos = (width - wActive) - ofMap(scrollableArea->getPosition().x, getWidth() - scrollableArea->getWidth(), 0, 0, width - wActive, true); + ofDrawRectangle(d0 + ofVec2f(pos,0), wActive, wSlider); + } + + if (scrollableArea->getHeight() > getHeight()) { + ofVec2f d0 = ofVec2f(getWidth() - marginSlider - wSlider, marginSlider); + ofSetColor(scrollInactiveColor); + float height = getHeight() - 2 * marginSlider; + ofDrawRectangle(d0, wSlider, height); + + ofSetColor(scrollActiveColor); + float hActive = height * getHeight() / scrollableArea->getHeight(); + if (edgeAnimation.isAnimating()) { + hActive -= (1.0 - edgeAnimation.getPercentDone()) * 25; + } + float pos = (height - hActive) - ofMap(scrollableArea->getPosition().y, getHeight() - scrollableArea->getHeight(),0, 0, height-hActive,true); + ofDrawRectangle(d0 +ofVec2f(0,pos), wSlider, hActive); + } + + } + + + Node * ScrollableContainer::getScrollableArea() { + return scrollableArea; + } + + void ScrollableContainer::addChildToScrollableArea(Node * child) { + // enable clipping for children + child->setRenderClip(true); + scrollableArea->addChild(child); + } + + void ScrollableContainer::onTouchDown(TouchEvent & event) { + edgeAnimation.reset(); + } + + void ScrollableContainer::onTouchUp(TouchEvent & event) { + // use the event velocity to simulate an impulse + float dMaxImpulse = 1000; + ofVec3f velocityModifier; + + velocityModifier.x = ofxeasing::map_clamp(abs(event.velocitySmoothed.x), 100, maxVelocity, 0, dMaxImpulse, &ofxeasing::exp::easeOut); + if (event.velocitySmoothed.x < 0) { + velocityModifier.x *= -1; + } + velocityModifier.y = ofxeasing::map_clamp(abs(event.velocitySmoothed.y), 100, maxVelocity, 0, dMaxImpulse, &ofxeasing::exp::easeOut); + if (event.velocitySmoothed.y < 0) { + velocityModifier.y *= -1; + } + + ofVec2f newPos = scrollableArea->getPosition() + velocityModifier; + + newPos.x = ofClamp(newPos.x, getWidth() - scrollableArea->getWidth(), 0); + newPos.y = ofClamp(newPos.y, getHeight() - scrollableArea->getHeight(), 0); + + currentVelocity = velocityModifier; + isAutoScroll = true; + + } + + void ScrollableContainer::onTouchMove(TouchEvent & event) { + + // calculate movement frome last event + ofVec3f d = event.position - event.prevPosition; + ofVec3f newPos = scrollableArea->getPosition() + d; + + // clamp the position + newPos.x = ofClamp(newPos.x, getWidth() - scrollableArea->getWidth(),0); + newPos.y = ofClamp(newPos.y, getHeight() - scrollableArea->getHeight(),0); + + scrollableArea->setPosition(newPos); + } + + void ScrollableContainer::onScrollAreaSizeChanged(ofxInterface::Node & n) { + dragArea->setSize(n.getSize()); + } + + ///\brief moves child to scrollable Area + void ScrollableContainer::onChildAdded(ofxInterface::Node & n) { + containerRemoveChild(&n); + scrollableArea->addChild(&n); + ofAddListener(n.eventTouchMove, this, &ScrollableContainer::onTouchMove); + ofAddListener(n.eventTouchUp, this, &ScrollableContainer::onTouchUp); + ofAddListener(n.eventTouchDown, this, &ScrollableContainer::onTouchDown); + } + + Node * ScrollableContainer::containerRemoveChild(Node * child, bool bMaintainChildGlobalTransform) + { + for (int i = 0; i < childNodes.size(); i++) + { + if (childNodes[i] == child) { + return containerRemoveChild(i, bMaintainChildGlobalTransform); + } + } + + ofLogWarning("ofxInterface::Node::removeChild", "are you trying to remove a child that does not exist?"); + return NULL; + } + + Node * ScrollableContainer::containerRemoveChild(int index, bool bMaintainChildGlobalTransform) + { + if (index >= childNodes.size()) { + ofLogWarning("ofxInterface::Node::removeChild", "are you trying to remove a child that does not exist?"); + return NULL; + } + + Node *child = childNodes[index]; + childNodes.erase(childNodes.begin() + index); + child->clearParent(bMaintainChildGlobalTransform); + //ofNotifyEvent(eventChildRemoved, *child, this); + return child; + } + + +} \ No newline at end of file diff --git a/src/components/ScrollableContainer.h b/src/components/ScrollableContainer.h new file mode 100644 index 0000000..b2503bd --- /dev/null +++ b/src/components/ScrollableContainer.h @@ -0,0 +1,70 @@ +#pragma once +#include "Node.h" +#include "ofxFontStash2.h" +#include "ofxAnimatableOfPoint.h" +#include "ofxEasing.h" + +namespace ofxInterface { + + struct ScrollableContainerSettings : NodeSettings{ + ofVec2f sizeScrollableArea; + float plane = 0; // option to set scroll option above elements + + ofColor bgColor = ofColor(0, 0); + ofColor scrollActiveColor = ofColor(255); + ofColor scrollInactiveColor = ofColor(128); + + }; + + class ScrollableContainer : + public Node + { + public: + ScrollableContainer(); + ~ScrollableContainer(); + + virtual void setup(ScrollableContainerSettings s); + + virtual void draw() override; + + Node* getScrollableArea(); + void addChildToScrollableArea(Node* child); + + virtual void onTouchDown(TouchEvent & event); + virtual void onTouchUp(TouchEvent & event); + virtual void onTouchMove(TouchEvent & event); + + void onScrollAreaSizeChanged(ofxInterface::Node & n); + + void onChildAdded(ofxInterface::Node& n); + + protected: + Node* containerRemoveChild(Node *child, bool bMaintainChildGlobalTransform = false); + Node* containerRemoveChild(int index, bool bMaintainChildGlobalTransform = false); + + private: + Node* scrollableArea; + Node* dragArea; + ofVec2f pStartDragCursor; + ofVec2f pStartDrag; + + ofColor bgColor; + ofColor scrollActiveColor; + ofColor scrollInactiveColor; + + /// \brief rollout animation on touch up + ofxAnimatableOfPoint edgeAnimation; + ofVec2f currentVelocity; + ofVec2f finalPoint; + bool animationReady = false; + const float friction = 0.94; + bool isAutoScroll = false; + + /// \brief clamp of velocity animation sliding + const int maxVelocity = 1000; + + /// \brief in s + const float maxAnimationLength = 2.3f; + }; +} + diff --git a/src/components/SimpleChecker.cpp b/src/components/SimpleChecker.cpp new file mode 100644 index 0000000..71fac9a --- /dev/null +++ b/src/components/SimpleChecker.cpp @@ -0,0 +1,60 @@ +#include "SimpleChecker.h" + + +namespace ofxInterface { + SimpleChecker::SimpleChecker() + { + } + + + SimpleChecker::~SimpleChecker() + { + } + + void SimpleChecker::setup(ModalElementSettings s) + { + s.type = CHECKER; + ModalElement::setup(s); + + colorFade.setColor(colorInactive); + colorFade.setDuration(0.10); + + // init shape + float multX = float(getWidth()) / 32; + float multY = float(getHeight()) / 32; + checkerShape.moveTo(2*multX, 6 * multY); + checkerShape.lineTo(0 * multX, 8 * multY); + checkerShape.lineTo(7 * multX, 15 * multY); + checkerShape.lineTo(20 * multX, 2 * multY); + checkerShape.lineTo(18 * multX, 0 * multY); + checkerShape.lineTo(7 * multX, 11 * multY); + checkerShape.lineTo(2 * multX,6 * multY); + + checkerShape.close(); + checkerShape.translate(ofVec2f(6 * multX, 8 * multY)); + checkerShape.setColor(colorSelected); + } + void SimpleChecker::draw() + { + colorFade.update(ofGetLastFrameTime()); + ofSetColor(colorFade.getCurrentColor()); + + ofDrawRectangle(0, 0, getWidth(), getHeight()); + + if (isSelected) { + checkerShape.draw(); + } + + } + + void SimpleChecker::onStateChanged(bool & isActive) + { + if (isActive) { + colorFade.animateTo(colorActive); + } + else { + colorFade.animateTo(colorInactive); + } + } + +} \ No newline at end of file diff --git a/src/components/SimpleChecker.h b/src/components/SimpleChecker.h new file mode 100644 index 0000000..756c51c --- /dev/null +++ b/src/components/SimpleChecker.h @@ -0,0 +1,27 @@ +#pragma once +#include "ModalElement.h" +#include "ofxAnimatable.h" +#include "ofxAnimatableOfColor.h" + +namespace ofxInterface { + + class SimpleChecker : public ModalElement + { + public: + SimpleChecker(); + ~SimpleChecker(); + + void setup(ModalElementSettings s); + virtual void draw(); + + void onStateChanged(bool& isActive); + + protected: + private: + ofxAnimatableOfColor colorFade; + int currentAni = 0; + + ofPath checkerShape; + + }; +} diff --git a/src/components/SoftKeyboard.cpp b/src/components/SoftKeyboard.cpp new file mode 100644 index 0000000..7c7edc4 --- /dev/null +++ b/src/components/SoftKeyboard.cpp @@ -0,0 +1,215 @@ +/* + * SoftKeyboard.cpp + * emptyExample + * + * Created by Brian Eschrich on 23.02.16 + * Copyright 2017 reddo UG. All rights reserved. + * + */ + +#include "SoftKeyboard.h" + +namespace ofxInterface { + void SoftKeyboard::setup(SoftKeyboardSettings s) + { + Node::setup(s); + font = s.font; + style = s.style; + + bgColor = s.bgColor; + colorActive = s.colorActive; + colorInactive = s.colorInactive; + colorSelected = s.colorSelected; + borderRadius = s.borderRadius; + borderWidth = s.borderWidth; + padding = s.padding; + margin = s.margin; + + + + // fixed ratio + setHeight(getWidth() * 19.4 / 51); + + // create keys + wKey = (getWidth() - 2 * (margin + borderWidth) - 10*padding) / 11; + + vector< vector> alphaKeys = { + {'q','w','e','r','t','z','u','i','o','p',252}, + {'a','s','d','f','g','h','j','k','l',246,228}, + { 3680,'y','x','c','v','b','n','m',8}, + { 9997,'@',' ','.',13} + }; + + addSet("alpha", alphaKeys); + + vector< vector> alphaBigKeys = { + {'Q','W','E','R','T','Z','U','I','O','P',220}, + {'A','S','D','F','G','H','J','K','L',214,196}, + { 3680,'Y','X','C','V','B','N','M',8}, + { 9997,'@',' ','.',13} + }; + + addSet("alphaBig", alphaBigKeys); + + vector< vector> numbers = { + {'1','2','3','4','5','6','7','8','9','0','='}, + {'!','#','$','%','&','\'','*','+','-','/','?'}, + {'^','_','`','{','|','}','~','(',')',',',':' }, + { 9996,'@',' ',';',13} + }; + + addSet("numbers", numbers); + + + setActiveKeyset( "alpha"); + + + // draw border + if (borderWidth > 0) { + borderPath.setColor(style.color); + borderPath.setArcResolution(200); + // other path + borderPath.moveTo(borderRadius, 0); + borderPath.lineTo(getWidth() - borderRadius, 0); + borderPath.arc(ofVec2f(getWidth() - borderRadius, borderRadius), borderRadius, borderRadius, 270, 0); + borderPath.lineTo(getWidth(), getHeight() - borderRadius); + borderPath.arc(ofVec2f(getWidth() - borderRadius, getHeight() - borderRadius), borderRadius, borderRadius, 0, 90); + borderPath.lineTo(borderRadius, getHeight()); + borderPath.arc(ofVec2f(borderRadius, getHeight() - borderRadius), borderRadius, borderRadius, 90, 180); + borderPath.lineTo(0, borderRadius); + borderPath.arc(ofVec2f(borderRadius, borderRadius), borderRadius, borderRadius, 180, 270); + // inner path + borderPath.moveTo(borderRadius, borderWidth); + borderPath.lineTo(getWidth() - borderRadius, borderWidth); + borderPath.arc(ofVec2f(getWidth() - borderRadius, borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 270, 0); + borderPath.lineTo(getWidth() - borderWidth, getHeight() - borderRadius); + borderPath.arc(ofVec2f(getWidth() - borderRadius, getHeight() - borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 0, 90); + borderPath.lineTo(borderRadius, getHeight() - borderWidth); + borderPath.arc(ofVec2f(borderRadius, getHeight() - borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 90, 180); + borderPath.lineTo(borderWidth, borderRadius); + borderPath.arc(ofVec2f(borderRadius, borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 180, 270); + borderPath.close(); + } + } + + //------------------------------------------------------------------ + void SoftKeyboard::draw() { + borderPath.draw(); + + } + + void SoftKeyboard::setActiveKeyset(string id) + { + for (auto& keySet : keySets) { + if (keySet.first == id) { + keySet.second->activate(); + activeKeySet = keySet.second; + } + else { + keySet.second->deactivate(); + } + } + } + + void SoftKeyboard::addSet(string keySet, vector> keys) + { + keySets.insert(make_pair(keySet, new Node())); + addChild(keySets[keySet]); + keySets[keySet]->setName(keySet); + + int py = borderWidth + margin; + for (auto& line : keys) { + addLine(keySets[keySet], line, py); + py += wKey + padding; + } + } + + void SoftKeyboard::addLine(Node* keySet, vector keys, vector widthKeys, int y) + { + int wLine = margin* (widthKeys.size()-1); + for (auto& w : widthKeys) { + wLine += wKey * w; + } + + float x = margin + borderWidth; + int i = 0; + for (auto& key : keys) { + float w = widthKeys[i]; + + addKey(keySet, key, x, y, w, wKey); + + x += w + padding; + ++i; + } + } + + void SoftKeyboard::addLine(Node* keySet, vector keys, int y){ + map keyWidths; + keyWidths[' '] = wKey * 5 + padding * 4; + keyWidths['@'] = (3 * wKey + padding) *0.5; + keyWidths[9997] = (3 * wKey + padding) *0.5; // abc + keyWidths[9996] = (3 * wKey + padding) *0.5; // 123 + keyWidths[3680] = wKey * 2 + padding; // shift + keyWidths[8] = wKey * 2 + padding; // backspace + keyWidths[13] = wKey * 2 + padding; // return + + vector widthKeys; + + for (auto key : keys) { + if (keyWidths.find(key) != keyWidths.end()) { + widthKeys.push_back(keyWidths[key]); + }else { + widthKeys.push_back(wKey); + } + } + addLine(keySet, keys, widthKeys, y); + } + + void SoftKeyboard::addKey(Node* keySet, int keyValue, int x, int y, int w, int h){ + + SoftKeyboardKey* key = new SoftKeyboardKey(); + SoftKeyboardKeySettings s; + + s.name = "key_" + ofToString(keyValue); + s.position = ofVec2f(x, y); + s.size = ofVec2f(w, h); + s.borderWidth = borderWidth * 0.25; + s.borderRadius = borderRadius * 0.5; + s.colorActive = colorActive; + s.colorInactive = colorInactive; + s.colorSelected = colorSelected; + s.font = font; + s.key = keyValue; + s.style = style; + + key->setup(s); + + keySet->addChild(key); + + ofAddListener(key->keyPressed, this, &SoftKeyboard::onKeyPressed); + ofAddListener(key->keyReleased, this, &SoftKeyboard::onKeyReleased); + } + + void SoftKeyboard::onKeyPressed(ofKeyEventArgs &event) + { + if (activeKeySet->getName() == "alphaBig") { + setActiveKeyset("alpha"); + } + else if(activeKeySet->getName() == "alpha" && (event.key == 3680 || event.key == 3681)){ + setActiveKeyset("alphaBig"); + } + else if (event.key == 9996) { + setActiveKeyset("alpha"); + } + else if (event.key == 9997) { + setActiveKeyset("numbers"); + } + ofNotifyEvent(keyPressed, event); + } + + void SoftKeyboard::onKeyReleased(ofKeyEventArgs &event) + { + ofNotifyEvent(keyReleased, event); + } + +} \ No newline at end of file diff --git a/src/components/SoftKeyboard.h b/src/components/SoftKeyboard.h new file mode 100644 index 0000000..077e368 --- /dev/null +++ b/src/components/SoftKeyboard.h @@ -0,0 +1,80 @@ +/* + * SoftKeyboard.h + * emptyExample + * + * Created by Brian Eschrich on 23.02.16 + * Copyright 2017 reddo UG. All rights reserved. + * + */ + +#ifndef _SoftKeyboard +#define _SoftKeyboard + +#include "ofMain.h" +#include "SoftKeyboardKey.h" + +namespace ofxInterface { + struct SoftKeyboardSettings : NodeSettings { + shared_ptr font; + ofxFontStash2::Style style; + + ofColor bgColor = ofColor(0, 0); + ofColor colorActive = ofColor(255); + ofColor colorInactive = ofColor(128); + ofColor colorSelected = ofColor(128); + + int borderRadius = 8; + int borderWidth = 4; + int margin = 12; + int padding = 8; + + }; + + +class SoftKeyboard : public Node{ + +public: + virtual void setup(SoftKeyboardSettings s); + virtual void draw(); + + void setActiveKeyset(string id); + + void onKeyPressed(ofKeyEventArgs& event); + void onKeyReleased(ofKeyEventArgs& event); + + ofEvent keyPressed; + ofEvent keyReleased; + +protected: + void addSet(string keySet, vector> keys); + void addLine(Node* keySet, vector keys, vector widthKeys, int y); + void addLine(Node* keySet, vector keys, int y); + void addKey(Node* keySet, int keyValue, int x, int y, int w, int h); + + map keySets; + Node* activeKeySet; + + shared_ptr font; + ofxFontStash2::Style style; + + ofColor bgColor; + ofColor colorActive; + ofColor colorInactive; + ofColor colorSelected; + int borderRadius; + + int wKey; + int margin; + int padding; + int borderWidth; + + ofPath borderPath; + +private: + + + +}; +} + +#endif diff --git a/src/components/SoftKeyboardKey.cpp b/src/components/SoftKeyboardKey.cpp new file mode 100644 index 0000000..4aa7d77 --- /dev/null +++ b/src/components/SoftKeyboardKey.cpp @@ -0,0 +1,277 @@ +/* + * Key.cpp + * emptyExample + * + * Created by Brian Eschrich on 23.02.16 + * Copyright 2017 reddo UG. All rights reserved. + * + */ + +#include "SoftKeyboardKey.h" + +namespace ofxInterface { + void SoftKeyboardKey::setup(SoftKeyboardKeySettings s) + { + // init values + ModalElement::setup(s); + font = s.font; + style = s.style; + key = s.key; + borderRadius = s.borderRadius; + borderWidth = s.borderWidth; + + + // draw paths + if (borderWidth > 0) { + borderPath.setColor(style.color); + borderPath.setArcResolution(200); + // other path + borderPath.moveTo(borderRadius, 0); + borderPath.lineTo(getWidth() - borderRadius, 0); + borderPath.arc(ofVec2f(getWidth() - borderRadius, borderRadius), borderRadius, borderRadius, 270, 0); + borderPath.lineTo(getWidth(),getHeight()-borderRadius); + borderPath.arc(ofVec2f(getWidth() - borderRadius, getHeight() - borderRadius), borderRadius, borderRadius, 0, 90); + borderPath.lineTo(borderRadius, getHeight()); + borderPath.arc(ofVec2f(borderRadius, getHeight() - borderRadius), borderRadius, borderRadius, 90, 180); + borderPath.lineTo(0, borderRadius); + borderPath.arc(ofVec2f(borderRadius, borderRadius), borderRadius, borderRadius, 180, 270); + // inner path + borderPath.moveTo(borderRadius, borderWidth); + borderPath.lineTo(getWidth() - borderRadius, borderWidth); + borderPath.arc(ofVec2f(getWidth() - borderRadius, borderRadius), borderRadius - borderWidth, borderRadius -borderWidth, 270, 0); + borderPath.lineTo(getWidth() - borderWidth, getHeight() - borderRadius); + borderPath.arc(ofVec2f(getWidth() - borderRadius, getHeight() - borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 0, 90); + borderPath.lineTo(borderRadius, getHeight() - borderWidth); + borderPath.arc(ofVec2f(borderRadius, getHeight() - borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 90, 180); + borderPath.lineTo(borderWidth, borderRadius); + borderPath.arc(ofVec2f(borderRadius, borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 180, 270); + borderPath.close(); + } + + // background + if (!(colorInactive.a == 0 && colorActive.a == 0 && colorSelected.a == 0)) { + fillPath.setUseShapeColor(false); + fillPath.setArcResolution(200); + fillPath.moveTo(borderRadius, borderWidth); + fillPath.lineTo(getWidth() - borderRadius, borderWidth); + fillPath.arc(ofVec2f(getWidth() - borderRadius, borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 270, 0); + fillPath.lineTo(getWidth() - borderWidth, getHeight() - borderRadius); + fillPath.arc(ofVec2f(getWidth() - borderRadius, getHeight() - borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 0, 90); + fillPath.lineTo(borderRadius, getHeight() - borderWidth); + fillPath.arc(ofVec2f(borderRadius, getHeight() - borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 90, 180); + fillPath.lineTo(borderWidth, borderRadius); + fillPath.arc(ofVec2f(borderRadius, borderRadius), borderRadius - borderWidth, borderRadius - borderWidth, 180, 270); + fillPath.close(); + } + + generateText(); + + // listener + ofAddListener(eventTouchDown, this, &SoftKeyboardKey::onTouchDown); + ofAddListener(eventTouchUp, this, &SoftKeyboardKey::onTouchUp); + } + + //------------------------------------------------------------------ + void SoftKeyboardKey::draw() { + + borderPath.draw(); + + if (isSelected) { + ofSetColor(colorSelected); + } + else if(getEnabled()){ + ofSetColor(colorActive); + } + else { + ofSetColor(colorInactive); + } + + fillPath.draw(); + + + //center text + ofRectangle r = font->getTextBounds(text, style,0,0); + // hack to reduce line height to glyph height + r.y += r.height*0.25; + r.height *= 0.6; + + font->draw(text,style, (getWidth()-r.width)/2, 0.5*(getHeight() - r.height) - r.y); + specialKeyPath.draw(specialKeyPos.x, specialKeyPos.y); + + } + + + + void SoftKeyboardKey::onTouchDown(TouchEvent &event) + { + + ofKeyEventArgs out(ofKeyEventArgs::Pressed, key); + + ofNotifyEvent(keyPressed, out); + + + bTouched = true; + } + + void SoftKeyboardKey::onTouchUp(TouchEvent &event) + { + ofKeyEventArgs out(ofKeyEventArgs::Released, key); + ofNotifyEvent(keyReleased, out); + + bTouched = false; + } + void SoftKeyboardKey::generateText() + { + + float glyphHeight = font->getTextBounds("X", style, 0, 0).height*0.6; + float glyphCurveRadius = borderRadius * 0.5; + float glyphStroke = 1.0; + + if (key == 252) { + text = "ü"; + } + else if (key == 220) { + text = "Ü"; + } + else if (key == 228) { + text = "ä"; + } + else if (key == 196) { + text = "Ä"; + } + else if (key == 246) { + text = "ö"; + } + else if (key == 214) { + text = "Ö"; + } + else if (key == 223) { + text = "ß"; + } + else if (key == 8364) { + text = "€"; + } + else if (key == 127) { + text = "b"; + } + else if (key == 13) { + text = "Return"; + } + else if (key == 8) { // backspace + text = ""; + specialKeyPath.setColor(style.color); + specialKeyPath.setArcResolution(50); + // other path + specialKeyPath.moveTo(glyphHeight *24.0/18.0 - glyphCurveRadius, 0); + specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 270, 0); // rightTop + specialKeyPath.lineTo(glyphHeight *24.0 / 18.0, glyphHeight - glyphCurveRadius); + specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 0, 90); // rightBottom + specialKeyPath.lineTo(glyphHeight *9.0 / 18.0, glyphHeight); + specialKeyPath.arc(ofVec2f(glyphHeight *9.0 / 18.0 - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 90, 135); // leftBottom + specialKeyPath.lineTo(glyphCurveRadius * 0.5, 9.0/18.0*glyphHeight + glyphCurveRadius); + specialKeyPath.arc(ofVec2f(glyphCurveRadius, 9.0 / 18.0*glyphHeight), glyphCurveRadius, glyphCurveRadius, 135, 225); // left + specialKeyPath.lineTo(9.0 / 18.0*glyphHeight - 1.924*glyphCurveRadius, glyphCurveRadius * 0.383); + specialKeyPath.arc(ofVec2f(9.0 / 18.0*glyphHeight - glyphCurveRadius, glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 225, 270); // leftTop + specialKeyPath.close(); + + // inner path + specialKeyPath.moveTo(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphStroke); + specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 270, 0); // rightTop + specialKeyPath.lineTo(glyphHeight *24.0 / 18.0 - glyphStroke, glyphHeight - glyphCurveRadius); + specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 0, 90); // rightBottom + specialKeyPath.lineTo(glyphHeight *9.0 / 18.0, glyphHeight - glyphStroke); + specialKeyPath.arc(ofVec2f(glyphHeight *9.0 / 18.0 - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 90, 135); // leftBottom + specialKeyPath.lineTo(glyphCurveRadius * 0.5 + glyphStroke*0.924, 9.0 / 18.0*glyphHeight + glyphCurveRadius); + specialKeyPath.arc(ofVec2f(glyphCurveRadius, 9.0 / 18.0*glyphHeight), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 135, 225); // left + specialKeyPath.lineTo(9.0 / 18.0*glyphHeight - 1.924*glyphCurveRadius, glyphCurveRadius * 0.383 + glyphStroke); + specialKeyPath.arc(ofVec2f(9.0 / 18.0*glyphHeight - glyphCurveRadius, glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 225, 270); // leftTop + specialKeyPath.close(); + + // x + float glyphStrokeD = sqrt(glyphStroke*glyphStroke * 2); + specialKeyPath.moveTo(glyphHeight *15.0 / 18.0 - glyphStrokeD, glyphHeight *9.0 / 18.0); + specialKeyPath.lineTo(glyphHeight *12.0 / 18.0 - glyphStroke * 0.383, glyphHeight *12.0 / 18.0 -glyphStroke * 0.924); + specialKeyPath.arcNegative(ofVec2f(glyphHeight *12.0 / 18.0, glyphHeight *12.0 / 18.0), glyphStroke, glyphStroke, 225, 45); // leftBottom + specialKeyPath.lineTo(glyphHeight *15.0 / 18.0, glyphHeight *9.0 / 18.0 + glyphStrokeD); + specialKeyPath.lineTo(glyphHeight *18.0 / 18.0 - glyphStroke * 0.383, glyphHeight *12.0 / 18.0 + glyphStroke * 0.924); + specialKeyPath.arcNegative(ofVec2f(glyphHeight *18.0 / 18.0, glyphHeight *12.0 / 18.0), glyphStroke, glyphStroke, 135, 315); // rightBottom + specialKeyPath.lineTo(glyphHeight *15.0 / 18.0 + glyphStrokeD, glyphHeight *9.0 / 18.0); + specialKeyPath.lineTo(glyphHeight *18.0 / 18.0 + glyphStroke * 0.383, glyphHeight *6.0 / 18.0 +glyphStroke * 0.924); + specialKeyPath.arcNegative(ofVec2f(glyphHeight *18.0 / 18.0, glyphHeight *6.0 / 18.0), glyphStroke, glyphStroke, 45, 225); // rightTop + specialKeyPath.lineTo(glyphHeight *15.0 / 18.0 , glyphHeight *9.0 / 18.0 - glyphStrokeD); + specialKeyPath.lineTo(glyphHeight *12.0 / 18.0 + glyphStroke * 0.383, glyphHeight *6.0 / 18.0 - glyphStroke * 0.924); + specialKeyPath.arcNegative(ofVec2f(glyphHeight *12.0 / 18.0 , glyphHeight *6.0 / 18.0), glyphStroke, glyphStroke, 315, 135); // leftTop + specialKeyPath.close(); + + float wGlyph = glyphHeight * 12 / 9.0; + specialKeyPos = ofVec2f(0.5*(getWidth() - wGlyph), 0.5*(getHeight() - glyphHeight)); + } + else if (key == 769) { + text = "strg"; + } + else if (key == 770) { + text = "strg"; + } + else if (key == 1281) { + text = "alt"; + } + else if (key == 1282) { + text = "alt"; + } + else if (key == 3680 || key == 3681) {//shift + text = ""; + + specialKeyPath.setColor(style.color); + specialKeyPath.setArcResolution(50); + // other path + specialKeyPath.moveTo(glyphCurveRadius, 11.0/18.0*glyphHeight); + specialKeyPath.lineTo(4.0 / 18.0*glyphHeight, 11.0 / 18.0*glyphHeight); + specialKeyPath.lineTo(4.0 / 18.0*glyphHeight, glyphHeight - glyphCurveRadius); + specialKeyPath.arcNegative(ofVec2f(4.0 / 18.0*glyphHeight + glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 180, 90); + specialKeyPath.lineTo(16.0 / 18.0*glyphHeight - glyphCurveRadius, glyphHeight); + specialKeyPath.arcNegative(ofVec2f(16.0 / 18.0*glyphHeight - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 90, 0); + specialKeyPath.lineTo(16.0 / 18.0*glyphHeight, 11.0 / 18.0*glyphHeight); + specialKeyPath.lineTo(20.0 / 18.0*glyphHeight - glyphCurveRadius, 11.0 / 18.0*glyphHeight); + specialKeyPath.arcNegative(ofVec2f(20.0 / 18.0*glyphHeight - glyphCurveRadius, 11.0 / 18.0*glyphHeight - glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 90, 315); // right + specialKeyPath.lineTo(10.0 / 18.0*glyphHeight + glyphCurveRadius*1.5, glyphCurveRadius); + specialKeyPath.arcNegative(ofVec2f(10.0 / 18.0*glyphHeight, glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 315, 225); // top + specialKeyPath.lineTo((1.0 - 0.383)*glyphCurveRadius, 11.0 / 18.0*glyphHeight - glyphCurveRadius * 1.924); + specialKeyPath.arcNegative(ofVec2f(glyphCurveRadius, 11.0 / 18.0*glyphHeight - glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 225, 90); // left + + // inner path + specialKeyPath.moveTo(glyphCurveRadius, 11.0 / 18.0*glyphHeight - glyphStroke); + specialKeyPath.lineTo(4.0 / 18.0*glyphHeight + glyphStroke, 11.0 / 18.0*glyphHeight- glyphStroke); + specialKeyPath.lineTo(4.0 / 18.0*glyphHeight + glyphStroke, glyphHeight - glyphCurveRadius); + specialKeyPath.arcNegative(ofVec2f(4.0 / 18.0*glyphHeight + glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius- glyphStroke, glyphCurveRadius - glyphStroke, 180, 90); + specialKeyPath.lineTo(16.0 / 18.0*glyphHeight - glyphCurveRadius, glyphHeight - glyphStroke); + specialKeyPath.arcNegative(ofVec2f(16.0 / 18.0*glyphHeight - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 90, 0); + specialKeyPath.lineTo(16.0 / 18.0*glyphHeight - glyphStroke, 11.0 / 18.0*glyphHeight - glyphStroke); + specialKeyPath.lineTo(20.0 / 18.0*glyphHeight - glyphCurveRadius, 11.0 / 18.0*glyphHeight - glyphStroke); + specialKeyPath.arcNegative(ofVec2f(20.0 / 18.0*glyphHeight - glyphCurveRadius, 11.0 / 18.0*glyphHeight - glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 90, 315); // right + specialKeyPath.lineTo(10.0 / 18.0*glyphHeight + glyphCurveRadius * 1.5 - glyphStroke, glyphCurveRadius); + specialKeyPath.arcNegative(ofVec2f(10.0 / 18.0*glyphHeight, glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 315, 225); // top + specialKeyPath.lineTo((1.0 - 0.383)*glyphCurveRadius + glyphStroke, 11.0 / 18.0*glyphHeight - glyphCurveRadius * 1.924); + specialKeyPath.arcNegative(ofVec2f(glyphCurveRadius, 11.0 / 18.0*glyphHeight - glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 225, 90); // left + borderPath.close(); + + float wGlyph = glyphHeight * 10 / 9.0; + specialKeyPos = ofVec2f(0.5*(getWidth() - wGlyph), 0.5*(getHeight() - glyphHeight)); + + } + else if (key == 356) { //left + text = "<-"; + } + else if (key == 358) { //right + text = "->"; + } + else if (key == 9997) { //switch keypad + text = "123"; + } + else if (key == 9996) { //switch keys + text = "abc"; + } + else { + text += key; + } + } +} diff --git a/src/components/SoftKeyboardKey.h b/src/components/SoftKeyboardKey.h new file mode 100644 index 0000000..231b6a4 --- /dev/null +++ b/src/components/SoftKeyboardKey.h @@ -0,0 +1,64 @@ +/* + * Key.h + * emptyExample + * + * Created by Brian Eschrich on 23.02.16 + * Copyright 2017 reddo UG. All rights reserved. + * + */ + +#ifndef _SoftKeyboardKey +#define _SoftKeyboardKey + +#include "ofMain.h" +#include "ModalElement.h" +#include "ofxFontStash2.h" + +namespace ofxInterface { + struct SoftKeyboardKeySettings : ModalElementSettings { + shared_ptr font; + ofxFontStash2::Style style; + + int key = ' '; + + int borderRadius = 4; + int borderWidth = 1; + + }; + + class SoftKeyboardKey : public ModalElement { + + public: + virtual void setup(SoftKeyboardKeySettings s); + virtual void draw(); + + void onTouchDown(TouchEvent& event); + void onTouchUp(TouchEvent& event); + + ofEvent keyPressed; + ofEvent keyReleased; + + protected: + void generateText(); + + private: + bool bTouched; + + int key; + + int borderRadius; + int borderWidth; + + shared_ptr font; + ofxFontStash2::Style style; + + ofPath borderPath; + ofPath fillPath; + ofPath specialKeyPath; + ofVec2f specialKeyPos; + + string text = ""; + }; +} + +#endif diff --git a/src/components/SolidColorPanel.cpp b/src/components/SolidColorPanel.cpp deleted file mode 100644 index 6d4db0f..0000000 --- a/src/components/SolidColorPanel.cpp +++ /dev/null @@ -1,53 +0,0 @@ -// -// SolidColorPanel.cpp -// ofxInterface -// -// Created by Gal Sasson on 8/13/14. -// -// - -#include "SolidColorPanel.h" - -namespace ofxInterface { - - -void SolidColorPanel::setup(float w, float h) -{ - setSize(w, h); - - bDrawBackground = true; - bDrawBorder = false; - bRounded = false; - roundAngle = 5; -} - -void SolidColorPanel::draw() -{ - if (bDrawBackground) { - ofFill(); - ofSetColor(bgColor); - - if (bRounded) { - ofDrawRectRounded(0, 0, getWidth(), getHeight(), roundAngle); - } - else { - ofDrawRectangle(0, 0, getWidth(), getHeight()); - } - } - - if (bDrawBorder) { - ofNoFill(); - ofSetLineWidth(2); - ofSetColor(strokeColor); - if (bRounded) { - ofDrawRectRounded(0, 0, getWidth(), getHeight(), roundAngle); - } - else { - ofDrawRectangle(0, 0, getWidth(), getHeight()); - } - } -} - - - -} // namespace \ No newline at end of file diff --git a/src/components/SolidColorPanel.h b/src/components/SolidColorPanel.h deleted file mode 100644 index f7cb4dc..0000000 --- a/src/components/SolidColorPanel.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// SolidColorPanel.h -// ofxInterface -// -// Created by Gal Sasson on 8/13/14. -// -// - -#ifndef __ofxInterface__SolidColorPanel__ -#define __ofxInterface__SolidColorPanel__ - -#include -#include "ofMain.h" - -#include "ofxInterface.h" - -namespace ofxInterface { - - -class SolidColorPanel : public ofxInterface::Node -{ -public: - void setup(float w, float h); - - void setBGColor(const ofColor& c) { bgColor = c; } - void setStrokeColor(const ofColor& c) { strokeColor = c; } - void setBackground(bool set) { bDrawBackground = set; } - void setBorder(bool set) { bDrawBorder = set; } - void setRounded(bool set) { bRounded = set; } - void setRoundAngle(float ang) { roundAngle = ang; } - - void draw(); - -private: - bool bDrawBorder; - bool bDrawBackground; - bool bRounded; - float roundAngle; - - ofColor bgColor; - ofColor strokeColor; -}; - -} // namespace - -#endif /* defined(__ofxInterface__SolidColorPanel__) */ diff --git a/src/components/TextField.cpp b/src/components/TextField.cpp new file mode 100644 index 0000000..b93e48e --- /dev/null +++ b/src/components/TextField.cpp @@ -0,0 +1,41 @@ +#include "TextField.h" + + +namespace ofxInterface { + TextField::TextField() :Node() + { + + } + + + TextField::~TextField() + { + } + + void TextField::draw() + { + vector blocks; + ofxFontStash2::Parser::parseText(text, font->getStyles(), "text", blocks); + int y = font->getTextBounds(blocks[0].text,blocks[0].style, 0, 0).height*0.5; + + font->drawFormattedColumn(text, 0, y, getWidth(), alignment); + } + + void TextField::setup(TextFieldSettings s) + { + Node::setup(s); + + font = s.font; + text = s.text; + alignment = s.alignment; + } + + void TextField::setText(string text_) + { + text = text_; + } + + void TextField::setAlignment(ofAlignHorz alignment_) { + alignment = alignment_; + } +} \ No newline at end of file diff --git a/src/components/TextField.h b/src/components/TextField.h new file mode 100644 index 0000000..92ca903 --- /dev/null +++ b/src/components/TextField.h @@ -0,0 +1,31 @@ +#pragma once +#include "Node.h" +#include "ofxFontStash2.h" +#include "ofxFontStashStyle.h" + +namespace ofxInterface { + struct TextFieldSettings : NodeSettings{ + shared_ptr font; + string text; + ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + }; + + class TextField : + public Node + { + public: + TextField(); + ~TextField(); + + virtual void draw(); + virtual void setup(TextFieldSettings s); + void setText(string text); + void setAlignment(ofAlignHorz alignment); + + private: + shared_ptr font; + string text; + ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + }; +} + diff --git a/src/components/TextInput.cpp b/src/components/TextInput.cpp new file mode 100644 index 0000000..efd4485 --- /dev/null +++ b/src/components/TextInput.cpp @@ -0,0 +1,184 @@ +#include "TextInput.h" + + + +void ofxInterface::TextInput::setup(TextInputSettings settings) +{ + settings.type = RADIO; + ModalElement::setup(settings); + descriptionText = settings.descriptionText; + maxChars = settings.maxChars; + + font = settings.font; + style = settings.style; + styleInactive = style; + styleInactive.color = colorInactive; + + // listener + ofAddListener(eventTouchDown, this, &TextInput::onTouchDown); + ofAddListener(eventTouchMove, this, &TextInput::onTouchMove); +} + +void ofxInterface::TextInput::draw() +{ + auto baseRect = font->getTextBounds("X", style, 0, 0); + // draw content + if (content.get().size() == 0) { + font->draw(descriptionText, styleInactive, 0, -baseRect.y); + }else { + font->draw(content, style, 0, -baseRect.y); + } + + // draw index pointer + ofSetColor(colorActive); + auto indexRect = font->getTextBounds(content.get().substr(0, indexPointer), style, 0, 0); + ofDrawRectangle(indexRect.x + indexRect.width, 0, 4, indexRect.height); +} + +void ofxInterface::TextInput::keyPressed(ofKeyEventArgs & e) +{ + if (e.key == 356) { // left + if (indexPointer > 0) { + indexPointer--; + string in = ""; + in += content.toString()[indexPointer - 1]; + if (in == "Ã") indexPointer--; + } + } + if (e.key == 358) { // right + if (indexPointer <= content->size()) { + indexPointer++; + string in = ""; + in += content.toString()[indexPointer]; + if (in == "Ã") indexPointer++; + } + } + if (e.key == 8) { // backspace + if (indexPointer > 0) { + content = content.toString().erase(indexPointer - 1, 1); + indexPointer--; + string in = ""; + in += content.toString()[indexPointer]; + if (in == "Ã") { + indexPointer--; + content = content.toString().erase(indexPointer - 1, 1); + } + } + } + else if (e.key >= 32 && e.key <= 252) { + string in = ""; + //only max characters allowed +if (maxChars == 0 || maxChars > content.get().size()) +{ + // number field only accepts numbers + if (e.key == 252) // ü + { + in += "ü"; + } + else if (e.key == 220) // Ü + { + in += "Ü"; + } + else if (e.key == 246) // ö + { + in += "ö"; + } + else if (e.key == 214) // Ö + { + in += "Ö"; + } + else if (e.key == 228) // ä + { + in += "ä"; + } + else if (e.key == 196) // ä + { + in += "Ä"; + } + else if (e.key == 223) // ß + { + in += "ß"; + } + else if (e.key == 8364) // € + { + in += "€"; + } + else { in += e.key; } + + if (indexPointer < content->size()) { + content = content.toString().insert(indexPointer, in); + } + else { + content += in; + } + indexPointer += in.size(); +} + } + sendContentChanged(content); +} + +string ofxInterface::TextInput::getContent() +{ + return content; +} + +void ofxInterface::TextInput::setContent(string content_) +{ + if (content.toString() != content_) { + content = content_; + indexPointer = content->size(); + sendContentChanged(content); + } +} + +void ofxInterface::TextInput::onSetContent(string & content) +{ + setContent(content); + sendContentChanged(content); +} + +void ofxInterface::TextInput::registerKeyInput(ofEvent& e) +{ + ofAddListener(e, this, &TextInput::keyPressed); +} + +void ofxInterface::TextInput::unregisterKeyInput(ofEvent & e) +{ + ofRemoveListener(e, this, &TextInput::keyPressed); +} + +void ofxInterface::TextInput::onTouchDown(TouchEvent & event) +{ + setIndexPosition(event.position - getPosition()); +} + +void ofxInterface::TextInput::onTouchMove(TouchEvent & event) +{ + setIndexPosition(event.position - getPosition()); +} + +void ofxInterface::TextInput::sendContentChanged(string content) +{ + string send = content; + ofNotifyEvent(contentChangedEvent, send); +} + +void ofxInterface::TextInput::setIndexPosition(ofVec2f touch) +{ + // get corresponding cursor pos + float d = 99999999; + float iNew = 0; + if (font->getTextBounds(content.get(), style, 0, 0).width < touch.x){ + iNew = content.get().size(); + } else { + for (size_t i = 0; i < content.get().size(); i++) { + float p = font->getTextBounds(content.get().substr(0, i), style, 0, 0).width; + if (abs(touch.x - p) < d) { + d = abs(touch.x - p); + iNew = i; + } + } + } + + indexPointer = iNew; +} diff --git a/src/components/TextInput.h b/src/components/TextInput.h new file mode 100644 index 0000000..39f7925 --- /dev/null +++ b/src/components/TextInput.h @@ -0,0 +1,64 @@ +#pragma once + +#include "ModalElement.h" +#include "ofxFontStash2.h" + + +namespace ofxInterface { + struct TextInputSettings : public ModalElementSettings { + shared_ptr font; + ofxFontStash2::Style style; + + int maxChars = 30; + string descriptionText; + }; + + class TextInput : public ModalElement + { + public: + void setup(TextInputSettings settings); + + virtual void draw() override; + virtual void keyPressed(ofKeyEventArgs & e); + string getContent(); + void setContent(string content); + void onSetContent(string& content); + + ofEvent contentChangedEvent; + + void registerKeyInput(ofEvent & e); + void unregisterKeyInput(ofEvent & e); + + template + void addListener(ListenerClass * listener, ListenerMethod method) { + content.addListener(listener, method); + } + + template + void removeListener(ListenerClass * listener, ListenerMethod method) { + content.removeListener(listener, method); + } + + void onTouchDown(TouchEvent& event); + void onTouchMove(TouchEvent& event); + + protected: + void sendContentChanged(string content); + void setIndexPosition(ofVec2f touch); + + shared_ptr font; + ofxFontStash2::Style style; + ofxFontStash2::Style styleInactive; + + ofParameter content; + string descriptionText; + int indexPointer; + + bool isNumberField; + int maxChars; + + private: + + }; + +} \ No newline at end of file diff --git a/src/components/TextureButton.cpp b/src/components/TextureButton.cpp deleted file mode 100644 index 2d7c85f..0000000 --- a/src/components/TextureButton.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// -// TextureButton.cpp -// ofxInterface -// -// Created by Gal Sasson on 7/24/14. -// -// - -#include "TextureButton.h" - -namespace ofxInterface -{ - - -TextureButton::TextureButton() -{ - texture = NULL; -} - -void TextureButton::setup(ofTexture *tex, float x, float y) -{ - texture = tex; - setSize(tex->getWidth(), tex->getHeight()); - - setPosition(x, y, 0); - - setPadding(0, 0, 0, 0); - - bDrawBackground = false; - bDrawBorder = false; - - bgColor = ofColor(255);; - tintColor = ofColor(255); - borderColor = ofColor(0); -} - -void TextureButton::setTexture(ofTexture* tex) -{ - texture = tex; - setSize(tex->getWidth(), tex->getHeight()); -} - -void TextureButton::setPadding(float top, float right, float bottom, float left) -{ - padTop = top; - padRight = right; - padBottom = bottom; - padLeft = left; -} - -void TextureButton::update(float dt) -{ - -} - -void TextureButton::draw() -{ - if (bDrawBackground) { - ofSetColor(bgColor); - ofFill(); - ofDrawRectangle(0, 0, getWidth(), getHeight()); - } - - ofSetColor(tintColor); - if (texture) { - texture->draw(padLeft, padBottom, getWidth()-padLeft-padRight, getHeight()-padTop-padBottom); - } - - if (bDrawBorder) { - ofSetColor(borderColor); - ofNoFill(); - ofDrawRectangle(0, 0, getWidth(), getHeight()); - } -} - -} // namespace diff --git a/src/components/TextureButton.h b/src/components/TextureButton.h deleted file mode 100644 index 08f72da..0000000 --- a/src/components/TextureButton.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// TextureButton.h -// ofxUINode -// -// Created by Gal Sasson on 7/24/14. -// -// - -#ifndef __ofxInterface__TextureButton__ -#define __ofxInterface__TextureButton__ - -#include -#include "ofMain.h" -#include "ofxInterface.h" - -namespace ofxInterface -{ - -class TextureButton : public Node -{ -public: - TextureButton(); - void setup(ofTexture *tex, float x=0, float y=0); - - void setTexture(ofTexture *tex); - - void setBorder(bool draw) { bDrawBorder = draw; } - void setBackground(bool draw) { bDrawBackground = draw; } - - void setTintColor(const ofColor& c) { tintColor = c; } - void setBGColor(const ofColor& c) { bgColor = c; } - void setBorderColor(const ofColor& c) { borderColor = c; } - - void setPadding(float top, float right, float bottom, float left); - - void update(float dt); - void draw(); - - - -private: - - float padTop, padRight, padBottom, padLeft; - - bool bDrawBorder; - bool bDrawBackground; - - ofColor tintColor; - ofColor bgColor; - ofColor borderColor; - - ofTexture* texture; -}; - -} // namespace - -#endif /* defined(__BaseApp__TextureButton__) */ diff --git a/src/components/TextureNode.cpp b/src/components/TextureNode.cpp new file mode 100644 index 0000000..9a1975b --- /dev/null +++ b/src/components/TextureNode.cpp @@ -0,0 +1,137 @@ +#include "TextureNode.h" + + +namespace ofxInterface { + TextureNode::TextureNode():Node() + { + } + + + TextureNode::~TextureNode() + { + } + + void TextureNode::setup(ofTexture& texture) + { + setTexture(texture); + setSize(texture.getWidth(), texture.getHeight()); + } + + void TextureNode::setup(TextureNodeSettings settings) { + Node::setup(settings); + if (settings.size == ofVec2f(0, 0)) { + setup(settings.texture); + } else { + texture = settings.texture; + } + scaleMode = settings.scaleMode; + blendmode = settings.blendmode; + tinting = settings.tinting; + } + + void TextureNode::draw() + { + + + if (texture.isAllocated()) { + + if (hardShadowBlend) { + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + } else { + setBlendMode(blendmode); + } + + if (alpha<255) + { + ofSetColor(255, alpha); + } + + ofRectangle dimensions{ 0,0,getWidth(),getHeight() }; + ofRectangle texCoords{ 0,0,texture.getWidth(),texture.getHeight() }; + + ofRectangle dimensionsT = dimensions; + ofRectangle texCoordst = texCoords; + switch (scaleMode) { + case OF_SCALEMODE_FIT: + texCoordst.scaleTo(dimensionsT, OF_SCALEMODE_FIT); + dimensionsT = texCoordst; + break; + case OF_SCALEMODE_FILL: + dimensionsT.scaleTo(texCoords, OF_SCALEMODE_FIT); + texCoords = dimensionsT; + dimensionsT = dimensions; + break; + case OF_SCALEMODE_CENTER: + break; + case OF_SCALEMODE_STRETCH_TO_FILL: + break; + default: + break; + } + + ofSetColor(tinting); + texture.drawSubsection(dimensions, texCoords); + } + + } + + void TextureNode::setTexture(ofTexture& texture_) + { + texture = texture_; + ofNotifyEvent(eventTextureChanged,texture); + } + + ofTexture TextureNode::getTexture() + { + return texture; + } + + float TextureNode::getAlpha() { + return alpha; + } + + void TextureNode::setAlpha(float alpha_) + { + alpha = alpha_; + } + + void TextureNode::setTinting(ofColor color) + { + tinting = color; + } + + ofScaleMode TextureNode::getScaleMode() { + return scaleMode; + } + + void TextureNode::setScaleMode(ofScaleMode mode) { + scaleMode = mode; + } + + ofColor TextureNode::getTinting() { + return tinting; + } + + bool TextureNode::isHardShadowblend() { + return hardShadowBlend; + } + + void TextureNode::setHardShadowBlend(bool isHardShadowBlend_) { + + hardShadowBlend = isHardShadowBlend_; + } + + void TextureNode::setBlendMode(ofBlendMode blendmode_) { + blendmode = blendmode_; + } + + ofJson TextureNode::getNodeJson() { + auto ret = Node::getNodeJson(); + ret["nodeType"] = "TextureNode"; + ret["tint"] = vector{ tinting.r,tinting.g,tinting.b,tinting.a }; + ret["alpha"] = alpha; + ret["scaleMode"] = "fill"; + return ret; + } + +} \ No newline at end of file diff --git a/src/components/TextureNode.h b/src/components/TextureNode.h new file mode 100644 index 0000000..f908a89 --- /dev/null +++ b/src/components/TextureNode.h @@ -0,0 +1,56 @@ +#pragma once +#include "Node.h" + +namespace ofxInterface { + struct TextureNodeSettings : NodeSettings { + ofTexture texture; + ofColor tinting = ofColor(255); + float alpha = 255; + ofScaleMode scaleMode = OF_SCALEMODE_FILL; + ofBlendMode blendmode = OF_BLENDMODE_ALPHA; + }; + + class TextureNode : + public Node + { + public: + TextureNode(); + ~TextureNode(); + + void setup(ofTexture& texture); + void setup(TextureNodeSettings settings); + + virtual void draw(); + + void setTexture(ofTexture& texture_); + ofTexture getTexture(); + + ofScaleMode getScaleMode(); + void setScaleMode(ofScaleMode mode); + + float getAlpha(); + void setAlpha(float alpha); + + ofColor getTinting(); + void setTinting(ofColor color); + + bool isHardShadowblend(); + void setHardShadowBlend(bool isHardShadowBlend); + void setBlendMode(ofBlendMode blendmode); + + ofEvent eventTextureChanged; + + ofJson getNodeJson() override; + + protected: + ofTexture texture; + float alpha; + + private: + ofColor tinting = ofColor(255); + ofScaleMode scaleMode = OF_SCALEMODE_FILL; + bool hardShadowBlend = false; + ofBlendMode blendmode = OF_BLENDMODE_ALPHA; + }; +} + From ed07e66287674ef0f0a018bff966a4e337e38214 Mon Sep 17 00:00:00 2001 From: Brian Eschrich Date: Wed, 18 Mar 2020 16:05:09 +0100 Subject: [PATCH 5/9] examples and readme --- README.md | 17 +++ addon_config.mk | 72 ++++++++++ components.md | 127 ++++++++++++++++++ components.png | Bin 0 -> 9626 bytes exampleJson/addons.make | 5 + exampleJson/bin/data/.gitkeep | 0 exampleJson/bin/data/assets.json | 18 +++ exampleJson/bin/data/fonts/frabk.ttf | Bin 0 -> 152700 bytes exampleJson/bin/data/fonts/verdana.ttf | Bin 0 -> 171792 bytes exampleJson/bin/data/gui.json | 83 ++++++++++++ exampleJson/bin/data/guiElements.json | 46 +++++++ exampleJson/bin/data/textures/cat1.jpg | Bin 0 -> 55963 bytes exampleJson/src/main.cpp | 13 ++ exampleJson/src/ofApp.cpp | 109 +++++++++++++++ exampleJson/src/ofApp.h | 30 +++++ exampleJsonLiveEdit/addons.make | 7 + exampleJsonLiveEdit/bin/data/.gitkeep | 0 exampleJsonLiveEdit/bin/data/assets.json | 20 +++ exampleJsonLiveEdit/bin/data/fonts/frabk.ttf | Bin 0 -> 152700 bytes .../bin/data/fonts/verdana.ttf | Bin 0 -> 171792 bytes exampleJsonLiveEdit/bin/data/gui.json | 105 +++++++++++++++ exampleJsonLiveEdit/bin/data/guiElements.json | 34 +++++ .../bin/data/textures/cat1.jpg | Bin 0 -> 55963 bytes .../bin/data/textures/cat2.jpg | Bin 0 -> 60590 bytes .../bin/data/textures/cat3.jpg | Bin 0 -> 38095 bytes exampleJsonLiveEdit/src/main.cpp | 13 ++ exampleJsonLiveEdit/src/ofApp.cpp | 111 +++++++++++++++ exampleJsonLiveEdit/src/ofApp.h | 36 +++++ 28 files changed, 846 insertions(+) create mode 100644 addon_config.mk create mode 100644 components.md create mode 100644 components.png create mode 100644 exampleJson/addons.make create mode 100644 exampleJson/bin/data/.gitkeep create mode 100644 exampleJson/bin/data/assets.json create mode 100644 exampleJson/bin/data/fonts/frabk.ttf create mode 100644 exampleJson/bin/data/fonts/verdana.ttf create mode 100644 exampleJson/bin/data/gui.json create mode 100644 exampleJson/bin/data/guiElements.json create mode 100644 exampleJson/bin/data/textures/cat1.jpg create mode 100644 exampleJson/src/main.cpp create mode 100644 exampleJson/src/ofApp.cpp create mode 100644 exampleJson/src/ofApp.h create mode 100644 exampleJsonLiveEdit/addons.make create mode 100644 exampleJsonLiveEdit/bin/data/.gitkeep create mode 100644 exampleJsonLiveEdit/bin/data/assets.json create mode 100644 exampleJsonLiveEdit/bin/data/fonts/frabk.ttf create mode 100644 exampleJsonLiveEdit/bin/data/fonts/verdana.ttf create mode 100644 exampleJsonLiveEdit/bin/data/gui.json create mode 100644 exampleJsonLiveEdit/bin/data/guiElements.json create mode 100644 exampleJsonLiveEdit/bin/data/textures/cat1.jpg create mode 100644 exampleJsonLiveEdit/bin/data/textures/cat2.jpg create mode 100644 exampleJsonLiveEdit/bin/data/textures/cat3.jpg create mode 100644 exampleJsonLiveEdit/src/main.cpp create mode 100644 exampleJsonLiveEdit/src/ofApp.cpp create mode 100644 exampleJsonLiveEdit/src/ofApp.h diff --git a/README.md b/README.md index 87dab56..2aa1dbf 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,20 @@ [![Build Status](https://travis-ci.org/local-projects/ofxInterface.svg?branch=master)](https://travis-ci.org/local-projects/ofxInterface) [![Build status](https://ci.appveyor.com/api/projects/status/u1m369pj4mmr8xvu?svg=true)](https://ci.appveyor.com/project/armadillu/ofxinterface) flexible and lightweight GUI helper with a scene-graph and a multitouch manager for OpenFrameworks + +Compatible with openFrameworks 0.11.0+ + +Generate all project files using the openFrameworks Project Generator. + +## Features + +* tool to create a touch focused interface +* includes standard components like button and keyboard (see [definitions](https://github.com/brinoausrino/ofxInterface/blob/master/components.md)) +* create a GUI from json + +## Required Addons + +* [ofxAnimatable](https://github.com/armadillu/ofxAnimatable) +* [ofxAssetManager](https://github.com/brinoausrino/ofxAssetManager) +* [ofxEasing](https://github.com/arturoc/ofxEasing) +* [ofxFontStash2](https://github.com/armadillu/ofxFontStash2) diff --git a/addon_config.mk b/addon_config.mk new file mode 100644 index 0000000..9cdd6f2 --- /dev/null +++ b/addon_config.mk @@ -0,0 +1,72 @@ +# All variables and this file are optional, if they are not present the PG and the +# makefiles will try to parse the correct values from the file system. +# +# Variables that specify exclusions can use % as a wildcard to specify that anything in +# that position will match. A partial path can also be specified to, for example, exclude +# a whole folder from the parsed paths from the file system +# +# Variables can be specified using = or += +# = will clear the contents of that variable both specified from the file or the ones parsed +# from the file system +# += will add the values to the previous ones in the file or the ones parsed from the file +# system +# +# The PG can be used to detect errors in this file, just create a new project with this addon +# and the PG will write to the console the kind of error and in which line it is + +meta: + ADDON_NAME = ofxInterface + ADDON_DESCRIPTION = flexible and lightweight GUI helper with a scene-graph and a multitouch manager + ADDON_AUTHOR = galsasson, armadillu, brinoausrino + ADDON_TAGS = "sceneManager" "gui" "multitouch" + ADDON_URL = https://github.com/brinoausrino/ofxInterface + +common: + # dependencies with other addons, a list of them separated by spaces + # or use += in several lines + ADDON_DEPENDENCIES = ofxAnimatable + ADDON_DEPENDENCIES += ofxAssetManager + ADDON_DEPENDENCIES += ofxEasing + ADDON_DEPENDENCIES += ofxFontStash2 + + # include search paths, this will be usually parsed from the file system + # but if the addon or addon libraries need special search paths they can be + # specified here separated by spaces or one per line using += + # ADDON_INCLUDES += + + # any special flag that should be passed to the compiler when using this + # addon + # ADDON_CFLAGS + + # any special flag that should be passed to the linker when using this + # addon, also used for system libraries with -lname + # ADDON_LDFLAGS = + + # linux only, any library that should be included in the project using + # pkg-config + # ADDON_PKG_CONFIG_LIBRARIES = + + # osx/iOS only, any framework that should be included in the project + # ADDON_FRAMEWORKS = + + # source files, these will be usually parsed from the file system looking + # in the src folders in libs and the root of the addon. if your addon needs + # to include files in different places or a different set of files per platform + # they can be specified here + # ADDON_SOURCES = + + # some addons need resources to be copied to the bin/data folder of the project + # specify here any files that need to be copied, you can use wildcards like * and ? + # ADDON_DATA = + + # when parsing the file system looking for libraries exclude this for all or + # a specific platform + # ADDON_LIBS_EXCLUDE = + + +linux64: +linux: +linuxarmv6l: +linuxarmv7l: +android/armeabi: +android/armeabi-v7a: diff --git a/components.md b/components.md new file mode 100644 index 0000000..821705d --- /dev/null +++ b/components.md @@ -0,0 +1,127 @@ +# ofxInterface - components + +![the components](components.png "Interface base components") + +## Properties + +### Node + +The base element. + +| property | type | description | +| ------------- |---------------| -----| +| id | string | unique identifier (should always be set) | +| position | ofVec2f | position in px| +| size | ofVec2f | size in px | +| plane | float | the bigger the more in front (default 10) | +| renderClip | bool | clip element parts out of element size | +| active | bool | set element visible and enabled | + +### ModalElement + +Element that describes buttons, checkers and radios. + +Inherits from Node. + +| property | type | description | +| ------------- |---------------| -----| +| type | string | ether "button","checker" or "radio" | +| colorActive | ofColor | color for activated state| +| colorInactive | ofColor | color for inactive state| +| colorSelected | ofColor | color for selected state| + +### TextInput + +An editable Text. + +Inherits from ModalElement. + +| property | type | description | +| ------------- |---------------| -----| +| font | string | id of the font | +| maxChars | int | maximum length of input| +| description | string | text when line empty| + +### SimpleChecker + +A simple checkbox ;) - + +Inherits from ModalElement. + +### ColorPanel + +A colored panel + +Inherits from Node. + +| property | type | description | +| ------------- |---------------| -----| +| strokeWidth | float | stroke width | +| borderRadius | float | border radius | +| color | ofColor | panel color | +| strokeColor | ofColor | border color | + +### TextureNode + +A Node that displays a texture + +Inherits from Node. + +| property | type | description | +| ------------- |---------------| -----| +| texture | string | texture id | +| tint | string | texture tinting (color id is set)| +| blendmode | string | "alpha","none","add","multiply","screen" and "subract" allowed | +| strokeColor | ofColor | border color | + +### Label + +A short text + +Inherits from Node. + +| property | type | description | +| ------------- |---------------| -----| +| font | string | id of the font | +| text | string | text to be drawn| +| alignment | string | "left","center" or "right"| +| shadow | object | activate dropshadow| + +#### shadow parameters +| property | type | description | +| ------------- |---------------| -----| +| size | float | shadow size (bigger is blurrier)| +| x | float | x-offset| +| y | float | y-offset| +| color | ofColor | shadow color | + +### ScrollableContainer + +A container to contain elements bigger than screen size. + +Inherits from Node. + +| property | type | description | +| ------------- |---------------| -----| +| sizeScrollableArea | ofVec2f | the scrollable area size | +| bgColor | ofColor | background color| +| scrollActiveColor | ofColor | scrollbar color when selected| +| scrollInactiveColor | ofColor | scrollbar color when not selected| + +### SoftKeyboard + +An on-screen keyboard. + +Inherits from Node. Height of Element depends on width and is automatically set. + +| property | type | description | +| ------------- |---------------| -----| +| font | string | id of the font | +| bgColor | ofColor | background color| +| colorActive | ofColor | key background color when enabled| +| colorInactive | ofColor | key background color when disabled| +| colorSelected | ofColor | key background color when selected| +| borderRadius | float | border radius (also effects keys)| +| borderWidth | float | border width (also effects keys)| +| margin | float | space between border and keys| +| padding | float | space between keys| \ No newline at end of file diff --git a/components.png b/components.png new file mode 100644 index 0000000000000000000000000000000000000000..af5902dd2d241fbe33941e6b4ae6041e716060ed GIT binary patch literal 9626 zcmeHsc~p~Gw(o~gv=ybxQV|5Hws9y2%m9I)jA06pfJ_NEV8}p1NCJT{hd^0KDIzL` zC?H^2q9rPV${-T3C_un~7Aix8XdwbZ2r>l-kb5Fl-+p(!_t#r@z4!VxiM`Jf7dR&+)?VX%Z40jjvC7MVYFPzEcERi9Q#^%PR>IIYounUz*4&ss7fIIVx z!Vw(1(1_qz1U-gn!gnLv9b%)LmiTbUY}yhNFB&s~whv%Zb20Vh1X4o7qZ~Zoz4P58>L; zfLej!;h`=ZGbS#A7t3*BA^7+p3Y_8^W6CiLC*dicv2Ikr&(niJiw=u+Biqybkm2rr za9>1_iyK&Ag!_=OY&h56F`UNr!?F&s$ry77TzFIz6HdY7OwEEL*cf;)I@TQFf{Z*A z>CXo5PEI&npe=kI zpnIupU?6=9OS54*(9&G7H z;&?n>splE(oD=Qs?Rz(+PAIi=lJH8ssyk9eCtLAEfFUGS1p;sA$Ch*o{iO-(t@GQ$ zdAtkM$GQx|b~G$!+BEWTO-)JB8W}>r6l)leSVdnVH~0OaJbymj6oxB3Vtk*p*LQ0T zGhlf2Vwvt{&cc78jn3QylP%227X!+QTkdK-s7VRU*PjDuO~0V6T5Po`Ua%MD2&Tl? zxWmc=Fahj$xx#Ax`c)-d1VuHeO|-xMk4H7ogI{!=OL?@nrGkg$`+!Epx@nf9R`Vho zp0GjZ?OoEpToCAW@{w=bT&PGV&+qyzM-L9 z=>c_qErx7t0YPhBiuS}G^{EHrXP&m*End{rbc+zmz9qacqH)dpaM8R!fss#B?A<};hUgcZeV}T zeaMCkWc-^2bpbgh`A?UN`Kf4-&PXDe2 zK{ki7H6Uo03kpy;0Mq{W5$^~@=kyN_GWvsV+_+KsQO`O@%!`eU{W?XnHVGhc`%R@Y znYrv33aZ@!JbG%dSnJuq#6*6YDNN7~-#gvb+S)2ih=_=IH$5E&YG%3WJE(&HnKD&T zA9%i>clmuF3ZCEA#yx<+_}HDiBIvztE8{?3@St_K0ni6TR_PZB0#0 zgY1RHhP%d->9Ds6AOPL$mAFM-<+H#N(zov$PtPsx{`Jv!HEhk3hlSUnM5QYVf`3&f zpJ@ZIh|BH$pYS&3m3p z)Mc|_G20_f5?Erc%6`$=H!p%}P5!U(&#vLA;SQzMawxIdf~&a{L?D(9KVeG^nvPmn zS+({xriaJJKbB+3>0e4u+ba!fq7lz#TrN}{sF@XWrv;n!e^4zdYLr&rAMh#Ejb51J zZ?%fQq_h9n`*(FIn^eD=Bv0m93q^A5Tj;4qjj~5Rp2m&;yHF{SP78L8bY%r3T<+&p z%Ihk;XxT}9eSHVxruX8;N4ikS#}8%O#oqnv`KKB^K1p1#WA;^XLS}$!4xrYb9?7bi zr-`QSaQm%Qvuz^n{?;EEnsdv>`dhMa7qa#T>|UPw`-b1clYg*Z=bWHYN(XdmW*io0 z+k_u_qNIF&!M*)8^GNyQ34+!9Se++vrHcuSth-m6e;!!<)hYe454UR7!i;)4 zl8+eN9PUfEZdId*pBuU{+ZrYE`tY&#eNGbjzizT=dzJKPu4tJM2+c53gKIfra48-Y z8Xup#QhV$B7uTHB^|M!~T9{BJjJ-{&uUUovn0#4||Cx>q2e^5$Qiz4k4mNSjki|22+=YI&YR{G^x39_}V=iyRiuVQ?1sC`1F zEu5(nX;1iO7X7dx$%yCiqKH^r_Q-B>>1k2!yl(R~-2w%8g3S*)S$8YQZ+_uzJiqOn z{kp-Y8mIINbltrH_yO^sMB06X%)=V{<^YA$ zI_LM07~(QCSKk}Vc&cH5`Q|*#1orq-)6RT`W?}13?%P&Iya%d1*BU!XFMv|5PU$~C z4_lA1LDg=_j~~Y+jA!JJDB+{tl^dV`FNwdIoyb?^YFo`5m!>??c&@eK_=}zAVHP|a zz+9ZDe=cJ9iMw#FU0~R7Wp`G5#+5Jn06`bBF}oC}_pC$eGyw%aOD^z2tn5D)R&V=Z zn;PsAm)#!<-t4(+{`82ET5q*hiG+InALHsbuDqP8#{bzs&wsgef>&Je$2Z~U_0N4# z)?#D0$LL0)KGpaFP;1FH5gG$s9p;T{iwth$gTVmqz{s2lg{GUEp1~FRXyw zUugY!y!1~O0Ihz~-Svd}4>JJ_D39-&2w&WxR)=1&{GUy=UTpK19S8n267YX^(t5YZ zKUD%IF@bIW{~W-&0$uY12ZpuP7nq6J_#2H^^72OKb7d1#k{2&tv?{w^^UqH0(C?<^ zw+&pQ+>>=G2=4CO{!5MHp;rdF2RgOW`*z5q7#}8L2n0f8tedqNcpl%KtiW#WI4VP} z+_`h-wFy=U=?KfRW+bfclip$BoJ5-$!eynoa*S8jDaLj@q?E`iLbBVd&dPj-Gw@{w z?N!b1u3pi(n|&i;?a**)q!3WuqQtzKsOR_itebwVHJR~~;CxFzugLZh2L+FRf>LpUcKzRg*o+&C33ZAn^OJQ0oyqjK7jJL*@g0sl(}YJ_{n9wv zvGST+PpMoh?YwsF+5~0Dx?1m;>0tiE;NakV*}G5W>BF%5@{E?h;iq3eI%PV&)fik~ z?6^Q!dQgD9mg3c7++Nsl-VN0(ux|5D)@6z5{dWYT=sm-{*sRp%s~_GLh6HOyUT&`w z=>L%`I*Vm!Zc43h)~hD%E%R4oh$n_i!$iTTd(1n7Yc4L%c2he0=i!mZm>m^4kv;k$ z{xuTJOVJ1FeD1-=($1I!b7SJ=_Np^7{L7t^GehXh)xolo(dw;MoGs;oV-+rW=%Yi! zQt5O8@ciWAZz%Gk2U>y0Fcucwv+*xJP01vQJL4=PoClKG;}1AT2c<=Pxje9BGkf{#>L{7sE3;W5CO|8l8!aiD zAdib{3*8+%Hm1r79(+w3NvM0`(opquG0kwRdzGBMy7hHu$!MM0xnm1&Cb#b38tb0j zI4C(IE^9+wEW)?FvPu{!V{{Mw zc+bQG$}8daUj%pAlg@trZsc3x6LfspRISJHg3+)M?QgnT2 zu4Tt7q7J8IpU5c%y3z^Sja2~$*6|4ejaN-z3v<%Eo5kU@<5^+7*L6E-cRE36Uc9b+ zt(6P@(vPyDM-3jG+5;nA`I1vvX+vejeIURD!J5V`?S+aeYY|^;lb>8xIjE|}ixKlS zJg>5{U$ADccILdUkUZ$1A2)|L)k|O3{36xue5gA(B_&tg)*VbIN1uuq`8usCa#x06 zu(Zi?-n(F*UIXFB`&~J%rv*A9V|CGxx*zbB-B>B>GZWm1ndxao-x&VWDKxPSH-w+!^5?PX1RgvAIa8{0 z)8HJl`k&7+o6Y9+et*gQA1D8PxcTq5KsLP=En}y^J9j+(atzIYNs`$`Mo{f?!KZqi znBhC+nHkpA7>%o|Dsx)QUJsr>lars!h`k-*}%`1(9y`W#R z-7;p}DBaMSaN%IWd?%PR0+aod#1+RLN1r!}`SeF}5zGb$_BAt$S5F=>fOdl>hDY<* zEpXw}DA)#wuLJHz;Jn4HS%~aSP|6-py*|80CHn|@oT5XCNGsL+#Qc!E(7y{bZIbf^ zi?ahtEAPYupq)_gfUU|WX%s$Py~>7}txmYn|I1z_`4$#?*8^v;V;}&BT-2$lWF| zqXr#+I?M)p9?s6zSl_p1-+hgOtIn6uV(8STR%j^c69EKxwemT`4a*R$Z|ssz)nCuRJ3oV@3jIiWxO z1bA6L_&nU#yDa%g0K80r=UrX3WweN``C1lKLb^S2P4I?cRm3n$ghS@ZO>XIm9j%zy<-LvKxy#mo3#tw5BfVfU>+ zS+5{HvD_=_b`RSRUR|A@D+vrMAyF%jfSb(Aghw?)Uh^gHlS-l70uAiHCA?HjOpG)b zNRU#>AExV~mq|v3chvYt+?@Shpbm7k-B_9@C1Wh3>S54r`>Ig4LNpyW*TL3Ar{N`9 zw_BRZh+sI;De9mVur(XTE13b=8Wjd#TvS3o-X1lsbU&67fYBXgb?ku+Tlu`!Is>}D z7}aif){Ir}Z<$FYYAr=co0YTZzQ-JCmMKjAzAeDuqcEXMWC9C405YrL>ZZR8Cj=F! z9^sVC2@o7H8r`a2$N1SvWb6xR`NAVt)k7n3?Tn~fUZn`o)!XwC9JLx6=p#{@4Lszu zoH`NkwccV}yGWuMRbVb&Z8__Og38tT2Rw6cRM|t3V&$oKsZ$w4iwQ)g=3HZ$L*H2O z8?DsG*!ca5DbuT<6?amu00Q52o;hl|xdq3a*?0x7vW8JGN6O`kBKD?}$qQpyXB(%l z>n2K;l9?Mav8GTV7G)>ppzBL2T~n+?p;@2n#JjX_H|1t)T&Ob)sBryKEWDVS6Ro-KHWf8!5oJf_Ebj&VgWm*Y5at{{f%Qybu5Y literal 0 HcmV?d00001 diff --git a/exampleJson/addons.make b/exampleJson/addons.make new file mode 100644 index 0000000..a004113 --- /dev/null +++ b/exampleJson/addons.make @@ -0,0 +1,5 @@ +ofxAnimatable +ofxAssetManager +ofxEasing +ofxFontStash2 +ofxInterface diff --git a/exampleJson/bin/data/.gitkeep b/exampleJson/bin/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/exampleJson/bin/data/assets.json b/exampleJson/bin/data/assets.json new file mode 100644 index 0000000..c29a992 --- /dev/null +++ b/exampleJson/bin/data/assets.json @@ -0,0 +1,18 @@ +{ + "textures":{ + "folder":"textures", + "info":"files [[id,path]]", + "files":[ + ["cat1","cat1.jpg"] + ] + }, + "fonts":{ + "folder":"fonts", + "info":"files [[id,path]]", + "files":[ + ["Verdana","verdana.ttf"], + ["Franklin Gothic","frabk.ttf"] + ] + } + +} \ No newline at end of file diff --git a/exampleJson/bin/data/fonts/frabk.ttf b/exampleJson/bin/data/fonts/frabk.ttf new file mode 100644 index 0000000000000000000000000000000000000000..21c4ecfc553e9fa94ac0c01368ff657f48493ca1 GIT binary patch literal 152700 zcmd432V7Lw7cRQ@IcIudhN<*{5iEl;Fye?39TiX#yI@N&BA{ZdfIUV;K}BOn#l&c0 zY%z)0YZ7}&F`C4vu^W?^LSjsha^`*e45;~+cklh(`|j_}FzfVl_Fj9HZ>_x!gc3qb zAOdlx^~vlUu_WbtLTD->mV;fh`gB>yUrr*#`X?dW${u|Zk_tW^o zdDgdt6WH@x4aW{WQT%{yJdZRQKB{EWlg-5D*#3bKb4GLjUK z68ze+uiNp@`w0eX@$~AC3#Qf#`smZGsw4dRwPl8n-DRB5T}C%^2L9wi@8u;;uBRRd zeXH#6VFtJEVLK^@=Hw9VXX zO->B4@5stNo;ExE$+kycxcKRXQ>7IzUex|OjlXLm zBhB4DTe(Q_Zej6^y+gVuMxJ|cTKoO9Men`6vvaQ>#+=Dd=02Y`Og8b>!b`m_++PuL zu-%1;Gfs56dhhD>_t(vw_d$olPsDWTvLS@yAy$t!55vNvUAqp}j2|)gwTgH0Cmr3G zG``6AMjU4w?C$zymzE*>dOz9AUMlu!KJ|R!{Nn}H9Xcf3dpmE+o#JZCqR^-*^E#Ye z(B|w%ty`v@9slQdCh>^6lg8lD>}KD?7CG=E>I2T>N8c>-b2? z79dG8UP+8{M+D@?`cOQwipCe0IJy^aN0Yp! zDPBjztpdU;$ze)jVq&X*%3-SpIh?V*p?&`@`1L*0nEqSOGTdo_COt86;=~pcpf<%& zn-+OvMkT=o zrr3toJF@;GBRX|(^y!xfC69T0Aed;E(IA5TYOah@^4ZEe!0Ki-^f>hMEI!cpG`OTIQXU%0&6kQM8+^L z{m~ygg0_D=K|OYkGk4$YkB(f~erD`8`Ikes|7KL*=~8rh_I9u8M4xzB)2f%=o8QHr zB#V=6eKWr0%%0t!eA2ye$of|}OL^pXuFm7Cf9w-_O_$#5qhFKO|Mc}M4}SjO&r3;5 z*G&A~eQ#g+lHM2AW~O}i%}&dLBMUuW&wX*(;OYUdaea*)|BU_N8{=t3+0Os5J;-N|lG!+9LF zHXdG5GPbx)Lc;%Gd?jldVG@*XIi-G%61RpuAxIE-PJZa|v4YYtJ%9eY)xRuT+-Y6( z{>#5q{4%w_FnNys@9j^GZ2zGmdeDWV$sa78^J}k8waqujzdG*Z$z6P6?6;?l_ZwL% zi*H@(dbIQX@nzab(zf>dja5Ac56!FSl7Fp9Skc?h_FrJUeTbV^n7t>YNy{zvtw}vU zdpb4!SJ(WkjJY44+VuMR_4W^oyT{2&+-2%D_$dQ=ZWw=W!JnJ%e>ck5dxg2`se)(z zrN#d@tTh}4RJ0|&4;@CLyJg}-hfzjz{y+CxiT|e*x}7_fDYV9voK`rjumo;0GtJRy zWNvY>!{cb~=vJ6lG^QAi^O5)Ln>(^FKewcC%xK4iq(qHd#jcl|xa>ZOCbyAoC{5~q zxy8d_7fZ&BPBggnY^TDc=v|OMYRu^T#7K8I+ryhJk8a-yMrTZsblZmGn*Va#J!AFb zqb|A2c`)#^nY%on`K|w5d39XtA#ZNUUQ%`7NblD|U#;7cmholq70*k#=e8dl=F_J3 zoVa&~{>ObAgNoC#cl~&*(Vsh3$K3w2|FSj1`Y22EXOey?E{zSle&BEOp~fXgqZS&^ zZ91my(mZE-O1oCRrEkr@a&|zk&7+PfdzH9GZ_Y7{e$Ym>>HD@bd*yWB!cl%*nPQ;3 zOwm{33{;JCKdxl5weA_q(ESK1%$N@!Uuu}T{Pwv{b;DQw()z>EZSQHyUd{WzAjM_> z4!xpTs{~jD!R9u*88CbV1+6@%C?#M!PEiYTH?tOia6+rc&QY^V%LFHON3CsI`afln zI`!=HY8k(GMj5{|Yj|O?Bd?&Sq;P0qUT#T&qfqihOehM9nL8>f7+O$NFgmXw-jO>x z-%(gn>=<8+(~2F%B}IjKB_k)Ri^mTcQIJ>SC>ay)C>dVx(8W4BJ-jcI+nzrlhob$b`V{9F7hnM>=}5 zGm7Eiive5;@>@7MrT5P2kl9_`uS4(N9lB>_ruT8AW%lXRwL@mN^fX6@?rDz!nXZ}L zGJ#`SsM*=wGrM`eb)} zGQCrlBdZ6yMBO*NcP8Sz?vI_H*`vFoXYUT3vNAiR<2u}+TYC4b77pnVnSJ_X<9Ut_ z*;!qB^aiL>H#9QvNc6yw*{x^S%=$K`_wU&|y-y#d*-#lv$U2cyT7IEEBB^2Xp$zI2n^Vn=RX-gu^Uko%!yibhFB zS&gfh*~eobsZ6&rJG4-*YgO9vze)e&z_LNwM~)dbrp2(rp$Gt@m?`0fGR}&PVEpv> zss9Oa%III#GP?2qfMsy}Z(4@OtpQZt@n1WQk^5g!d&bQFUA2eeb#P=AjBMd>B|4h4 zOiXU-NNJVWymf1j`=8dp@xN>i9#fIW%>gsNkK&pJbFfw~*FFYN>8ttn7ZtRAnz!#wW#>mh1~FRTlVVKd)wd>3hpJXY)+%bmDbcscjv&@QW* z{&mB8{=urfe}0vCaYN;3>&=s!-kPeGzcR^FP}BdZ8v|cjGkWOIvI4f7=whZg*TB9X4m;7Dvab zKd*MK5A!H0KJjr+E&zNz^6MHY0rY6w z>W+GJp^z9X82Wk6Xl^v#e|TW0HkE(8GWBWq$j2_%CJu5xv$kbv63HM%B$tdP&mkXF zh^2#cMsBEt498X;wmM>K430W*<`^6=d9_h#43mZWkY!W@(3E1*lA`eiC6mV%Bs@Oa z0D8iV(ms1mEdTMx@Pczs`ObXaXxRH9UuG3>>a01hE$v@&pvS_GG=FC=oUkZ6)%(ui z<(1~c-CynY7g3v_O1$_YcQ{u3gO7=ef3ZT4{do#dnl%=Uv!;>x-_hmT}!+sWKn2NuF57 zVf;C1{AcX^|9z(6KP5~4DL(_;_D9|06EzPv6cp0akVsU?5`z#5CAt$6-ARd_q?RoQ z{+sk%42zHa#luBDmG_QTwP%m`uj5%p$;u}aG)v2ezPo?LjdjkjSy#Ju&bixoQArP9 zs5kAo4|8sGzM(hH+4RC*RrvCuU#wdHefW?In-5%Gap*vs%?Wzz;SW9u-hSKu&Dnm{ z>jp0SZ29t8KdmEue!13rmTuD`!_~~H&tDhLO#Nh=F>Feo+$w9h1pH{ZP9>a_`JGhRCT(ewkmhCR?6`e52;e@{>J6<_Z5?upLd*DSie z=FhWDXO^gEY1?HSt?^Fsyl4+Q@F(iQou4zs~8evz6v>V5R*cmv)j=R|9^|zqSL+}Zl#b_)( zkG7;W=}bF?QIkHl`lYmRN%sou;b@|?5)nAk@Px-t37kk{gQO=0POsmGMQjjljxRob zT#U!EEeGpF!&f@jO0Ci|Kx7Xa?|-=0DqY^t!`L9)IPi%D7aG23ExRpyj*XqVhvL32 zv`M-y#9Dv3v`Eymb|orUYmjoGG!iTS_$1OuwjJrWg|`3$W#E$E#qJSKX{a+M2FC(- zbm_4g79ndM)q-6>X;Mg}%E4~O8rdAD2L_N*i!^)|?3TLtGdo%OJjOSB!@hqkA0N?0ZC={AzJdM(od8`G-I0^IrK_W;vXe5aMjUtga(;?Al5{2~`;sAA$Xq?}O#DK;UCukgL z1lpLyf;J&>xV9;24BCt|0dk?M%}A-;pjP9W+y-Pm&D(x8y0(8MG_u z0@{sa`tOkL*CdJq< zPl#%B_XOd~4v&aje_11U$r8|2WGU!NWSRdgd0C>XNfp*#Ad&L_YSvL%xvcWpWnlSI9ZgtK<{^ zL2`|J3VNM<26}^>_a7iP$>*TA$OX_Z$wmKua+_QN{fc}6`Zc-i-$%Y7S3vKOtDxVK zYoOne>;ApudvXKx2XYg%mfZ61AwQBYL4T6yU2@yMoBT|^0=-AR2K|M6N=wh^+$HnLr@D6Q-lJ!)-hHyN z`}XTUVBpiw+Y8=gh5~H~+;23l}Y3vUFM1@)awqSH1M|>Q~mRef70coqqn#toG2QXHW258EXj!x=+8P}b9T(jqdQfy#^rjdtMjjIs6C7iS z35|)0X&U2-=@OG0Q{d#B24{3EiREIov4&W4tUWe7woz<+Y|Gfx*pacNv9n_5#Lkah z8vAPOo3Yzt_s1TLJr?^x?8mW}V!w_{jq}BIj2j%67dJHSxx4cFoZpXLILKPG{%`IC zT7MC(pM};h;MWOM&x_@i^)6t6_w%&-=hr~qI zw|;O;zSMfhe`$Tshpk@}yEgWXhpm4ft-pxYw|Ut5g18ZP>3!<=!@Cf_**}305##Y- zZQZ@PpX=_{{Z#i(-NCv8b^GfozkK;icR)CAl;2o>^S2x2H*0VHaPym+ZxM2H_6_6B zW;Y{lhFu?VeezA=#>E>OZ&Y1de(kku^9Z@NkzIGgdTrdbXR+nJ-u`;hb?4Ret7%u; zUTu9f`D)VDgsV-iMqdrRYPw3U)L!}S$~RYTU%7eZ{FRTcoVs%O%AqU!2)R;oWz&_H zuVh}yxRQRQ$(6V(u~%YHC-R=8Li^bhxRSt+t^fOn8_JE~CjIMvZsfo2d3>AejXU<{ zvI6_Ko{t~K zJl7n`!#3W9XLBvn zZ159&T`k#L>pI32jQ7Ap(hqjr|-kM+-y)ZbT|c)I(d+ zWZH^)X=|E7+t9Y~3b$w~eS)^5?WvD;pdD!^nnu%U2JK9{&`kOyyz4gl6zxj8(eAVd z?MZvl-n0+Rg5|ysKXRL9)4sGH?N0~Lf%Iwm49%f~=(BV%&80(V9?ho(bSNE0htonj zf*hdF(UEi%9SyJZH5~(gb^{*lGCbFHc(rR}JK4cC;$q>g_mE>;96b0g_}4Oc-Pz=K zt~oHrkMO0k@D_#4YBQ0EG})Hc)tg4i2n8EpPUTby5iy8U&pw< z0qH~V5%@hk^50ezhy(0Ezsvn2Ad?gPmBKclDYkbKkoFPa{)>?1IsQpN7HI@7w zR^!-WNch(O*wpFtJ=`@@I(8#)2DIxVAgsPX;9G#+@_^a5Ljx;u^enywXk8!DTQ*BJ z3p!O6xF$e(Bi#ngu)t?;1uh@pYn{^C+bX%GCn?dL(4u*K( zA$FV9Vm1XE4MBRHR-;xa6>=G-3n_`GHTF*Z(?`^VbQ)Zf;Y@QH95or;?{-V5A;DqM zPNQc)^S~)JGFJ^T)f7&sAqm@vuXT;w^^fD-Yxr2hy=Yw4tzmynXs7w~>rnHN?Wsx!W3gmRi%qg$Ek2hI`p@c?~t+tD&YEYUzgd{f7>*p8ZRI((^|+ z)AI|#m;AwxICD3^mj=dc)2KT+I~Ay#$CGVp4OTT+0~^O~qZ#d}w8CYix7o%KrLK8= zO)zU$I{S^N@y#2I6=xb4fg`3zNA~&;&42t5!DWGy2u_pMXpOv6jY4{^qp-%8TSMkK zw#6T+oWIvVh75LT^PTy*&-Ab1bHU7QgpW-ho`o$u8Nb299W?@;E0HklaikA-RAQT* zHW<{IhO7SLe(Y9t>OVXBP*_bcmgzM{S50SJ*?G$CFupR~Ug%((m6fv{HEVnIfBa}P zI|pNHZyxWcOn2fzY0cx)M|5Q4lh808LM+;pna{YM>!>LmG6MX;U+(+{*^I6<)MWe~ z9R?mmOJZ5i%>2P4SnEgNDgg^e<-7u^ck`v*F#gi?;m-8J-2c&8m6hr2@wxe|VR&?> z8ef*QAXx($10CsLcG`gYUG*p6h#(yqoHl^943|FDyMHGfO?T#|p|Px~5BChN--8|L z4F?^potZVh!8MLNM-A!S--(M`Gg8o+ROYpoIvhQKHjjU*=cB7?WU&UPqw+UWLkBx+ ze_$IyqjLN~4xqJPkL!1tSvvS*0PgRahAB?B=>|aB% zfB(F&nvD4aY7B#i(>53_CNmkm`?n8^HliPa&7KXL1VRW=gwR(S@QmnaCVBJr`p6J$ z)Rgw>AJ}$~Az|BzFTn-Q4Q59UH5{>Ivm>PqM;=~2*am<=^FRcae$28DukuzI%E zIM`gW+dSMFhYT68E+Q~kUqTcJIk2uEB-$8lj0K_C^LMEXumDSf6&91hx6rxptnADz zpN3NTPMHOvnuG2~c7^zF_(Ediy@dLjxAIa4R)KhAJkN2$P8kf!E~UyVlPQg!1Xrym zAt}L_l9J$ZCAeC*ChgnTB_$-fsgw8c&SVd5oAu-mx^w4fmO%gB@)>*f2tJ*Qc=+s= zfLa_W6&4AcASlY^3uS9$C{mXDluEC>6!4EjyZLf%A*8S`$i{(alBli2(^btsg%kPTSTN@^DJ=o+6SL(fbjZ&c(w81KQ6d%sn!<3;)0cC&H zN=S>ZIUZ6SY6zvFKS4TuO0AbflYCC6HbfdD%r>P}8*DOJs;vgARa32HR|ILbK@PoJ ze?!mf9r`@Z1x|PpT4NYmgYh0?uq_1x@o)P`dm9GJ=BcwKC9t)?szPQ+#YgcNooz^+ zb}Tg&Bbbvz72qO%PE#~~PA|BMpNEgePZ7;W3u7&xB%QN-+O4dccn#zW>ldEO*2|sC zI@72wWt~@wHKR#8wHC60Ex3S+;8ab6N634P1_A^->>>nXGWnW@UqLFER$Cp1# zODom1Jd~CjsUQObtmTbmjibwz%J3LPHRdY9IIf8$yjrK%8+3e()xeXLifA2=S%#>6 zrqiZN!Mv$DI5@U^g`FnYefGijvG(ispX_qG4{~d7Y9Gi!h;R9fCW}{AEku>C)KEdw zL^A-)^yJhg)G|@d$pK4ibBw_$;8(3JiL_7kBpB*aA$s*IDG9aUd@Y#HgbwT?IXN(KM#r`t_kd#;?e8oEGH3W08aY!)F|7{oKmgL#)>EHoMtovpXO`JIppO zTl(CPwoUOgzQhq~z`jrewjD(q<7iw-s5R7PCu}cadpBySwuH#*FJ?<$0u$AuO~Ev{ zL>?jsYeTHIkf!6E%J4|9ld;)3Jz{zbt|p?U1?OxrK7wh36T2fKg2t=ZNrP2mRh){Q zsj{ie<9$5k-TWRV&Wx+Bam=vbmjm@?tN22@*@)C(bZT>4u77ULmbGxro_36l1C5DG zZrRF{1cWMYoCI#iIb)0llaqS*|9FHJ%v`ag{KbXKX7Z6MbUi`Gj@}lXliFd_s>ddn2zgK^%eT-SJk4X+mZXVJ;Qf`h6u}8||gXHq|k@4op z$oQamy*;M6+|xuJ5}7P0!wq3HEX<^Il=3_&r4~<>(%QrTSvRqPYl~+!sWQ<>d2)#0 zruElqtW|}vlaMxwb%j-ghf`*K5svQVTou<1)SxloDua8k{|BEAH*(K(XsD)@CNNws z4;wV73`WP8f>om}g_$AJ9*Weywms7$rbam)>|_UK>oHdPX~$+OTi9L7X@+C78ak<9^@d}|j!{<*aYG<){x*FOBXZpYSH8!G4T5N}e){N_uZc(+5Z*t%t}b{yKH%OKB!=k`r~dEBB! zL6L*z)NZQyGUc5qC2zb^@x>gm>o&?qiI*;R=1vY6nbdjM(<%MMtxvo-VsYgtSZnw( zs+Rm%Qy->Kkw0M0>Y=aV1Q|Ee4vQlBDdwEu78~3Wb4hT)Rd*iqu_#!(zq2 zvqoS=9)_^Fl<*1s9DWTi@VthijcPd?c~5E*^TU{qVo!1rm&wDP=0sHZ>~PvxyfnN{ zmMy*@xpl&b}qQpW3bY8{k}D+d|~Vq#Sb>;c1oFC(zt38MRy-#r;gzi%(aIPt)~mbY_Zv zItsG_a#HGxuyS#Dwjtc%r2!J{^u7n%=`%Ny1i}{#K*IAfAiAwG3$KiB@b?Vk|H)&>%1f+xO$KLf*gX1-EsqV$rV9!?_luFI)hggqT0(@ z=6-`gfPLJ9J-l6VWG=}lGW~F2RU+tnjw}XRLOc#e8z%)P8#reS6f~F{_=EU0)&2&g ztrGA4^45kowr$y16Gp3%CTvDmiCN+e@oRBl1x=}?Jnb)@@DuTO@hFp!gFv;D&>Jo3 zyN}5HXMG7)yH_?i*y2_A7*QydGA+NEvuo_wl*u#-wHh_x3I)$==Lv#dC+QJW9|q+U zm;$-lLt>#=uq&{_u^6#vqg;{P$m=l*lOCkeRlAN--Lfgur%x9m-x=}di%0J3SxZKs zB_6cIN*3+Ir2O3-8jaV;jSxCkem@L?(D1c)500_fMX7NV_JVR(wj8)5O=s z9~LZFK;NduifOAhFLu+#ci)oRwn)1Ix?KEZ-9J9EVd z2Lj!P52eYTdN3sQo}nX!6;yD>G-~X%Mh6bk`7du-`ug)<_g^)O=AZg~SxMOe@wise5X|OwCq{^4K&wkqeg~0DNoG@^GgZ9WdeGngt!l#g+5aT}EX&Yy&PLSc{ zF3wo33E^H2lhgLN#V+LuB}WFBH=8;0T%{R4UKyd>%i%cxa#+ax(9odyyY$EPoIYG% z4}=k6uy6!cImeTO;lvnAL!48W!$NKrV)jy^vN zNw)yYzV1s1kFoDn}=%J9oJZw7XRoQA?yXPT*5LFeNY?zvqw`!%OEyvC`40ggHm#YM^H!dl$%skBCK zPa`!NW0-ckYLjxLxPbWsrq&oopiK0?7NczRKeC8RQ1G-Y41`h{&fBxFkuiXxjKt4FW$GSqVmjMp%P45&zhCNcIXoh&S3BZNb~EX0Ck=wSQ0-X5=e=y+`|TbFVKS zDt=KnOS}cF$fGjnD`6N$!%Q5c8TI(o^P+cacbJcw1z3)=J77f|So$Kc5^XSByt^HH zVvlN1#tKtx z3zBZH#M+^q(0`?Fum4Y9OD6qInL{1XbV^gM>0Dhryl~`P&Ie)PlsL-4f`SfpPQbkI zT$9VhbOL$+Z2;6|As}0=1wWDTzy~J3)|JDEBpEp=A#$9;%^x>B;4a(d5%;k4Mg}7=Du3LxwfF)N9cO zU+b0fJ;KRo9#wXsr|f)VfJP`aT8{WO9( znb@HSk35|j# zNw5U^)SyW)iHu!fme&g|1e@g1F(kQVJy!Xr9*v)yefsEezC!%vT~VY#p8#?h?7~s>I$@vcX}C6zI=H_pYcQadsnYMxc8Cx z9h=;wn4vx*5MeeD{ebO!wd5J&5Kj<8DGthEO}vN$1tdf%;dv#$n_JFp;JC4P2cC68 zjc|$M#?j^>As{Y$J?v#%Qekd7Ss-=IxlbR=6=ts#cZs`J(6!}^?^Ee# zf|p-c&vz@S=6OYR0vswQSIGx*M4?o$yQkuhVRpz3i&iYscPfAIL7MbiS9t)Fixf3p zM}#I)e+K$A=#ZflcS3)d$i^?k33uQm9(9W|K3{1)C%$0S?Enun8*Fluu#-@ZuCW4-6pfw#-MJw zj9xU-P}zFhE*naeXyncaiyJ*}oeY;Q0c*B8~f zb^uKT6*PP&%V6zRsaXQc!un-anZ4?17KddocgaA5N)1tl0%oAb;m0fxgJ!TtFg@*S zlVE%jJXj`3dDU^u8c}CE-rJ6oOb^fCD4>`O8A2N*n+sV)6^)u_J)Q1ZKUQpA^%R|R z>UTdGo8)|-X1(048*Y|TkXlqGUUJZ-m$zImZ`-MJ-SOk#L~rDtUI!-7}BT_M4H!|w10m~(U zWZeOg7*L8%^4jFlQY6Nx8If2+j>(f`^Zo-j3}`Ly^i-+%(XH>rw^5Q2_2t$0??h4D zB95bLkx{VH@uwF}Xf|kO#jZ0;=Rc+OlYTRXcIi7UPY4#9w~R~wY~d|x5Vzj{UR*zJ z@&vjLl_74rLR{k~$Hh;lyztqpHMdLh>R#M2Veo`iQ=ThjI;sH1=m?CV0Fqwhdn!&b zQBi^a7J&S>O3e#`NpH*e~IV4vVhGUp2I3^+K zXeW<30qQaFywGuLrKp&)kRCWX_><4zILFDdAMEEA)s1DS1(h3US~lvtt-vkQeBt}$ z?s)W9@uZGixLu<89Yly*U^^&JGZq)y9s5u(S z%?3oCCRYZVnG5?7QL)jR4i{#X(sQsez(@#!YF!5Kgk>SHEm7w1Js=Nb2OHO*1tx`* zjxYy%9Q@Un$BGlgI`I<9lXzM>>ec?g?K=74CggNJaEedR*HF9EmcAfnI%tM?PWFj^>5Pp=o}?v*@uBb2XxdRc@w2#@TCUu_^o{sEa*PwiFU9L(@nY)!>wVgh zjR$K*BwC>%9eozXGDMM@rChLlDcq@`6cT_|n7z|0gS?dL6q@OrmJ7%abL%XuLK382 zc%tIwA7Gi~Qiar?|MfFP1NtWiJ=I&lAmoC-Ohxi7JxjGs>4aSZa`?!Lp?s zk30*WwnHZkID4uZxi^iROh;kaqo*Qo!JY}V8wYR4f>b;XKiYQ-pH?@FYg~7UJ+7DJ zahbfm0(pxhXZK7IHY+w;_z>136&TzzWHA1r4>P?+Ac+H7ifLOJ=E{r_OCwo3u#+uu zuGt$IX|yedlHK;%AaF9%UgP^l&bU~^#7`si(=o(x*4Nko#DUCBcm$glh=?$U>+O(9 z{nI*K_;gmR=pX|*^E4p*JA1SSuQE!>usVh^03D=|hmnv34+PN;jLvX61Q5fG{sMOf zM3FFmNsUez;d-NNQp5q8a~4CeWVahfCkw9>CcN;Mcu)KcDSsoKT>P5zP|^E`F6>)$ zm=oXTYU<;r9F6>z%S$( zzu0uG5+kF)9Isl=tLStXt=*hbm@d=G8mtRLp{ebeadhQ0j1$tg5LKf`n6jmA_LeQ& z7-3MH9;EA*^p2(9BpPmMDJO)0B0wCd@IV_}=;y|MZ0}UI)q?h==;#i%W zp16Erf*Ja)S}d3pOXb0s^qr0uV|H`$AbB?9aY7xgM^bd=Y{+K+Z7(LAM2yAMI%@NI(!TBf+sml5!4)9a7 zlR{9ycf{txtpnn4@gz83xKCWb{VYxum!Zpdc)J)A;6Hy3eU*{MyP=N3JTED~4r<8a z_34~k(*0W29LCIm!h4MTxd&ftWjcPpL*Onlb{8$VvyX88{X0}Bfk1r=Tf!mj_i3?W zMZ!v&(qw_LG05cAm;oT$AO=fhIT7XYzVG@F504C_3&EqkowznmLu~J&BVeU-|U7&vm3K7#tE3iQ*Uu9gT)FV5$ zK};(VJ1iFIOLXbq!lwKE*$><~D5M4WBdi2}f=I~@%-(|~pZTVNtD{!I4&8wxN<{XJC3jXoLk0mvxN-MQ+14(81^g7V zpu1r~*$lvQzR=gz>-BFK-Y~DX%1&aodvRyH&Qy(8UIZzKX$)XYOs6p0y||xzxqPFX z$25S!D;I*MsqCitx|TgZTRb4~(n?~0 zRAZ|(bhnbur*Ci@mAr9raB$FK^CIm@8@2rlTN5R=PL4Pg!9^_YThCa#S`WtR0D)D! z(HL6K;6}*!Ivz3D8JJ;_7>tZBjK<@9MyMr4tWr(JV+`jM3gCaQG?~ml&imQm{dwBz z{%^GH4}0nEei><*t2b*N4#8ps_3h{qu~a-R{w+>$n^x%NTFL?7|79owBQXOb!O-ql zUs7v26vmMPrt1LHbvpf0!saZ1&t(9-avr8$&FOT)fZ*Z56V!b0G^h;&2uiP7ZP&wA z+Ugw-vrV-*4Ze~Mm;}%fnKMIKpWSAd92yW9Km|aPl-PoQYUD^{kMJ(#S3+Cpgp>T{dn#4?jP|tUL#Hqxq-W&F zkf|ZXVX{7ozLA_FGC8tu*htwV#YD&Jkvk)m;cAs?T12=xA|gCot@cGV@~VA6462CP z5i~+=Bh1|HfeApCYjF(2?hc@o7?Y_7GQnosVxyoAk5CEnQ1c5WQ-4V5v?z8`9E%HM zqX6#>Sfei>e#E34l9FDcHyF)caspLT(^$~B2mADmq?|dJ#K1qG2U9)F3!(Brszg9^ z=mF+PLO_VjIg(&5WN;b^5nx25>K&68aX4dIO=3D1eoCrD?qh#dA_}%NJz!ax%Qy zAeYI@2!$#j(Zq8zWC9{q6vI(Ka{+k)oYPt+mC@GoZu5)Ep^HWljv? zDJ#eNXLyR%!);NxEch!SO>DVdY`L9Iqmxmo17LN3l`s@HZH)gDn}>F4snr+GMlcuIq%qkikR<^F13dIllRQt{vqk(|{C=yrVH@CfOeIb6Gkyxr`&Yr! zw}sy92foVSgV>CSh8*xsP^&cvQ3=QT2TsU%%n%{(An-DRUSmF5j_%52WpWMJqJjVC zXK*Tj9TgQ6Y5`Rq94`-6F^=%k9!{=-!rb8Qawq_Gb3M6IZY@^>;HKmHawyc4$+Z$3 zX7gc8P}nk{_%;s^534x})Q2_nTnQ{WTSAne$E0=8M7N5QI?p7CuN7y|-G{}E;;J=t zmpJu3IDsU9`h|7jTt?k~?g+P3RMI~o%Xsse2u;yPkg%Hq zC7%k4f#-vXQZ7S8DBy(@REg5*f=Vsa>$Zp0Z?frkCf*oOpqvJf#!zrz5>v$h8TEiu zO-1h((R&*2?u>#?ep`2hYscH_=Hrbqig(Ege_z%W(de`L@WTBaUn>}7!2!}mxP!zp zzrE8HYZaPvffWRwENFo=q~ zKFsa2kQacH6U0~OkV}_XxklmNO>mbqaf`s=E<9=KGtcH$a2!F^2SL?GDO@U7O84QF zc#4V-mI1G?`T%UD{PPb^q40y<=&!!GPc||-dm37UmV}{21ceZ?Qh?6g|7;EFbE1ELudwpYS%)B=ASKldr%IfMtg0Sk7L+TWoXYvUVR77INjXV>m0#*Z3ns zzr{Xk*CGufRqIeLf$st3L&lrpmau1>OpubSOrt_jz=VW6R$VSOQ$%vuB;dhzbY3%A z*Gac~0STu0zv6cadd!kHAusvVt1NVhogPObnPs}nEc=Z7a(IlUskDx|NX{p#Otk_Jrg@=$WM(IC)2s-wyqqUwExVQ!UcQW73X%oP<>pO^qg;Z z2(|6IE%teiu9Z(2|K#v9^YGdms_nrQ)WX4xhe2MneN976`$G93Jv=|-3rpGrS81(b zh$pZ3nxe>05bSon#cQvU8#rQ_sWPCJL=~Yrh_?=qL#*J-F=4$AeXgxbNiZPi$)XJ8 z05C9szD!w>*&{g~79Y35L|!1X?Tw^Tmss}{-*#O+^4+(;|7PEr(IJ}6gC;Fq@Iv02 zAegt`j)^~t_iu_HANlH~`Db?>y}srJ$VhkepcLb3BWr!JN?xvM!pCV2@UrpTcx^dX zuC3y#w7awlot`C#P?jx4{VdZY`7kXqP5Afb)~d;v7h*kbiFr)HYN(oku+NTlwP6!p z@Z|LDy*J$o9j_x5c%gDEchW>nGdC!x!mbDmF^dCJa}230oylsdq%r_VBg-Y#7XeV4 z9BB~1H>8ZLHWUO%GrOK7?%smPGpo*B{^sQRllBEo-Y=U!?}ejuNXW)_Xv=F~)5PO1 zhy8uE=Ewz%R}b`dd;NHg_8CIlY)E_{VZbOBJCi;(W_HML5N5N_`XX^mrwgvqurgbX zK~IA8T!p?IFM{spEHjZ8yR`=+s0^0`mF2~1A)gpBseXqIS>VM5Oj5wQCqHbyErd4A zOtX>Ww=W!Ve%tL^2X+^~Hgf!md6P$PVy^hDQ?%)qcWCkkT3cr;Uwii82cPYI9=%{= zb{S(9jCrxiKJ9S>EezQZ^nMWR4+9n^WF!bNnpXOBJ#`2|Y{n`HtTjUy@-a?UTa}t6 zrPX#cU2VXKU@Uaux`SM3sD7p*Od1ges2MC}(U+?hQ_2s^GT3mS=qM*J9MUv0W|X7Z z^tuTp;SfQ-^^zucR)6d#RDJry&wO3Xq2~@~a4nzjH-4R(HjkXKnL2;?nKp$u{`A#a z`giuMoJ|Xu4a2+$Hx*Hene_6tSQoq_n5$H+QgMQXlN0$$0%-}-!@^)RP>%_qt=C)4 z021YbU_lsFUnIof63e$@2Y@d?65uo$Hx6^RaIbi8r5$v|W?{k;K{?;u)o;Ej?3mHM zm#4+BJpSI)2Xpy}Q-7JSpQd|y8k>A1EybCf+h*pEe=h&9cNG9Zyi8W|dKjk+{?hFMHW{18I|YXshTU;zgEv6KL-qXT7@)5T6e{z!_G zs0Cxks>hIPtXD2uBr>$otTx+Q|AW=Bu`(PQh(RS4WV3G=eHLHEHICyyADOAm{d9Yi z2(Lb@>*x>PT3;jzKVMyyH-F}hSBr9jMvc*ksrfI=%o$Mme817V=9gXcjj3EOESi?o zVeG8R6LL**v(!d1S?u&@#OsSEFZFg9GQQo2SC=1h<#ny=ICV(=^ogT~Oct}Ky85iAl_!J$f;y-zsyY-^=;a1DD5)~d4tV0W16E=NUy~%9w9hj%Kw-i`WFXYrEW1UwWYODuTFIFlW6QF1TE-luPDb zQZ$%72&+_Oz@T9J&9ASPWxxHlxcY$})eoG1mbi|xc|#uQv<#n0Q>9kxs+3_;sfZd8 zrBS*uQoM(x2?C8Km_0-&HwGIU9ui1}vIj8*X?WPf^m40YBkj2Tjm=Y1`*lbf&`o;! zru(?+#;2r zvWG-?J8P&6iPDB#GlD3D5L<`_(V_-$^@)eMW|l5Quqd;rRY9nU<|q=*Bh;7_Ra4|$ z`Xd)Dlp|v=^#$|9QeF5sB$y%8s0&18IKs%s63jA|U{*>AW+?=qIpbVKs3j|6IYk9H zEajN_>+8fzmshW*=QoMRxRwvZQ^4HIIfb}7&{x_<;<&}9q3k`na=-7 zogaKwwb~nEK$@l8tr?@4jv^lo3Q#3`ZZ#o2(g?C@tuU3F8Jsga&8!WsS}9EiMb1Id z84NWFWmy^ltU#o}#P^@_8*n+S;}!_A)y9a`BKx{JY3T4H4&PXX`A-uwyZom9;E z&-O-A3%_salzx-etzI(q*tj)qxw-R;4y~^HoWHmK^YKgGV>-t?<0Z6-<$kkv{UK0o z6Z>fImj?V>;N36kBDEJ2Nng5d;f@T(~{z76p1Srfhb144@V6vUB2cF<;zyZPu zG9xKt_=5m>p~#@&6(nZ;IK|m-sr=}|4bd?xi5bZ&(An< z?vr=k`}p!Z5^6-H`=4kfLyZ%C`jbYy_-4?%Va@e=lxtwl2BzLrr8S_`LTe3z^FHfq z4(16$2!kOZ3_J#H!hh78c^WD8Nc2L2kcd4hAfNRB5;z1Bf-JCP(j)*04ogePf7eR^ zIs%{FI0XOL;vt5FM8EjlXFIOk+V<|Kpw|ZsTeE25pejt0cRqGQJpa`n;_ZCj~DYg9ZJx$7(x;NFXF30`dS#R}iHe=^$VU5I{f-#e^b7gkVsbUBoU$Tvu6*Qe2d6BDyH6 zuB*F?y5(boJbd5hJ~Ls0?B}z;*X#Gk_lss`GIQtV)^pE2=Y8G>s4ge0O5=?#iy8`7 z)muKXh(J${7Wt$&b)kWkUPEqhEOWFP>MbcJgj+86>v{>PPZ<6+12uX+Fj|&aA5Yp!r~UUsQTLdeE{z`esOuQbYOziF0>|t?@Fe%WA7C z$SjZUw!R&Z*T^hvGMjot!oEl(95%mhX76F?s2)$1De`D!Uqm!Vd_pZ-3du~zhZQO$ zE@@3!0XHr(h}!YMf{GKT%Cp$Fw)=(#JT>PF9pGtu+a`H$BaVFEGeCX8{S#?OjAbP8oG%Ru8Oc7 zx>>ho_9b>*L~_DIgsZ9!aW5!9XePn~$+XL-9hO~EX5#)WU6^Iks%QSNWb?5-Y~VHb zUiqsDi?_eUD!zDK+sX`Cua6$KAYK?+JGXw1b|GuW(EhcVIoEa?>^Gp3_fn)hpmNQTM1l9 zilhL@oic(FF4q6@vv%0-WCWTQBcuY># z=+VWnxxwT!K?vjEz}1C}#h8&AlEbtxVRcRLTMIefU^LeK&*jp~>u!1f!56kK89Ze1 z@a@0)lA@;i&o4gXvoPVfc7;^pK{}Cffu_6|U3`kFfKE)3DhdLjhJ|%*x=Rr|?!gxe^ z+bCfKYzQI3varE6)6;5$J=rG0BfLi+0x~W4)J@AET~Vq`Mp&7RSadQ55B4Ra*-{N*f+@{^_0!9!2vO6U{yL|PK3o>CR3aw`!QmY!3n2z zgMl^3Yz>I(=u=o`p;7X2q4ATF^}uLYwJp+cjD}PASY2%qBck{#@hyw^g1FBjj%JJ4BFh?!Y^8-cP#kQ2Ts&w! zYCh#KSPAuSbHQ`r01Os~tKA9~K8w@ISDF(m&1tvVtW^%X&tbJV><*v@vHA?ACb%V< zl&IY)NH(Vx@8VW%bIt_Ir3hoD8>3<{*omLuzy^5FT{b>4-N;f{+D+eh7#cz!bm2D& zGAY8y3F|gNJK%62Eo_&vr4pggGq#>XrSQj1r@SdJS+Rm$MqEc$^0Q<@D zKoSjy;c7)xR|p_%fE*B~;5Xv7jXP&S1wnl%+CAvUNB{x!-Ccuc=j>YE{fg=y_iS)v z&K_LEE>u0Q?VoiGo5>n>vOzW1I43)<8O0`VTEu2bgC}c`_gx5R^j=u$ag)QXk)kjW z_A54!3=)~#d(M^B5ir`Tt_r&pa2jyMg{efjv4`w z;#aZu-KwEzHS~)myHf@90q>yR8=8B)hio!Bmi^?SO10aS3wJp(Yljqztm=6-h<9xD zgWCSl!`##{ZTs?jc*oe-{-FM2!Y!gxzFN8htF*V8f0#}fahuaAxR1a-w9V>vTTMFp>wfC$%D-IKbrX15Ah+Z`hS$VO+|2|Q6xIuQthW$U?GjFed`T2C;R(xQ zB^4C{{Qz*nzhMmV+esE~iN86J53qD&mIMgRx9WAkojY4VoZvu!vS2h{m;|F9nPeS z8w{ufRU{Ib;gBno8ybnIM*PXWnK_x{f+e40xAHL7qK*`X%Yqw=pbtP%g_jLRqD$Ot z01U4LU|4XY>{*hM9H&;p$dZr@;y0#QIB_VXK*i#z83PB;nmM%Jj4@sF@~f)y@+#OH z={RG<FiXU6rL66DPGnHd(>zr)JD7o|hr*46uU* z?-smU495}F;RCpT_WE*xe|LZ;X-wFG}FasBCD4Dd~{f1JHXIl6;^!v|9ZwuY<%8_JN{Mj8MI? zahZjL>Mb0XSynU>V>5_iRulpP)UeDl{i4tP`xBa0q!b=gA+Qi zeh1|k-#_b7J!BW>U>F_<%4Z9VZXE1Tq8PE3lXg4`_o?U#A4pZc9x|5(0|vo@xGEg7 zUp0Hq^ckZg*Y}^hETf|98Q_#IK?RT4c6)S~ICQ{Oqq+ec^@u#IEEs!C{w7v@5VFgkM}-0QAJ%=X6{7KL%5OgLeRbqqP0sfGE9ITg$yhC9IqRb z%Tg#A^eN65dWMp1t*Xa+Ye3Z~+Jwv)X>GK13#k-d(=(5F!A8z+^7X-q$2YJK&L<%d zZ<-G*5jmnFF1Z<2s6+5jd0>3Ac(HBGW?u`&=E=e%g<`Dmj>46h_h(9(g^fiWi{PQc zW?k_(Ec6|Mmw2d19H#F~?ymZ?j(XPpRS37E{XCoB@K79En=VxP_AJ2$P2Zj{oAdqo zbH^6WA_M!$JAM4vDK`%e4eZ~cTV1$wrxy;kb98lGpZV)(pCQ%NV>+ri1zG)-d%~>a zku^mUE6e!i}8SEqH6nGp%3uhUD*_Z^-rA7e2pAIl7Qe_o!} zwO;?p9DQB$!dX$HJ#AgXo;_ZJQ?Kgre9fWAq z1LnjP(+y#P%c7Llq6_z;+?cd)^woZ!`UZSS^bI49{D#bp;S zZUU&{VlR+6KoBho_2PY~+0XzkFqFpr6q%F%0f?7C@+%knL7s|(3hmG9_&j_7QO0`# zOdYi;=C}TATu<>{U;;=U;m`7ULsUA=LnJJ@)B2#>K-0?i?U5`G@*pZ7jkvjpB!Q7y z7pHii_4-f3E>H4^SDulSr%7qe?W?@UdfD~f)Vvk20xplz1aMLw>EEIL>fiYwk!(+b zC8#~wVO?aW+QaP{y#1r~{$d^R@j)0fjZeUD@}&3o((-+~CCg*)Qu$!O+-^Me@-)YK z{U=NG8RmsUK2x$V9~-?a&9Gi}eQ|1jAsx_o*bI_iNX{>$&nDnmGP!@G3K%^&M{sd9 zLhT-go25J+3MnAaMbX*Q_%3i$a5qR6GM6K~s^T|yi*%S$<8n%63jU71YD zWW7td6!C)VfGL75=z&#aF(R)Z%yDec&f40YyXM}qvu<4Xt8N_EyVp2*((Su;*51Bz zXKnAX<5YFrIP?nq{D-BFl?`AziwQebuhT`%ak;$SNHfeI7IP425|}vfW+32;HHQI0 zXTbNwy4b?HYs8n~3T)<~p4m8AoGMm9FkY3>KV!UMhC$A_%Vl7%8{RXVFq{D+3F_Jh z464D9MVB+geNYf}O^*^zky6qFvwZlP2TsgeF^WmB2-*|A@Z10EfdEejh_VU}O&m4Y-pXF&^ z8FsQOn^v+eBWBLsA{E>>V_?I)S=S%_`WGWtt+@5tr{|66_RWH8u|gWPjdBUbr9`M= zH|;~bs<*0?;xF)wOU((DLStWyy^_7J?3WetIMbN;*vf^b#raPepRPF8!Q_cmmZ^z; zWwIgei3JiBF&QCKUy>$~k1vx&AJ4l~J6!a3s~LRMb=fj~q9$NdjX5eSmnC98T(pdN zrKQU(MnuUNg}r&~_GIAMd{o3(p0ql+H7Ev-IwrxzZArnu;^RO}o7Z zy`q<;eUM`d-W3Ss81C8vK^ntdqo81a4(oc?z?{cHl2Dz4XeHdj$!mob?6TP?UKe3Z zLZ`cI-E2G>1T#j~Wr|G3&4Gw>0HGlZGlxk-M>z{a4dx4cBQ$L=!nC2Jbu$fk+aP-I zbr|x<)`hJdr0WAVa49IwbqE06EK>6t$b!2D^NP6ze%cE+Se8!KR?ztTxcBRx{>^*O zt@_oYzkP1U>D;Y-kIY=Se9kM2>L2-)roE%>JiG1GTZ66|H)=rS&>a)kbgL>|Kl7PI zW1nBMXTu`TlT!y>Hzm=5h+&`5qqab&QB^a7QD?q7!-=l^BX7{bfrb?0R3M0WC(tEWtweE+`fW5zYTzNvQ3 zyneSlqKp{-<37XSANR?{J=RXX_2GW4XV|ae({G%z2t7wmq22NgN;C2eJq#dz$*j)e z3jZd*m=i-V5-d$$s-qyya=qSSz_rY<0l>9bu(coSR z78}UNvz(=epjupnkg6-x1PN~Ap%p`Jn1XCh!;y9`t=t=cq7y6rCJ{^z5smfz3ZuB@EN zuiUxo)5IMAwgKz=+;;V(*bROq`%y|T7>3Ov)K9Jrv3z59M zY#3c2KEt6<@zLx-w%y>e3SrQl*`?XNvZZWWe#X(vt38iN{&QpFcm|7jr`yY`+T*J+Ra{`%`i_WqOjTwC#Mwo99!ef$%ftZn=8Cv7{M z@(`=h9+ArL9o_qm@Kx9M?A054r`_mxL=;`dfXLn1d$U`z1=7x8{ z7D96Y!*x|C)L~&hBRJ@OoZ^j870I_4g`YM5NP^Eu!WkuJ`06N|k9+D7xIYi6ehhMy z&tfz+i^+M*OU_&F(VWoH93phOIAh_|tndl3p=8m~*u|L(qS6?ju#5B5iOs;Lx*8a+b7hn5K`)A;d=XT!vJZWD{9IX5i z^3Vtj-fnf^7j9;E!I5qw!x1K z?Zu%Cw+zDLJs!K)((I$jiDI^VDgwlP>LkcaTIx6eNO9C&P5aQsm)4 zlq^mH1bMW_O}B$hGo>I;x=Nc=!qzH7etF&JG@{?jFGyx(3Ag!{t1*8c^K;Hpm?wqj zQi}F-9u>#B$Kwg7STDH6k4VlwZ-0g%)TGV2Dw%=H?A5EdLoe;MUd6>ddlr=SP(n~y zi%Yt9FDdTPqo|}i`IE9P9G8d7Q{W|@s9s?MW3?`KNW9!W$HFIT${ZMgBsNKS2K4l%dBO? zs)miS8|-#mwHPDn41<@S&Z&o_+UnMWldC)V1u?Y$ri8<^ex1f5Pf6I$;r;h z$n+qGhZiA6MxW0gjYeRf5CynG1oLk#UMQ_zlhv0K&0rprU^xt%%SIP&^8H<-U0YpG zx?~QO9Do>3mv=zmNI(p1G?<41(QRoTBg;I|3||iXY=Zu2Vu_t%X6<<({PGI4)xiaK zF|;!`8QMvgC-N8&%91OmkcxN-84B1pPB}XH@P2Y8bbo5nzX~TJ{YUx*dGw*9a&KY~ zEH)6PV0I}t2Iy6GfssL>0QFjsoI2o`DCo6)CHOX#{r671Z^wPwN7~sp*NqpqkK3^4 zy{iV?*mUT%ft~+x1cu-u_TZegU%iDmjL)@emTZ!LF-|*jLHNV!+iTg#uRmFf8Lbdz zD)rLyhy%?Ul^x9Y*&eiSb>8cF z%=U!$fNj6`E#W=;TizqF_t^)bk78f2uR?!~{fqrn;Opcl^u=w#d;!cm(oz^Z&6)W@ zLy5ce`048E<3j22+1RY7OOKZxrz2-JVB3{AS9C2b6)8b)c=d=tu7)AFsfw#({QfSk z>;L?n4}JVe{rLOG&U>%v%@>yqTl2KKZsuK&JUO>&gc?6(ov`P&dm1JTUny?eJ?pE3 zul)6{hrasF&h5XwL3@17UHdnzJyLSrkXsWcw=P<|dpRT`vMMGycb&p$wIYpm*SXbZ z`x*1D9h;q~cWp`TU6-4UBfAMmcY7pR+f(ej*uIw|;H7PwM#4)3S7}7Nt>?hI0XsSr z#R?@8m=%jKLA}zb)G3=4=?C^b1U_;W$c#uSfecg-$r;Bz180GW8O0C_iiNBI0c&JW zM(R6oT^hK6#L$;QT7qC#Sm`=Fd(I*LXgWmD`8?vg0?h$rrCf2|ApJzJb9(-kovg?I zAU&9&ZLGaayUfxZ5-7cX5WY7c&QeOY3oVpXk;TCyhK+6lZ4gqX8VZF1g8@XS?7wao zL%Z;QTe}vZT|ZH~#KT%qJ-eSZ*K0-RU!kZZ8m~Jbrvt*PYAvu9a=`5XG~e&@^^yZV z&`!w#ug`a--Q%KLSw$0of>dT{a1dghevdn}Z=U52^z?C0Nc=9zau|fBHQa@C>NP{}b%u`ggDk z6+v2rpT*kobG=f*a$kd#vdUb!^5ReOCL+onxjsP#zXchNsbf3SWRjYJ~RPr~28iiTL< zNYrAndfZu78$#GDHg`B;H3Ai5`6T*H^g1O=!j z57G)TXNhdEP%((qgg1v`BJd6)R;nsxL%f5n*HGuVAAQ&Q#AB^j^qZL{{bVc3D(Mj$ z)1&pzVrlE+;t%yx%f4Rn#m!c$0sQO_8;#m4)2@x$9j)1|gKl1`+W|ToZp95UOQ=*c zLVjbwDrO;Xqg@;iS4c1`!)+ag@VS7)UE0#+bWMxvG=D+|ptv1Bj!9Ay6)^08+Xf;Y z;1_xg(GMk>F5!63aBJ&5cMNUK9(qUXJ&UfHILXju(!^^Py;nN?2IZcg=G`#7lwOHb zr1H}pZAlG|Je@3LtShYu`?P}X7+jQG}Tcd4@?Qz?F+hN-&-&elxY(MxM z39CO66AB!X+i(5E@QvXDST}Mli4Iu_t0Y9CSX;qr4D9bu*PyYadEytGW_0Q!@JCmH ztGqel#g{4VJ9Oph#y;3VE>eRD(fZ=T_8(2f9Y|}jRpNSntDtuyv9?K(|JRU zcwWu|E_<)aI?v-|_9j;nS)+1;Pl~ z5G)t+#IeR3z)Lt(t+qO)ybPx=FF&s$?>41gsda2nmO8d8_d1?Yb~#>GUU0mpcvj|Y z$q``(G)M)}5MqR5Hh-eD1-)s(Y+y2Yub^h?wknQWCF&4B(b`mfep@FZadZjWN*vq0 zQ(h;($6L^&bL9FCod=Z{WcRX%Gi}+S%wZj>ha1imbm@|rnXO%gy=BykP}_SZ^T;IMIvCle()gDVxLh93yZ7ja@a@Nf6ErV9u=rv zkH;0Qv)eQ4tX3D3;vT@NS)z{U+g`%WkUzubM9*p=>|%=Is`E2~$x40feR7+Y;!;nx zsF0`08}eo~net7y!#S8fzCfz=y zW}$e)z*{{p%vq)N{g-t2l=(yLBr&hRNHioZM2M@lLFu;Qx{BN=1et|h;Lv__)`b;7 z{j}=<8v=(QNeb!Vq@f#_vkB-OQx$wIO^6`SyUC4Yum_Mmmi#4H#3_IbtYYaQ1Z>oj zT~FP$^pPj;>VMOutFFFjtoY4yn>RlD?0xI^j-9h$!ELwCpFfxOem|g8KUJ1t4c@Bu zGh4ExEPGbS6?J80We*7r%{H@Kf04%#6m#TEmkBX$y>eNu(@})420_|`)xRKi=y$=bl$8{QWa$-e3MuqV>_3t84)4D}Vhi@a1{V%dGE! zGFOaMb!U;MKV!MtA3u9q`=Yyclnv?Ay}CC;DlCazqrIfHKCd0=UERG8S(4NXe>Thl z{=EP;yzWd?Lsxej(QSsZq~m)Xl_}+Q+lqS!C0E(*(BMfgt49Rj8y)_b3TZQZ@B~4jJvse~|SY&41 zA7xp-rj>A`x-v66!E{mDkdxzTsO@xbr$e2jPMr$73J9evT#?-~`&BX67_w4;4^OZX z>bk<(!%C)NV5K$1KG=2DRers`@Gs5U-|n8NwI0|HFIrx& zA>svL&N6#b*4GdIdsh9i{XZC6^A61aWj}e{;)Oem4|f~T^42Y*>kqS{=-rPo2+EAv>6?2o~+o)s{;8QFXDy@n7)B2um4U^{ zY(xl-7c?9mPnp+*=yUKA`ZE0)Mnu9Pvs4zv9Pz*(?hEXR8FU7K6%95i?6cNmAz0Sx)p`B}iW2H8h}jW1_9zu9k&J-NY{ z*8zOFT^_rg_;R%czy8OC+H$E=OUv?YLxvWEQf^AmIm=mLLc8_!ZsN;@ctl)2xFA;Z zF)#`fUo=Ls&kw0K$YvNN_X1^n`J)v^*6Pv|-I}cNrJuj$A;is9bnl?kvrPExZt%Uqi$0 za9**yIB&Fjbl%PGoAVBu_xlcJ?k_xQe%p66^X)>{A=9CZ6B*J8(+LD;2YO{QXEw_& z$SMn~xM6s$0xSq7<_P!&7R$0&$vSWvKcwJ7M?e01{NPH}f*?58zE{=7W#VyY?3k zJXtXM%J&|8{Eb((K2b9KO7zr*m3kUFg^0C!omyo?_$0Vum{ST1SyBSf%puBnX|k|d zdP;glIwk#0`U$snkp95hAR$x(vIa3KV(DotveTr|ChtVFzR2Xn==LLS6MLU475izu zr6J0)pX%kD^Y9NrUJ2id6Qxr8Wvj44Ef)+{Nr5zmQZ6A8fs#e0mkIJN`HYMW)BuYI zjiUtON+pg}rnvY9230;@E5-&&)M7S)tCBvnx-6yETI*8lF6cRm73-=S(j%7E(7sK+ zoP8FA362#>H+S5;uojLQFXP&un)~s)#xkQkt=cCj!+CBkozb)DJ zd1?m%7q(%_A<%JwyGT;e1HBKQ$n1GE8ZjuO3L^y)T*{B1SjLOcy}US(K~(sLGr7%)F)QFDqw?-q>{LgYDv_#99ohhD;a z^sHL(J|Z@3b^~Q^B4r(>HjE;p6%snqS9Ab~i?9=;QHOPL-D>aA`g&?YAjuNIaeMk(chm z>;6F4l&m{Jr7uFvfWzkukw&`r1YjR|;GmFz+>gNP7bdo!(MIOkBn7~q6ekYd zPt|OIKNN2e>^7SmQe-2D#fU}M6R5WbQBd&tTy#{t1fLPtJFRo?>V6G(w0O%L51I~+O^d%HtYt0rz$L5LJI z`~Ag+2-ffcXa*4|(&UcV2R4|DChD^~5bBjF;PM;=Xgb@I-Q+N#oP+de2NdUk3u#Y} zK(THZ)^TaadpjQLD0l2wkW1=w!3uw=|5fojE6ZJB?WF6>#0^8*FV~mhAwXaWhAG4Y zvqA6yjTxiIgWvh^wNsFROXAe;I!{STCnlqsqC?Z-Fn3^RNIzD-T-W7`Wgo2C^t-o_ z`oi(%@q0HOd+qOX>lK~1+_d-nvb%O|U9NrlkbEUuxA5j2HddCgb<1`5RQFuVwB|ZY0R@~S#*u1+1lwLbbK>QfvWxf|s+aQ9scpIG_6|$dh`fLh+h+PA0BYYJz_Xb| zIQ=zqtPlbT0+T*b{iwl$t6SCUmiG`@ZLwRe#=Qt`g=|8Ym7Ol$b}&bA(S-E@@kn|% z#T7$L%}yo1BPJ<5V=g|NjSYzMx|&W*d9zEr72a}VxxZY0dSF}s+Tqh48Z_^EY1bZR z`SvaT012`IvA4Kd? za+DnXNqh{$cinUh-*9EbQ`-OhqlG_^4dVgnK{lO_AF|1b|7jiW$1qa_=Zc_c1n^}EU(Z=MgqK*75+8)qkn6lS^*`*nz=KaTs034~DFCZt zB_clo+%lSx>BfY-rm$KG^nfuU>%4qu?EmxgoH`;9=01cdebQz&p8VO~OkXM<3Pl$SP?zs?-V zg+z%z(|QtiU@%Q^S4f@4K6PbgAI$Dzh7QydprS7+3Z$VE6TkKruImN86`e8wS6=cx^5hhLd zE%4p%lf-~UDRCkWYNn-3L6`ID)>rJl2#VpUwEMKaG|^^bR;B-hP*E3m$TUi z*nlc}R{RO@|2dHW#y1f#!fH-T|9(PDX~17mWwT`HRP?e&~tJh6KygL^Gg7 za@-2Nu;hvOf%stqF4 ze#;oDb`?N9iCcyAf8UEHfI{J3g-8_IE>~JD3*?wHQfzVA6af#|*cf9a| zRJwjzevi`J9s@n>o81p@Pm#r~-!RE~r}fIQv)JS|sxC+~++U{R3d9XdSUgEdoBr<3$!HmIgm)-+F;eOuwFSq}^@#h^} zVx(eMyu#!I2Ipq;Fg+Yk?aa>uYgBP<7RQ6Sk+dx@5JNJ#8BLUDzW z%8JMq7(mhP8p3Gc;Hbe(2djd%R_Yo1OV5!^7aMN=N{e@Ci+O2_duiRUN}I|aTqVv% z^b2fBVt3&aM6*kX4YEql)x-RN?8027KC3I#lt~V0O}LtMR(;a~?+3(CI1rc@3;`Jy>eHbz4t?w;Uyw3veyf&an4SchxGvr! zzbxXy+YuMuiqClhM7MR3KqMGKF3cbWP1&lRz}~16$o)s(=Wak+E5e*7fmN(Cgbg7> zuX)v^yLz(XRn?}9SXDLY=+)I%%|rgQL!etVSCykR!SZm?yd3&Ghd$4#&#dnxKA-tK z$TU06)6wbJZb(lz&rF3Tm}|jSMkUQbvu_?r<$fGl2VWA#Y&Myx@q-8m(rQWM@!x4Q zxv>VBB3sD`h5Hfl{G0`h9Czm){0%&(X%m<8RJvW1aa+2K57X^ZF8eN{aNHdph-PpMLzD+Ae-Y{a^)8h6Mo12b* zuzua|hHjZt|FHJ0_Lo*4_)xe1cGG6Oz4rIRHqTxBg!Ya0<*;|}-+cTJ8}Uxl9Q~b? zoyqVGV)k^)(aAQ;5w|lrt?evFJX)QX26P5`+DYLi-ExGeQUnhIc_d$Il}fW=t!t~> zMs_Apzb8X0xeZINn;0VWy4Ul%vs9nRqFe`zxndJyu&V2SgyJPh7epWUH`8M1`wA=5 zTV;0`(_`otLmFPiOLsuRsvsg`g=A@k`T)N`GAx$rzOWCahwvUF=oWFbCy`xKkIy$! zX|N5Yl?E@4AZBqrmP%8MYXGIeav?G=??WJ2KGk+Y@UmyqTGRJJQF{FfwAi!}Af^D~Er7)lrrB4cV$2{d!KgZu{j3e8L%7(EC>;y=ZT<{v< z`<%EO`53z)l8k8AYxuaFcvUr@VeJu-o&nzpYk;}`k0K`o{|qpBb7S@ zH+)uLH5B^TnsIxxgZ;+UEO9fA4eS^23iaU_c(PSk@iF?#ydcjb%?&O^i^W6IUk^w` zZlltg&vD;%kz8xVEByU7l9qx>=xb29CG#~iCv+Y*s`R?b8%D3{G<-}!Z)M7WsX6(5 zu2`C#hn5|ae=k)jy`e7zRI}8K@kuwp!2`!&ZI!B8Hz~buy%pvEAn%Y$lpVN>_ExhP z@RjfZx?rq=0S_vV() z%n5IMBr>PuU)ot^$EsBqsN-AY7sQ!7LI7FB%+Do*1Co~Zq%MFrG5ZO?V$dTHaB6Tu z7e41WN-#EQfd}cdF5#B6>KXqFFem74akY8Du3-%WD zuv}X!J}Ll}Z^eTU zHJ8ik!}Z5v5n6B&_tVV{dOdD@SRdS#N=83Y^XZebC5WF$lwXEyf$i@TnKog}&C>>j z23}oOxiGV^W=M6nu^><=j$N%_G~I{@InE{RkTkm>X=bTcbimYtufMnP`JLzWK|vp zkKGxN`!z}~sh2Pm*~@MhzQMN|i`XX^AXVHEsA*fah|c;)>&1s#kA3y%S6UQ3 z2x3qV;pSx(7QED7q7*^js(oRg1*LwpiU_SH8AYGb2pThZSeePFqNzrtgkzLr8KZCY z%a~)c!6*S#45JdJ0xWNIQeZgIZ~&wcF4*g`O-5UxUVHVXR{24QyuGoJ{ugh!`~JJd znXPB*@2_ti0c`}lqjGn{pK#VyqP;=kj8K|9y^83p%Pn-Ib0(m)G+)_;(j!qiAe?zK z$;UuhhfzF{XKTk-f%8*3$7}DItUc)$)HN`R!;tP5yb7f|@Y-wi+K(q|#|@flzgQgX z7TC!b+0TqZ)j^oV4yjpK3RnTr@jN{wEezVDir64aa61z(8g8ljb(QX_*djn*V>&rW z8quV+j?^}^&PMI<9}4nG%%2VSjA?4$h2FzvtQ=(HbsFrOmb%!toI1_D$?6FsL#f{e zs#HnsuM-?8HKY^61`TZ0@c>P6m?1ds8| zNgz)KIRz=cMa)U$tY$}80!dU4|5Fp5Lh9C6nD39DfB1#=cX7jNu_uzLevV|SbMVV* zO=O*aIKnWPVDH6zy{~Mhn-c5IeMZE-gQW=X5MIn@^9>^G=O@%C1sT(Dndl)D$Ag(3 z8ady@mudv)A{^qOaM)yk>@mih)W;nA9B(7FCAkEEi6<;+5eOP(JN%RbY5 zW8ByWq7=SyVkea&loKP;mcPjwo{wqZ z=Jo{2!pP`GDE*3=)-}j*Szvut%v>?m{RFa~=DU;8+8hBu5|LzZ`1256VJn9}hdTf{ zObM-tc`pZO#`Sq5?D{*8%M1S@Md`31({MeJQZ8*^XvtZQzY_{U?ta3CO`H?JpW&yT|{)%I54`H1*97A31#VorBMP2yOoF=z0;?T6H_~ zI>DXXn-KTO+*Z0Jd)=$a-Gh9?w0qoc+eL0GtPQ${Q2s$1ZqkF*uzi!w zW@8@zrU_6dq4&=>A^aMVYvfW?fyJwGFEIs?W=OUpwOK$<0n~$MZYGuxI&yj;SVM<9 z0d}s3Ap!TKdtxac;T~4~*$01pT~A1O&wNTq`1bb?@A=F6jq`6K134kPq#w{C@>MVX zFS)bJzyl}CM-lW(ITSd3w($QOeKt&Ppd+S*LC+kXLlObXXOchLjU~qsd@vmvh!K9q z(Puxtgg@KxRO{JaYae`hDS@`+a&$qUS^2(*`4P508<-wN#Vcht zOm-%LUJA3#Rw9GJp2Ba2*}%;xWx%Jvbi5Qe;nJGf+L2=& zFFsJJtpYQ{aU3)=X`S|K?VU-ifV7 z)~h*k2s|7XU!|{~+|LJ|+1>I%`E8$!uxB`q{Hf;crPgu1D~OwnXpTW_nd_WJ!#qzY z5U%ogxJx%=LzYAmn~aIJd3L`&j?M){PW+c@C@n51u~=kKzlr>h9296evI4@hnyARt zV`vE8t4Ht|#aCMIXVX{SK43_lu~z+IU>B5d{`j474Ch^0j$tylvNh8}8 z(MB|~*}~R?IL^O(3C*Ddi)t8&Q>R;R`25bDYX(hxe(Mjz zYfGNJb<(_>r5!bmR}NT_`PR~#8p~X_TswXJiJVQNuLNnCMBGh={d`@ygnZ^uEB$}V+DUQ^A z6K8Q1lOK;G&@I2t8^V%}i)WzC(qJVpSQi(qGs{)#5<%JmhF;JOJK_!z!~ZX}*b$tU zL(3#5$CEiP7R&cYapcZSt#QZ2MP7iVO#hKGs;_XaGM~j;C1-I@=L1R4?G`>ki}X7w z=k)~eY2 z#=ih$$B{@VI?wBmBPXUW!|O%%MqR+94L)bMZ8!KB)E?NkkcQkZj$dgCFc;}FPy^&1 z_jbVcj~xK55=*{UuQm%S?QMXd+sP)H0WW}b6;L_>D=vV{V&bNDV}E+Cb`x8 zF4qNQOiB}BH0nR?dHou(TkENtZen{ggW6IY;fNIx4Da*(pARr+CF}drRz#p;L8k-( zLDwp24zg(u^1sR#^YU|Y%5w93xw(0{p*%xLNpYtxb)Acf3SqnEvw-IlYCdM6{F{!f zBh5m`j)kHBR+vzDhAvF<^6kCyhvkd;`Gq;Tv?&6)xw$?|Sy`vf^NLC;i#v2E?ow3b z=3+F)C1{)MNf$d+?Zi$>>Xg7T&~BpWpyP}^R`ExO#&ZAr6q`hjH~0j;|JqM6LNLV!mP&fUk8qMP)24As}Q@RNTCul6DNn@XOS+c(x^~UD3?DJfS!sO4<%tC4S58oV<#^YwiB7=~Rc!?h zI24L(6#RZ}zeA`rc!`ULmf*nbw6QS7MclPL7qLJ_4nf79&Ju{17}wj%yhM4|xSZL! zv9DKVo>%1fnlHvf~%d5_# zvmLZHq@q9_)?X7eGe~4{oWwZI9tRzUk~3rJ;1$o$tfyzDea8^*|`f&JeceKfi+Dn>1Sp%%~xD(gU5Sc#gjpyB}!QVT)N$I9>$ z0grdLpLzXAg_he~N*@%07q_&uxI7`ni;B9oIHBFdEs>~M&a`_QJ-fkYx*{`#6@f$e z2hj2&Ff_9&lV^CbQ-&8iWq1j#fK)+-7wiYYUTLS>c3XxQoPntXFM8M;mW*z-X`t_^eKO}*%lRZwa{ml7f?Mc4bP)16~a*G+|$dr5F3?X!Ulj=-Rj!ZK-al}Bg!q<@9 z;w1Ek3o#c)KiAwSX=c315(t9p?1Y+!!X8fqYl|yfP(XaX%z!7y*qGA*bY7m}6_{kO zQh4r6doEum5GEjeI*Tg<(ai(kg4;G^Ln?))Zmgl39E_GAZJ;DM>G?DXIzkcbZ8jDu zuzmIF4Kv?IR?S!U&(%I=*$>}3@BZ}*D6{7Lx^qnzb8AX_efsr!Xb#04k`zfT*21;HT{VbKo5A}%;{F@nOd7&EDRwoeJU>$QK_=G!Jm zuV8hz^PB6n(^;(7{$VItJI)KLy{I&;cGzu<+HScStI7{n3eX+-==?9HL#;(+};TVFl+)FVKsZ$`d8G&eI?m%)J4+_9VJ_iWn3=!)=UJGqfOa2n<>clTHD{?v&6uS^ zkY{BHEg6-SCH9gGo|(C%AyWOb%*M)XXkZx&h4g0}R{_q_XjU|ja?`Q*MD zJE?!WOwRWoPGxd_X#2)u z@Y5u-G+9v#e)NB7Ro~&J`6&Iq3)WS)xomP%s`$xjW ztp^w>8XpzeemYZIkA&VMUSXdNu(w|*!d zX%nW%x~qq|VdY+{y~}fDCtw5lgKC{o__$B3jLy#>+PyE;Oho);6w>vLI2Z|35O29% zS}NTuoq*Y$`al6nl4Ld-&0&5aqvYD5P$0Wm^$ep(=KMet2IpI~J5-%1FrfzWo17Fa z?<9f&Cm2JR(j1Fr00m>C98lg+V>q0>!c*dTRV?b`U12Ncc@SGazZl|1&ZngK+{hkb)CH)NOv^pV(`V@G)2phEY3I^1a}T{Q zcE^;iwMZtSXXyT2ulU-rJ*+I_Uu`+M567n8I`-;<5t6Fs>TcUje`;HiXWDRcZrV*Y z*Jai_>7e?0Ka*OKxMh&IiDtE5@48)p&{eu!;A9H9MM+zjkdtLfmu0$LfMl?47dZJn zmt@jlG71bCkTMFi$>1H_CZN~+5o*?DFt0i9ay8RV(rf-m*PSKjV8$!Iwykn~pN`Pt z@(yKovfTmkzS{5jX~65w$}*-S$at#_Wy!jo;zqfX#d1gxGF6}C99TMV=)esF<$=_N zftUOhl4Ohc301-+{mE3cYYMZNenMS%88)GPy!2qb^aVL7nfR#_f@>m8(!)~7&jl~A z36oWiQIIxU+;e*ZbQEpL6WEseN5i*TAx!QDBM$29B6%MaR6o&3CVAPyuoZz$b_(!F_B zk@xv5f50=BK@iP?(KAA z1se=Pi(JpLkkOS~)u7sj*yW*ZP+fT@R9(TxVN_1u-gXDl{|wqQYjS2M@6}h0x{*w= z{YOrOCO@+8T%0*mwZp6lEt9Z1ryvn0Z_Eiy1GR?|wcG8o?9~&(QzVFw=WR#p&^Xe{ z4F*q(ENllPqQM*Ra@;3cqMw*tucrL%93Y=M2@vW){QGI=B^u1sryi{tn_KAV+keb8 zORna*G;`eeFKc$YPGl~-!au<2h!w+^j97+WhFwIb^KXUI&(wT#k zCr=tS`_^2fSs(I4OLVR8s#_Ls|E{eg1P$ZNZKb^gY`y{c2DG;UP zbL?b&j+5L4-is{;Bc6hN%X;k=7r(S;_u}rO)bbk#Y47r3M5ND?=RSXNt^ZEfm??6G zl>>2cDhkjV2XI;2k?+Ej7h03D)q%+kJ)xuTNh+q%^oe0s{(d#Lerd zUP9UF-N&a`M;F1pH9EYv{aA?QI@ovEOOv`!>s>x_XbSbK4L$ey!3GS(4Kw5nj$OwY z_$e;gl@!s5o5g*=jO(W$*HvwHQM@R(fafTdKH;UWMQNOvPW}GG!CdKOvEwOo(kEE8 zR%Aq(xWL5bTc5BVuu9V`%n?kDwu2z_NDA{Q@7^U3YG5}Zs&M^M#%1$Lj zL&Hr2CL}xMiC@W;4LZNsi5z5@BB=p~s`SYt+NqDWZ)bmaQfm>ro&$XIpRMOaMcYo} zwHCel4Yw7R@-?##kxDx5oO>y7ilxbUVGiVEcV2oZN+S!F_I-xc)j^luV4hMbfxejUjs(3EPw7$n{r`+mtl9a;=e8-a&4m)pK^O%S@hqZ8@o|NdSNHzJ@)3)?zGq?brjW zlY0QRG%PoFJ57-Gz(Lu8(!6%@J}5Ob?g2XXe16L%<0CioTRzon#4SJNG4u19eeLok z>g^`ITW|LnD2)8fPFj|Iq4v4PHb4v?!zdRB*D*KhHwXv*C#@~;SG27d?8iOYE_o3= zW?90@gP^P8#BE@iKpqAVNlY~^%xDms#K*)}tj98pSspm&e^4P*sxmn#b(ev#c3tIvvOkw$qodDdWlVOy%<(i`Hd zoLIPsO$O1qDN>>acPI z`I$+lj3E1Z>Zr=}i&0T@ig>A2Vdmhy{-zDCCv*=iT>u z>sBt4M@N9=ESM?P%M?^jqfP3fSls`o?iQhkk!2QxPBwNSUjzE zzF+m)KNfDse&yMAGkNCEP)L`PsW_yc<-z;d#H03+JCiSd2_25MB@0dFs)O{Am+`+s zDkdVSgu%L05GiP12n7Sl)N?7RAimC}!U(-$`wO^V+Pq-8P73dfa$y;l3sgVk z@pvweDPgcEAXQYl?7mSe7T3!zj3=)h^7!4PJoZr4PS>UKSYF2Eg5L5o!u83PXYjhC zhV+*Ag*5$8A-OQZPIG$(8=uPsfRA|PUeVH~Yh&g3F}M1uQ<)r>!lbm!BdL?0=SVu< z`M97o5a5I|9Z9_u*1eFd9du|^drr2kou8i9&b21J_LFV+a*hHh%)Jc0oNoJi?I+*V zB~&g|otH>~%k`Gv{Ck&=Hw;lU-pBRxk7Hv^(6=t0XcsPEyr;_=>K#RW6z{t*FFD>x zIqXUwK|fA}clmfz&9Js!_-ArNc$Qm}P3F0u_4qH`&;Bg#R6c^;m+Cf(8*z>`av86u zC=90E!Sy>WT8;RQ$$M>x!sf81Ae1^NEDn!J-lRYcx8G}ID!j7)4|{I{9!0gS4cD%! zo~P=$JDoX%06`KHLINhFKxP#<3Wx)PipVH~33CV#!=xw}5&{xIMI536hEYWj5djs^ zqoC+f#0igZ#NixKlHz;UuI>;#-h0n^{^$Sx`+wh6NOzj*?y6mTuf5j0-t{iBw{dWa zflxUZbLt9XVBnTJ6}OX1rNgKY{Ro*gioNj+4XO%hf6U~8s~4FwWX}j$!{0Rb1I($- zly+$|@c831QtA@stEth>ENT2y0tU+XwP2jUzn!XDAok!D9kmhO5jhv9s3-=HsoHEd zR9h7oMQb3=QycWU7z>5W<^;4y_r?b!VxQrm;9cPixqnX1 zc`Wls{|x5}c|Qts{1CpLncOkHN*-XZ7_B4W@@qof40gXb-PN zc|OZw*OWXuTXSkZ&wdp1S+CxsuEPcV?tR!?kB8L)VQ~m@UYZ$#-UX66SPsR}0pY`T z(fQ2rR3P#GSkp*-mFu5Qc{=^mKN6-!BWu1#2QIG-)IXinR%`GWg zemdD%{nJkf6QVPZXMernKR9zS(1?2j7Zb*3pob@`jvHSz*T7WJ0y^F-O%P#J3ZYQS9If%?qc8 zZ$=@Hvz7BE@<{aHmwb?D(yI_EzL_Asa4;K$ZB7?MPd$#)Qh^m5lh&l@&!zpbo#RwLt{&b$tk#E{q->j;=nAYB{2+KGC{gz21WM zD!ty~c!R!Id1+z$qM||3W3ig03*7f8;-9=sNR587jm{bcp)G9^vhJvZqCIvPj>aB) zAZnAq@uLs7p&eJt9h`qU$G!DW{}{|$9rxz@m16yaDl5Xh^-ur!aP-roSmLF_VUw^{ zKE&CqM(ydRKmPHOdmJk$gA9$wYM>nofb%fh;j6U7qFsI$|?wa>n&mjDE4S z?y;KUKjn5P86y37;t6M&xB(>;a8(kPV;zE-6^T5iZfMF=DVCem&+-qdc6zKtix9Y;tcc%J}; z)1~HIHO`f*jq}fc6h~ua=oNwz3Y*gD)6>(%)aFlzKeG>2yMDvdm|q#H7k3@DUlJ$5 zpc3T=GYaEQz56;tCpH(igUZiYhL`!Z^Vgg}N9Ge%Ylax(Gj6PQ>VTVwH67*tCl`;BJSvqF9$vkLj(n zjwPlX$n2w05U6JR5(DeBWh zbx4SZ_!B&<7vtZ0{m13^e{@P)!rJbdQ+Y4+8&F{^c)-WN9@oTM?gn8;~WVjdnYO&U-n!P(}5m#ERMjNW^jW{o8Gs4P7Ny*quAuDULm5X*! zzdLmKoE6f1Ye-I74@fB}l@lA6#dsbyHO=e}MiG#7!Emhr#YkQ4wiD>{ax#AOkx$E_ zjHV8SXy%K_C0EtljD>vXc3wmVdY?+MU*n|T~6v; zXxE5J(I)N4ednKh?Bk=GHog6hM_XW+qK!r;#<#Tb?0%N@I=go7{n{~9v7gsILZ@-| z8!OZxZ>^6#_5fNT;L=j67s*NFb!9!TOX+}UCIBf&92UJ>$WmdhK1-Wq zJ=K7k13Vsqh!C>E(pY(nl??1jbuiv0XT!>ZG|<^=WlVX@gI+#jn{V8ss!0vqK}UWICjggW!>sG6QcsGuBl);NokR3q$EI5)m)U zJ)*OdvRy7=LPHnq)H^S}uUed7Ooym109|1RiwniZR%@Yt`!M%#B~El5U>G&$Jg_2g z-uT}*&!q5Er@B#4Soi}hO(DoDg*4d^Z*U0%I!z=kgGimwIc88?F4t~s>MBZ0kBKWq zagn_7=G?SKD^Bvs5e1pjDvZtm*xy%ip0qRBghDk{u5xiD8cUVg16C5|kxhm!ugziG zDGFvgSHXuM0Ff8)CuZ&`Q3n_jb>aHo0n*gQ@5SdDf0U-mdunQ$4&(21EOhulF`Gv^ zN8{DF4b~@|&nVCMo(LG;08eB^Z@^ru5y103PR$^D<~;~Kz7>~uu631JNV&%nw(J!B zmpasjq8)0eq(D?>@Kb z$k7N}jaIUq*h=jl?LF;N?N9fyUfBQ4FmwB~ix;%l$p!%okbCnLnyUI_?A;hJxg2}+ zcF|OBCeMKSh|?gUxQ;dgsAReuq?OM!Va&0T_P{;3q|sm%yh4%M+E!(S&J6=OQW=BZz%gP+G$`gd1DyF!Ne{{acxr$ zZxpTv&O8TC5wxL<+QQJ{%gwXUoJz4koq7BNrY*FC zAWor70p{^lw1b!=lt?Z&GIV>@)e&G&;4F|if|pg!kUP+^b(F7BNY5elSQ{UIirDKJ z9Yd$-ix~3^?sQvxx*1%hJhRDE4D^SYj37;!OkK$ynNY)Ef~JN+LXSW&sX)3#x(b$> zmCF{Z9R03b$oXJTrRB>3d@Nvdl!Rc$g%cYA@(W~SsEeuGR?Dx~@(;1`Y$EoBZ=3ds zU8P{t{bC8$>*$Ne4O0zsVJFa*RCrZQ2<$>F^-7D8x^Nj)FJUGo*|Qy6{z?}dMzqpG zNg?fLHvAi6An!qmfsunoc{XUSD7dw})$=J8eW&x2DAaXhMIym$C!FRSTq5WMl-U#U zuN3#G3I%?4i$^g=l({3JKSD1;J|^Fd_Fi@`Z*E0Ciysg|ydYTMbO0f?8p8v)|EU69KnAGPX4h$R z*u8Tjtlg=fS$f>YjS=nG=YQ8ej(d`&=dcPkEjJr`>e5`ATG=M!xeB%$zlhTxFC`2H`oN-))c@ zCtdEUFEYbt03SvFiH6xRZi+>O|A0T39nx8CKHL7P_N2CE9oweO-or9k4qVFzo8rY@ zO)rZ3#463q&eOF+c*QUm*B%jWS1m4k97{wQ3BRcs*pBQ~OhtqNwLeH37$sl1-|sY) z8;x-wi#iHT2e;LcKeJKR{x?cgs>X1bxcvv?6p$lXDVqT@mMIbB7< zhZS^ka*Nx)`}*4YHudZ3AKBQUzUPl$Gui!k6ZX3rZQRLM7h0qPja|(1_kKgaYri!; z>DC(Q?12FzE}w$4U#lkhA2KCc9rrCVZ5)fC4WpN6QvA|7!5PxxPL?Wd})q{7$A=g#bOP+@CBVH!6 zMI^l(Ts5D*`ft2B1zkGCk&!PTjlJBw6iit3%Eb;t1lYV*@Q$&^_!Wb{3&fm0VExXX zW&N~ccy42@KdOKBLzYpqm91d~Y_L|Z9n?l|t*P0~R({W1+V^L*3A<}3597e5$@M!K zM@Rkz{Z4MHNb!@c#PC7!Q)pJMCy~?NE7#*YsFq|FA#RK|1R!o2$MZy2v{oWM{&GBT zC^9`$`0*R`<1xW__8FZj3A;{DPfl(|=j=W z`;;I56r(FxrmX?G!ruYsgua196l}JZ(!5m7$>1;o5);kSz8^DX&>k3 zDkbdHb48L-4LkRPGS@ql*nPDi6ND_F9`QzNP+|+Xg85aEZmisM_DB2Z>eK9|o z&231qgmrcZ9W4hOE-!UK^dfJH->r(+-L6~hi7IZflK3R!nbW3WSw*x(hBCi~yNZ9}#F^qE?4U(}qsdVx z_mprOnrvLGDgu4qG@ZE2JL$@^o}DxA@0&mUe#ciOcdUJ8X^)CqM^`^IW>5v@-E!9c z^YdsiwVx$xDX(q+^MQsFTj7&zz#aP)Yt94psD)|+7-``TM{DvYFA)M3bBFCkOpW%WMu+*fY?j z(d(&1{)V%@NM?%62mz>Y4sfZU2NhEU8daMi+sUtYnAhEr8pIKDF6%s@aJ2s-S|IDn zCrCqW=>GJ5yWcv(T7C8E%R`3TzvR)XC%!A4I(T?GARl?l^LI2XJ3QhB?ZnO>XK4M! zGOo|+l zQfTQF7&`DUg!@GlkLdR~lX1Tw7Z0PgH7~%cGOyA$0?I0t-fR3pay53)?js-jCaebX z>OJW9_aViOry3wfh`{P-1C+D?l%AwVY}hABHuOM{#0^j!h+Z_M@)OeQ(g%`^gQy-J zM@v#Ygapv+ua`1J5hY$g>`!T(@9m_Q2UDGlqOdS8qoGcf6xgY8c-0bMZm|{{Bf3Q~ z7GGgZHoh#1+)uEh(=a5rD(p$Te1>j3h5`?`-{cv>sAgtTl>vzqyr23mT4xgL8>t1a;>o;Xp?Ud=u*BA!Re&DI^ zUi-WDC3AhV>7&sSbI#T>UODvsO9$RK)_^<)h=4+=s` zNJ_&iwxMIM7>TD2n(^_8f(;?w-Uigs(<9&_62WC=FE!>wr8T-KCz`9BfyC;N!Ur&j zbU|kTJB(Qk@e3mn>q1*A+fXr??gPm-Bv%}SZKUk2-_O^P3*T+1*y%n98N9TZ3?4>} z#J_3W^koAz8mt*2bDxDmQ;6rMFu!yP2F)R=*o0mUk?F`Zpu~uh*~n=}b5TK4>ooLZ z4u~BqNA;d@<2zTaO#Wck)*TSWx~-7n4EU3lHv zDRocGh-_aofQVqiP_0fRMa+mWPA%9jvp|Sq{DnTh%L&6O)I#IZj^T5`2HGQWQbcrD z+F@7|>_d_LGgO4^Fc>J*I=us{CKMmy29eUy1nr?0NN#QcIUTr8!uU{Kj;qQ<K&y)@v1~%@}g*8XsNXNtj&BuGH=6lvLIqpxE7es$faWJ ziR1_}4CMs_e(8m}sRPO%15NOq=~bOzkluZC-2T-~$A}|1Y5fjF0e4`fAK`ghA4Yui zE+Ir`3NZ;+?KuMbJfUiYKc{F}(xciI%hITLss$=>6R4e=z+91vv2gbjq?bjfzXD`z zYrK`~EE4KIj9^VH!sv3ubi;s0!)G*(1{f%%h;-gk94vAtuNZpsyEBI?-oEpm12tm0 z^Wkx0A9k|ZnUmL=fCWCHt<~0O>rt?E>LTm3qUj-)aQwJ78P5Gre?u~xMjbzLVRcb? zp+fy14J<1G1@Lj>7$Cw&cMTWLjvg)T#L+HczdCS`bc^j4`z;RnVcWy@haJ))VTlY+ ze2_HIx!ftYaTYkm4CyB4XygZxAVh#FyP&{}Xtt1IIV9Yj&f8rwvdZADN-i7ceYS%U zXQI*XbeUWNs?)Lk6J4L8NZ8<^z!eeYRvHyl`NWDNV|??Lu%OO9Cl_CaEpHBXP2}Li zV}?N7RAJcEsqpNhoO7QE4a9QAe(dgD+Fzcot24DOVgsHR*Efw6+i%e-r609zy#{7? zXOn0YWLQ`oh1jlk?PI)Aeu=#yA@;_ZBgCP0vbZ`Z5gH7II%DVF#_mm!|0cehHc$_~hmq`E`5nHi8RX@Q_J&iupn)Dod>bH8av58d4 zX)SKSefC1bGOM$bS)7u`lN_It?{PZ(rfMYwE2|(3wxU*QA%t}Owilt7R|%k`*|Q*D zom?j@x=hTWT(oHQ;*nE$C|coEmJH0Tc2fraqwc|*Hm>^<+=SjuhbPS)fg9bf(fP=( zN3=FH-XV5wP|xom{ulj5%qSO*DNqcmVIY(l z*BkI3>KM!@SCA!>bfYLM1ss>;_6vNLL6(1D2ZFwZd-e`%?_}`4WbE7%z*}T{~I=EM~KnblQvZQ()4$ z8b}JLfz-{%7YL#z&u0?vD!6*=qUWZt>~EG%)qWNqFFCZ8b?wq+!P*gHYVMzWovQ6z zF{mKJVCq$0!7{rQ>=<5^IH_dmnD=JpF1}-UrP&xBdDG%Y;3aVeGb}tIk%PAVA~Son zj+4ML5-yTS)-m9z2BJa?6>d3Q6=N;G0+tP1UKU|1rC)#qgd}b)xz`@El{{x+Ab%VI zAtXkH3_T~w9Td@Y^jl_p?cE==#(gs$duD3sV~<5x$1i_?3;ymG=n6jnz`O75-t*4K zyJ@y{Mf7XMY_oxrkZTtFMypsWxh$0?!NATDRO`}dq~wSIbKB_3sySdnd+S)dstA=M z5gpUDdJ_`FiioQ+;!JW*7M)2?f`g6Mx4}8^RlpfOM=e$@iF|EPRD(37Qpl?T(VYPe z&FHn_T)4WlUU)ejvNq znB9Tu1DuY0O3lGzrr7JrGSG=ITtFHn2 z7LGFDTl_+{nxv2mWq?K!CWjKR`d!#~g0``uQ0Wi&`FzGl)2@SYz!mFT4V6)1*KtB6 zr2|z|rYBDveEr?2b=N$;bk3HWP*pa6!W~@;Z=WQVH_cyPJLKxepQ20_B08;JuE)&v z00Qv~Y?%wVj-6P#k zqaM=jH*Sh@&fTcf>1YATz-FnCsdF+0>b$C;kS9yt2<%G^_-+15vLDa`^W+Qh2?9rT zb?6TsD>vXozTmhn?OF$rOI?7D)l=Pqx7#P)51K1T!Za09j))`{{&wpi> z;ti}z`zxDR+=VY#mreH}lTa#FIv@=(gv$`mf_gvZmwyhnT@ybyk zJM7}OutZC^ReV!jU^0e;kknR?rx}+DYlMx)UBW@(xX}d92P$o5^bmk=V-uJSP7y)3 zvSlYJ;M7C^C)nbnK}^a#8oG*aiUfDH*;pZ0Lk;4lmo zQSmDx2)_}=ix6E*_x~E$h5r+Ua|?A)HwNv(3k0s~rLCPXUUrwZe@i2iR%_3)u`p=b z(e-SRI3Cd9-+)45Ba8%`TdBjj zl@7%**|FXs0m#MFZ;9iQDMHlUeDi?f@~MiL3NuzmaWQX!;*NXz*xE;Ulv<6ee&Gwu1vbGv6S_^w~qh5ce+6Xvy~AhVX$BZrwXs^65L2fAZ&tL z0tpWUd_mInPE8GiC{pb@gt$0h35TsA#R~HYP}bvxfElJM^o=X*A+&+z2?!@ZYwB+Y z_QX1n;c?^+91{*lDgyMmDL8HfDENeJ2Lh>Xw@{g?q)twqm%2VxPHUB_Uq6M(c0JI>puEy(qpB=3T_b3YgPO1cy=F4czfU(ZNGN@*Jqz);(6Bh>w#};U%ayUj(uz* zG0`}?jQW-8>@wkjD7y?BmJ5S}RR#LJ9Hp0WFq4pCZk_nMI0h;_fRz$a={=k{iTAX@ zk|xwN%D=~Z^eQewexJup0`hy1S+pl30#F7rW>5JzzPc#F9@IdQN0pY8{|2`?}DOp zzEb6iFhiA$4Nr+fF?QKO%&U0&&0?Ifd;rqEaHk@)Ia4@HF|jV~&G!o+vViY6V;)Eg zWt!o*kR!!aBrron6MR3n!gp}@x8F*eo4%Oy)f;M6shNw0patFDe5eWjRJjF!6)(t#T1^VPtjc-(Illb{UE-(<@~V6W@vMe zhX0zOZ5695ePZZ8p59}ZJT+&uub3}Yo68z7Y*(@++KQBm+CTQw%-~gN7>zXH2enV3 z{Z{)S|66JDP2quw6T-8@_e2agn1&>Zro_C&A(07&8K&vU8xprBn&Yh&OIbp^FCig5 z-fAUHS1W0{S`rehL4i~`cVMi*GG38N!bINY9-_T2YunL-@xct=MICO;$2j zuu32tWg?($DX9rbA#~jF=;X(Ybb`TnqubWH6B!HwGndnn{r|bB>aX8xL)rNMOh|Rh zcQneFq5lqZ3v>EXM(Z`a_rL5&M{69_cO$XJov2QT$Uf{GmKCzsRAuy_HAy-6uiHhV zizirt!T=|NpQ*cCWS#R6E0EhIj)Zc>sM`llosj-}NO({6nkbFF zQDV02_PP0X`hncyN%cl-CPGjNgR*hou-!S}4vj6EmlruShRu0-C^^^9^x^(V`tIDN5FY zap5fyh9OZ9)=3nUI|fFebGH-{mm2mvRLeTL35zvgKVKF0R_#ICHUS)iTPetSyFyZ+Us``?$>UAPUbp>7N3GP&t? z@<(ykO&CTXGI7FaHBoR^#hnCjX!ZE2EEWf3ktMgKTu7o-Vb{$KE^cgaW{^735Xl$f z;bn$+T&H3$cSIb-&5DwI$vn`OORjUFerfm(7sBhP!S98CP8cbE;%~CMV_PO?ojtyH z>L;IT@lEf6P1m6w<$__b1dd3_z4tt@{n#ba<%Moc`hjK?_8HnWe8Sz^S#l^L-+`5V zj`j1GkFQU*|t8NT(UErRSD z-yXQY5DXv17(9JNelVwKDG*A;b9M{{r8->4O`_gMPI zrcIoJqVEOrDU%(0!7;vWmI+f>AHEmx3Ls#VEqhmDM$2we?_r}LW=kf%MhfNrx#+!sHgT*6SNgK{kZYHWsHadcddlBxz{xt+cJg90&PS+o? zQh1Q%vZGClLndVz%zL_}6w%ZC;~L{V#=N_Xo*^~l&9??YVKBh#1)8bxm|xW3hUb3B6cA+>YXdGwY|W&n zBy&o9z2s@C`f2Z>c~~s3f_M;G`lR+b@v(0!I<#`r@tUTxS-{@0y8qj8`}JNTzvK2J z$^HL~+dl?(d+Itvg}N z{lbrGrqAmwCdL?LFvPBUF2~_?cD30N$wOn;Qf#$RLl((PSOys{j%kd9t%qumFi@CG zdo>Y>U1r&3Lgzud#fVhC)#CsvBHPhG0XM)ob2Q);a?n2gpmEQ{;6ChAP&%p+BG5S%?R~QR5h;p<-G-je558DIXlu#zMCWAYt zvjGYBzw8B~2kKd(49)}N(K&KOau?S4rgqKHx}n-N&#@C)?>E`noVpygcAKO$o)e!+ zXet%&OK2J@ekx9HddV#gX?n&j_Qc&&5Hq;AmwZMIO-tCAusuQQ;T@I+sGX*n&*uSh zf`LOC%aBUP4vVcdF3v>%W-3D+^Lf>VR}#|`cZ$Bb)YyavDE_em^W)o3H2{Lg<7ou* zaK7h4Kbr;^xo?t}*KuPEGVQt)i^W0>9%<;UiYP{Fkq3u^tP9R7C}NKG{YsWH;55TY zGU%j|R?5Szcdc8sR{P8RY11BBQ>LBCd15eo=!0Li^Q^Yrp=_s)HcAFdTNyB>Wq75cN{S zGfj{EH>!gm^lT<}Lch?Urj8Tuw3b?>F_5J59}$oE(U#ZlWP4%O1m|jr`6wzp-2lvs zuk)S&%p|Xq;IkSFbFQ#Ze>w}nXsEklLu{fw9vhhb78{h~0{Ox%wrtiHD1DHP78ijz zUuHA|(*Qx|Zz_k;02~F3Q5X$)8Ny+zBO&5EK>+~K2oQkJzzaSJKLg|g!J|vq870+F z+mf3s{blWB^o?!OK4Kl=pv;^2=+M7!d*iLAn1Q{SrWLWrfSFyz=4ySD!AgEt`y0|- zxJ2-8|KF>nAgo1pW45@2wYvlp7$>*bocXS6`%KnqS(zB#Q*zA$N;*NGka% zCcK0S_o(=SicL7Xg7h1RkfU=_hGlY+eJ*o?R!<&6KKn$=e34CM`A=%sj(BWd>*7KE zuV4$LKR5nevRydy#qgT0lQC@nQ_*AJ_^|?j)GClwzFQmv;LXIe!}TuAsW_)0Ju&@ z-6raU3e|KcRP6%r;>SueCDFbDk)_8)I=tnIS3x~5H?qUMCw_7{xz{7q%q`!n9d{K=t$x_jTJi=`+tjzesK+j zx|hBk*yqLL7*XmOPAJZBHO^l(nTO>k(a2U7omCDGL*?E~43z}JU!)> zpk*{dOJ}*_$VMV|6Kc1aBS6A#NGy>)IbpQ~U&BCgo&;D>%@|HfK0*3QTgI-|R*Hd> z2lvebY}@V`md?@IkAV|5omAhd+V_490kyD2FM(0J3uj82CP5%hae${y>rI_0nePB>0+;8^Q8m(oBU>yJ{L)Jf7i#5lXq)kA#$DF9)IF99mXv~8R>doM4kE3#;znzY^+~G)@nSH>K}-phnYsg(IF0g8 zB|i&gxdcnh6V`!bD8!dJLU`4Y?AVElvT`X&id`X*YldZhh0MKPvai?dWA1SJ8H>W? z9=#?>fP27nw}A6^#bMg7XxD8^VXeRVJG)AIA6~+*+J|EM=a0Ozsp0VP7--HctdBMy z+3FM8UKm37NODTffdn)uZVy!N$uHL8m)Z9PBR&zCS7&PsT`=H zWh+3E#_n-e*^tzniL4|iAQ8b7JllYy+#a%{1wol9c*zRE&B1L0w}P(=USyAQEJCjU zlkn6bB{aaLfs_)juhmIJDbiwXruL5p7Pn~n*9XP8_1eN|%N8$ZcZvg=wumz_4^CY7 zDHY((89SzyUjca3Tft63lyd$2Z zvZTuR%D8s_)PE@ja~72!?)((qf2r+%*ndd}FF;hqrE^Cma~Nfn|Fb?zlAhV)q_~dK z*0s^bN-`^G*W6fX$-A3sFYBhX`t?{hrCncYH;iZNV=a_uJjP)>zBFvccw`7G)hmp) z(aDFs(s9%Az&ECE0S!bn-^tpajIkUy*f38cJ8pGpg}z>ectW3a~DyiA5} zIp)GJmJ4vyDVmT?(QCO|gEi{u)G5DHC#eOGOnkN8G^u*>gn{0%o41@lcX;leif*%3 zOuzoBsu_>2n>BOwTEphsZjJZ~YZg4B{T<}8Chhw%=fB_2ieBjBceT}&x8B(I?z{UA zK|M_pHsHrcoO9#>V{wt{0FfTVP@}zek4`^nh{We}je9>p#&Fo!Iz+dH3Q;TpP#2{W4A(aSaL4>pC};utS`LkEIB7jnv=t{6dY`PrE_-5gbvPHKB_k z=@mXgF5&1d!HEkFWN-jH`goFXJOJY7)T_-32gIX1X$C+%N=OF_i=*MSX3*{{!CukP zaM@;5vvV-qriHR&AeATcoKpsYk17a4NpdzYatW~bP;oLf3^6aX*++1jqu6f5z6Dds z;qa-5r!bT;ocs^a@tAN-lyprQR1S_KY3fePNHGyOE~SlRY2Pwi?^0jW1b@j1_Qktb z%qE_!R(JX|(pjI=cR+kAGr4ZwU+ z445Yrex9%#n=7ic{{V^i>qxvyN8&46BJpT?3MAeI@`t#bea0>_DH~w?NH!1E1VIq@ z363Xg6R^@8m=dMwfdzdDlRw*x$y0hgipf*A1pxP#5cy_k{-2(3&JQ>&mvDIqgv4-p zX&EbhQG2WV%5K^#kFzP-D_dDg>dI7>@`%{CX$Si%N$bK6Bxw;bk-e`Cbg?~JHy7KC zu}+5t&c@tH5#Cgj7nm2st+qaGm7k7(M|v~)W5;(6gB3kJtwf1qAu>9YyXKEzR&ygn z>M7x{5OGrtn%m8);dDo;0|8UDU2&6Kog1RQ7Mb`bas}#^c-2yCq`6(L9o{#*Vj?=- z=Oi$EeoyI@WN1Ph(?m;9q0E@d;sHw&B_Cnv8a6_T7Rti>@wJ$<-sSU zI;Uulz^LI$mh$z@s{><$swzedda?D&V%BNHi!Xh!|0!+rfR%Z#-8G@_BzB~t@2x$D z?vAj8hwoW?UE%HpJ6P|yZzd1wbv@8@ZpEZ$F+aWFg5BT{T;3$qgd};Fc#SR5_G2y3 zc8<0Cb*vpaKfv0p0Nbt3N(UuB0Jy)X1MZao+*{W8G(pvX5cZac`yb)$!~PI$&qYN~ zx9)5t9#U@~ITEzrvy*0y8N!ZEY;>}wWw&%KC$1f8p`>RGE0Dqe85b82PDFkZcnvfP zZi#Dm32x^ap8WU^arG{tQFYv9gSX{IZEYvCB-wfK!v^^DFg<5Ts0WWnq7XG6_1}3n z%6y@(Q~U)3NvpXJd=-4JUMc0U+iZYas9Y+)xm>EKWw}(#LMa92nHNfdRIgAA^9ERH zdQ^Q#1G(HTR8Glen`DTUPGJdB#xmNf!`&Gi`4*x|)VhN_zRQZIct)d{I}3^dQOb#G z5L<`Q97nEL!bWY;P8`8tcg$j?&x#K=O%dDvpdCaN)q)8H*XFTDY3_tE+T$>KCSd_7 z8lBq?y}BDwM?tBno=C{IDC%LCs;5x>OPXz>5uLk`v^AxjsjJizC7E0rWxjPUW~N=#2!IFv%@Hwbo}OgIN&cr@j%5zp6Y z=ro0)r6M5oaRKxGJg$~vrRl2k4L4&E#hHzL!|6n6Gj!PC>w2-rz@N1Ts0!n#dIh!5 zki*0t4Obf#(e)H~*%gQ2rBP)GWawTN6+v2v=qa98?43m`Ng^=l9gc`QMPl6gBki`B z0K7ytRuSZmHV>yT2z_Ffjeo!4lT%w>ndsVZ(_QP9Paj@QrF{EOY9D;{i}vX@_Jj82 zJvCeZvge(Lu$st6n}_QO3hUK$vt+cjky_hck_@F{sl8IHv{#GO_HA~P!%1_;=|t2* z_6*PIkyi={AX8P(4L(N*&#lT+C`J&S!VF=NW0ga4z?TcN$s(!x zRcr*MHpG27Tq?%CaF|j^AU_IaDBz(~HbsHt&Ozn@5I*>VLfUEZsP@&RN*J3~BVCWraR~?2S+)=yk-p+JmW|>r+ab$GPNOY^ ziV-_8tDTAqKb#Jm)n>Os`~pRiHW!E)F4|G@oerN9%t(h5TBhJ#7|qp?IjuHC9H_Uj zyKHz>K$*A;n!Bi{hi5rXm<6(if{pDqC}cVawc2V|?0OL@rU^P@K?xHc@Fl39=*M^g zb~Xm~6Ssn+{>}ZKU}Z9KW*A(~7Ny!-#PQc_#m3$RhVD)?`e-G>s!qiwLLO9;$$q!c~J4QN=J5B;2q_`3PM30anaiTMr zHR!H11*js2>X&kIU{SGuayLx(#)tyJJ1`LA2k-$3aY$W>VA}w3WlU}aN{S&Df;H)4 z(I=>>3Vg8m7>ekA{L5nS!ipEOV(nGbbqrQm&;pKwKM%36ktb4Uc3*`7B<6k`{V>(L&^l&ka^TP*_wW zL)lBV%QOvi2OsN(C=leI{YL^z`^{8;(^6n5D$|&fMjiwzalEKY9=1)psQtQ{4btA; z_TeY1AQZPo12>m_tv$(Z(h6xez8I2|`7U!6b{TAs2>NMfq+r!*wJoFqaebSK?J|_h z<0v$4(jOrC8Q5lCtg9*U!RYeJOGK3To{1RYLHHg;7@)Q>WcwodafXFf(Qyzw)oMwx zA`>a0irZ;&IfP2Zqr50$dxMGEfl$-rHrpXtFqZA3zjP!K~IzusImfnO~-0_MtjHr!DPnKXg>m$tL_7~sOv3==p_-;F5h_NpiYDuhvU>z>n;RdYZ z^-2z$4iy+GRNM(+OVYAbywJ&OgNZp3n;LBlM1!*UEki|AilGmw;3JTqWBjl+2-j(w z<)J#4j-rY~UBlRzmac<1-)Uz+F1w7%`Y&&+UysXEnPeN`9nG$CBKJr zMZ|(k#N97QwIr=VXUip4=xh=8*=kYQ?Zx1c%n(>raAi@(5z>36QdW8(HX&M4CX=Vq zAN1?~P~eh31j`aV<0#gTvyUcebgjYY2{Vi{ZfSdd#_u!BmMz*Z;?KCd+U%F^=jW_B z$&bKbkS~IAPJZUYet+Js*m;xuL-efev9qR=jSa8KYZ}U(H&64)(wPz(-eP2N^DjG1 ztgg#WvBmje?xn&TD1$c;5;pD zLIKW~B;(`?$fSkyquLQKf(ZZ*M}d|t%4j?yWRKz?do&Fh{z{W+8k~U2d7ky?L#^6C zn+tm=N+7=nYZDFu+HGU&B98$04*v3G%N+tPwSd)&+;oZV7Ki+zI-+hZ#us3J3UVBqfYyOw>XSL6szCY>DN2}?cpgwOSuADL& zwQBldH(P?_g?PxsK1A(MZ8GFkDI+1D6wcvjKssU4IXSIf4KAcBAo?Yjx7rfIFBTdc^gfJ^boGc%wn=~-T2soiq-4c zN%WEWQ5*B>PuhE5f2+OET7STvef6F9_8&R;Hi}S0;VN8FNp#(pt3_g~gp~ZZQ5}^X zNXZA}B~_BfqYTvsR_k!sWXbM#*4kVKmzX5tKZhGO*Y3At?Z`3~-+9#cpis&O`7d{c z$;XW^aTTdVGx6v?8NESA#fde5(Sk`U9|h<%}p1gh>LjA z@FozK@A>#GyVs;6F0eX;xS%bj+_D-H>T%LDSTnt$M2=pYdnq@_>&~QUcr{sQQr){O zyTaQd(#FUx>-NZNAsJokPpSp5BH(M=^D`21BTw571mv*UVlIpe`{LrlVapy1dxx5q zz=t-+ZHU_zCtBis!em$w8c7@W8+fPHNddQqes7Jmtw+U+o~M1xmXSfZnNF8v3{ZhaI{nH1 znjB`meerW2l&w5m&-z}syz8qYXV<;X^1j}qt!BogJwpdhPi_;s|DN)C?PAg+1A0$R zNGtg1zIw7&7--59Q{`6X3r4*avkzF7iML{=-oXHu%v_g;939$jsmCNV2lBiyBIpXd zfj0uy>ZtWEYHrWN3|MLH2*Eq2;YFIQM8+%j;|iF+R~?1S$dDUwG!p zSw%ysYp-E2S{K({_V?@^3Skdqz@2)j-ev(c$`{X3fcHUDJN3$MTOx> z^%~q`6frrS0S6eyMRo_!c!yA%?9cX#C;jLAqTlau)k0rC04ry;IuVQcT~fg5v^d~? z+s#FRfZbCG#Q?nuNOe*MCWNeu%^tKzQ7%jvY+Pq46620I%^Y5?26tR9>6+49u130U z#7*XDmQ19u^fEP|Uno=a<|3n&$-Lr1)^Y74aD@)Om~`CWv~id0-deNS?uWLcVy+atUau`s0kGn< z>W8m^SPWMe!9}@jmDsUkTa+$(fMzbS>NGM;BxOtWX|Xehw@JGc_c?h!PFlj+Ke84l zpRe_XZtbqRsB?7v^K+N3WyiI)*qTPN^^Hq-F7Dz{+|nmukrNP2CVMH87GyN&Gb9_t zY)B7`G@LVFCxXm5>@Wa6gCVR` zx{_SO#CXXRt`y?q665F!V|G|a9^iH~gD$!sGDWw*nO=zWM(dlQ$b*aRsEbYFSz6w5 zZhObSIe6(cadmN{yWRbK-Cp@eZh4ROo_hC!rtME7F8E_#q=r>%fYUqLCUJ^h6;+q&5)0&}7cdxD_BP1xOfE ziBF-FJZVMK>-Az^<272z1t>bv@Q~#bPs&^HsclsVYk+K03vIH6DD#Iram?nCP#zDv zqMrw%KTS$;=wj^#c;tJu0|7P5f#XcWu1XH4) z4kcpx^h<}g_;lkdI4?STlkfoV6UTcUQqxql?TPk&)71i+uYjz)egzNkUU9mW=V_J8 z-=uey)z!cGC>2JpdtCG?c+WVi&0yBu0^YM!?-@r|q4$it8c{7DBY69C6>g9HlBNRg zsKj0~TrU>Ej>n^iR&ACz2`(jLK;>i|7#DCWY3oYKGhF}M7O`m7Eb_p$F0ycO8Q%fJ zs?C%Q7Ev}dp=1G>Zd6(#JB&BcI;H<*p%K7Yqj1lt`$pjsgf-H`>@MtEMq%YH!9a0g zN=AMdHYm_EKL)1X^@cbn^HzW{`+lmwsITu#6X)`GF z1HYo9GLA-}8ukVm{Hf{O0%HoV_oQp;$62}NJ8t{@(zk>x!I}fd0 zN+fYvrA%ZobJvb~biLFQaI+{R;PKI@4>4RVG|(sNA4{DjL}Yo8+%e9Dz7|#7LHN!j z>*d*o-+v=rQS{sJoz341>9Zg~w`c>6Z>GQV@$IAUe2kw#(>a`lEF6KAfNVE1-!`DB zP@7b<86{a{Sa|4;OJ3I|kJE26Ka=rs)0Me?0(y|57Iw>~7-a@aj z)?)GEBr)Ug6JPW=`p?Un6_dnTlnCl zq1p@L?Kj-f^QICSiwn5&hrtExAnf02^yf%WFWsx=;0r^c4)Hl+n7%t4Rua=vQxg;0 zRAq!voycQrWu?s&j6~woWI<@3!Gov-I8)ET+BqC){!mzo_oBa12f4j>iP;>#q&+@( zJ3g#^`;0X5R9rYXHH4a@)U>qhj10OU{K0}Er-YnIxLxG5Q$z*T4ZO-L;3)K@+E8Hp zbU1fm;K5)txF3VvJp&OIciD4dS%x5PC;c^=;L_(4u_PrAnm`>h9zJRN;DGhmBL@~t zx@+8^X-?K&J7t4J{||<>tn13f?H646#<<3PYvz@R?7Py@rTx0>|JzGL7FSHXW-5L= zS=zt<;BoiVh#3!!_M~DMh0PbwnU>=IQZI}Qp(o4OC1m4DTZJR};cOPlwtp8*9Il&%!pN$@Rqm5KwM76r|BZ-L#36Z$kR9~``mS${Q+onxnZH|I(P0C?81-1D( z`B&6-Bl8vnBePrYZlgfRxyd!wCA!L{8ISVZC&*n`jA$ExE)%_?ojNeK9MmBU7BlUv zu8T%)1xiABGa;BNWL?1e!)y3=(uc#%;rIvV_2{>W1d8b9QpS|LHQlc9wn9;uOD|Rc z#R97ZJ(g4RC|WLNei&5hyIf2<*?Gu=x46B2UlQX!cPbmSft7vn(RZ($`F!Te`=*_h zJ}GYf>g37tlx53qPP_FU{}W4YuiSd?)c12HrkBnhI{WadS>I7Fkxk#Am&nA`7na;; zeu>>SWTo|yA=>i6BLY)z?dAz4-`9Wac?B~4BCJc4)E1|NS z5DEtZbAlmXFo+^a7bbrDImsmRk(}Im4$4K(sEPO`&dUgef|OU5y_i#zoxVAnrNa{K zSx}q?{vb)tIj>V%5zj4hDC`J_(-HzGM*V4fFlaMo)k3guubP7UlaSE1HZ3=87^vg5 z%vOLDg}YWj!df)u7zrzfMHohYK3p?06Ex}teC)|C;bzhu1ztf#IQRocnU1>LUA(7!C~_kFPSxG(UN(B$l3v) zc-t@$FiTruvubUdGA?CS%7IiFOXRc~0d62Fkx19JqOWaRQNWx}%*gl952U9~q9?f{ z-xufcq(<5*qS28cXC$B#kXd$kA+NPpZHpZ-5b${71RP*g(vwxd2+76)))DBkU_~1Y zK~WS@Q8L@n*nvugDN9@-YIcFA*!0QdV#M$}<}&vFtd=S^nZqEQN{zx{gb6I5A*062 z_}K{^8c0J!F?8~P=a?#rcXmt9%TWT6d4KBFE7(62Y1h6>-~IO%U#)GLu{f*XCb6~l z!cBRT(&O`*3^E&|T1OoB3punD1Q}H5Xe;^X5WY)H0g0&q= z%`HxJ&XF>^r!OpqS4iXO$E5Un+jLJ_7``IB6D^~77byA{FXsM0?09-ND8ba8w}T?P zk(C8Q!XGhB(O(qv^2=z(i)#SzS($nEcTJ+u$?EbhQS3jMj|?8?>%gZ?QvxEc;_j; zS<~KqmM$67i~ho^5ttk1jc-p;-lO2naJL3N?q=O)yr3=XGwq96r?ulO^Xp?Q+xE?z z&Ckygz1p&w|Hyo194k8C$U37r-8cPM+nF=9;|O+8&2`TBl3_H0K}BdKWC@+wcr_CeE!jFmYto~t^||joazEg!WB>hBLm9=av+dLuX*vNWa|E%SCSmIOC={c zBZ*8H7)j<5bU#4`#N)o6;~~M{sg*+L1^& zTu_>D;0ks{sh3Z@_UH*NP^j%q@aB{bOdFXt570|8LBKYd2((VYUW#%Ngd=hnehVPP zPLqyn5=|jXN%v(6vYG%1=_x(Kfd%?zMUONo`OTu1Pb9VpPBXj`{LIV*Rgj*BGB3BD z*wjekACarkgg8CdO_o#A?I{eWPI#t?n+|a&?z2H2wOK$^tZF*(`Q5Xg95JMDu5{I$ zo2oY~TC!&K?iW@)vXu?IYsilNcTUWEXUe4EQ^eUf-6Y;Pp=;?4)0+HEl_-24)NS5~ z*)wig(0SnfqZTe6v1CD9kKE~Mey9F3vP!yMdrcR_qz2@P&KW<&yhy`V)~&n5CPz=2 z99>F!HcyV8tY^=D#U+`|lOt2j9GSU1Q_jrnN3SK}>+)!F^ef2=hah|?K$FS@z9+by zZdSs91`8%45kF~)5&A<$+f-sVwMv30pd&p!J*Oab9vD@8x}>Eg9zqM}(hhur(saqr z?$F`7(wqa`S@+U5ZRjJMG+j^}(Yj4eo8F}bcxfAi77N@Qn?_n6*tFLwmm)WGZU+{y z%avG)X$Iy3&eQ9)hD$>sOR05$bqApyxxHUihlzu}ocHk3`YpBRub-Ux{KVT!$Glr6 zb(wS5$_8@yj`D-BWKONY5pJ0#;XQIXJbb`8>#0)l8_6<=sxU4wRl(fP+06kQ?e~h$v%8a z_SxU|U>|9p!V;6>mfPpAbq)G#2w&nS8jN*sfi1a&kwyXJoR9X;yYDDQ=#X z#jLovN9Pi5)40h>SJOwPFHe`#(|gdH2oKJpS=pl`E9~T~&jkDiJ)5}o;my?2)GY=} zNcISd^rE|jgX0m{GnDL>M2v|^Nm)r^k|QZ8seMlTJg%_}OO}veK9tY$OWU-g6QQZu zu3Z~U!1f0USz&2vDu0!xW-?1oK9|Z;+oyIb&7oJVn4UTKWTbEC^pbHd!XXHgm6|Cb zX?B%3o#u!XCrROwxV~{TEh#qC?G@rADjdKzLq-nn%YR|zV$%}jE#2uMU;SU5lVEtk z3mV2uDOA;>d*rcfu0Bh>Ag25qHgJ|zyUjgxQt9@+OYg3a+;!E1qwkqAaCX1p32X}) z#gQu?U%dF?HM_U0dTa~()99#CoO<_g$ba1Vw*e1Vls|U&t*H;(J>;fQcYD}gD%Xn| z$6NL3xMcW}1>v5}#&kg{2k3IfEItdB!*PhKvJ|CNY!+tGENoSh)jSKcSXNfYwk60-MmJ8s>L2M} z?w9?3K6M@Vx+I!~9ZQnJ+%~0RiUFp8eoBeK=ya)Y<6I7x%N3t$CsEva;O227=x_*! zGFV1w2!RI(%Q)k>xB;ZqmtPuxpgn6}>fvcOZU=#SDxP@Hm8E?C#bc(WveJ>*GX?g6 z^c4b=Y9kS#I`cMSPuq5T8ISO<^b%g$TCa_ix!R zRz91hYDIRja8=E~GE5ME^@hcZ|9IC-WtFVY=w8oiOP{tiz47~r@w;79pBNaG0YaT= zvory@vf*ly`C9op`!&*a?rR;6el}-cw@K(@PKHjk=E5j0eO85ZMhCCBM&Ws zav@j@)B+mD?99x~B_+?#zP3YgXJg{8r}DdBQMYJWQHP@Y7LUBE@1~yP>8`CtEz=mo zRr>kGPASVhiB3uCh0|rTu?Ly%{UPu`f5ZF6GekYKqF>R(P+$=n7=QErF;J0=iI99W=k^3=RK#Z?{=1F z`904$_uPBWdEfPK+BYx6SU&uY0~cNN*((#nLaHWf)9ogQ^mA@@f)P+QX{^J^xdC4uUM_UVG#EH8cZy?Sn{g-zz1!s#MGW zPJ%1y9~`g=b)sb`E0^eU-IlFwMoi&Gu}gy+17p?;U#yI7 z?%%%uz{S|{_U8JDj$|&rSQ!dK%-RQ+P5^(xZ;7X;8%hg>g6qG-cF|Vy9uez7rno;+ z_UY=%bDaM|1gv!1Wq#x9iec$_^Ak&h|D`aVf8v1HhU{dY5Q>+xpoZd1y1ob=}TQ=>X^TgS~fpDgRa(b4iyi@RAJH#aO_ANtKvQ~8?o zwImzgu7c7frt}Qyv2N!m##_2mWPQ?qFQ@=YD{GAM0&<$YW z#^%yV49m#Ue%D%gAKh5vZ%AkDU*<)1vH0|NOn?2-gXZU#uUdYu`5k7*((_B#>@+)A z0{K|c(LGQXF&EKmVJ2k0+h$`T2Zsr^@3z{lZDpVfg*T=FE$P(+mX-hxBTQOw z>5w29m9F$uYw`|&gGCpj=Fi{u`L}JJ8>-~ep=Mn7^Fim*k|X@g-*0Sm4+q>^z0Ppg z**vGSEiIWpuV|Rxn4-71gE5xvJWoCvu58*de3P=s(E{93v5-KDZ<1mkEq<2sw_Tt@ zb4gKjNKwQ`UknnqM_qFa6Ea#jI$|yw6qWOtP`^Qu{hR-B$e<|bp7%JT1t>cFD|5{D zHS=TOtT5v;FPKb=7Ms~B4lwxb;J4{%m}9CX7v5O(_+FY)qSS(iI;z1lhJ1ttspI z@l^1~qVz-0wS^@w-y5c^%=yU!OHX0ZX4Au1(Z94&GrBQMsY(}|5nD7YQ|w4EB^D~k z6@!0Hls$EUd_|{h05&Ys2bL&TS^Qe7hjy2?5!{-{D`g3dHl=aCsA<<>Q)rbo$&Qz7 z^T2z=3b==sm8rFxGk|M3YUvyUyS9Hj@SOuMP2y?c#P%ruz@;6vF`?=bY&zS>;uWBF zO~Qd#h9N&$GpFNkIy|v(m2f3C!pmN|>0zs7x#z%NQ+^ATC>R)$vpoWD@=n9T#MYe)ysa@(ZY*o;0)GhKBZ(!$&oBab901lqM8nW#mWMsuBnm?fY zqG>OpeIeMX>(@%QqDR4j*p*?kuP0gI@s*No3l`fl1iRd0HH%>J4ln$*5-fNJk-u)s zb;rhxs!e>TAvr^zd}FnO9MPZDB;3n;qE4P;ba-5mY|s#``UFK`dYYEHbdPaZ?P4T$qI769ef?=wi`{= z-YDo=9y3}4%deGm1-T+qL%N-I!I16CHN09^Ted5b1vpB!mS4ZPYHw3hkHx}^=9Vtj{f^w~v@fi%OzKOJRCgObxu7uZB9+2--GUFG4;qd=-z4h&n!-`V0xV+x@wa;t%7OFYh|%X#c5t9=2z0yzpW<1mUA(6toUZqzQ+iJpXtcKvARIn^}daoW-di&HiHj_IqWkW+eAUwBf*$4ag($kd zHy*G&h8^Mfm4w=TEswUHHr=UO74bhEFKGBjce`a3?RcQa0j>ncEBcWJ)@Wa!JA`94 zx_UweC@vZOu$R8v>AI@U*eXI)@7SYl<9<<4VFtHGZ%KOOo&JPqMkFOt6R+l5)y|Kl zr`&-nI8l8Wqh{&Ne08~Q`{8oE-RyQcG#1fKn|G1*@f!;(T>F$1yzpmm&s;-o{>7ri zvP3s-MS-Li{$ec^f{qRq0sNRuGrVFeFVo2(v6~JxOs3eDhWV{xCMH^J}Ym#RjEgCclm?S`Axl z>s{C4+Ww8b)Tgh=ShVkkUZFeAe?MbfhKzZIx=p)7wO>x9cbnqCN*S!F$e5>x90~HR zO8aFTbOf$|frSp41Q#QQ8#V4sEWcKLJ86bH9@X67F2%xqJ`hoT63pkt8^w+~cP!@f zlnyLf?jh55^P;@S-yU;Xxk*0HP&1uZW8CRH>oXngna@M&ugYmY53kR#6Svd~Af24F zJwNK?M3RzI26R}V{FQYYIpsz1I711>fR&Nc{FKU>c~Iq)jLkJS^lS2&|79hg`RSEj zh>?#W)7Q#J%cPs1UdhPXzRONqQ`INFL*9~)t9Knr>Mgw{?>vn01@8uJvo?q3j@EW- zZ`4lEPSH+htneJB`7E$7E7)#>#ooqX{n@p5fy!-=O{bg4U;S~szC*PBlBB+}!P$Lv1!^iWTI+JdG zdrfE0o^y^CiCpG%UKR{qX0=}C^dD9&ImIPvq*V7qj8V&d|=%&Smjq_E*~1)x4Zfa`pRg{x}kNl+-_gyT) z+D1F`W9=WcXSH8y|3Z!*l4C`F96zJYIlcw&mqEu5DO)6XlD1#_wDz|gC6U>w(ElX+ zQrDpNChb1$DUM9Y?ne0dG5Z;=Y}IbkKCAs5M_FWk2K;}QeJfW+v^Q%X)4s>P+{Ind zUZu0ZmF?P<+Cl9nT`#DDy z^m^{bok;nwIP!9Bn%R2p=2?~8d+b3oe-6)9kTI(rt6i;qQTr7~Jz(Ji^zwD~gIw9D zy-mAAdyFF;6kLZ!{)PPpSB}%J*S?}1;;0YwT%_hnmHx`Cwne*GyG{EVSE5KLtKLTK zA(fqDox0`j$i&fanX_Y76Ym^f$J_Stsh8qY|NH+JXe(tn6J#$MwmF71DN zUfia*z}G8BuCKi&$5LzpE2c`DK@p*SNlt&?xIa zPt$hMYaQ~d_piKSH5gZ4oyKtT?W?QFUw*oC*~AX-5Nb;|D*rx>oovCzw_|_DVi_ml z2i}a0o`>~ZjJLQFtGpU}xe2?t0~@>ti@y&a@>%Tr3s~M)u$ITL%X#2Y?is}uYUJCvbLM9d+)oh%-C+6`|yX}|G}GW_K*DG?RVc|bIg6} z{sW&++CKitKl#%?OW5w6`^F=G@udfC?!SEWtN-UAn`iEc@BiSLsO|B;{+p+N6tR74 z?l=GZi=Y0z&F_EQ{c-zE=3P@ReYDkIui7U5_1FLOvwyG!=k&QNrgoWcvVYwDxZkyI zR2{RjTy2fuLj&2By6ZST3`Ghci1SFZj|r=2}B^^OmI{!7pN z)YUV)<&^W@dDrK@^249I>g&7C%-)=QF#7kd%IwC|-*WkF4}9^*KXFy_>3G;$s@D5k zqZ9W3@84DDPdS$rukfF^1bl~aRlffDANeD0%=J=~F}>BF+>VX#;pWSJL(w6oD|qFv z6s^4K+|Wpz!fLPhIbI{3jWlDgIB(;)i=Sg;wd^qarC0o3tGxeiI@_l%Yljz(!-$P= z*?tUK{atq1i`!O@l##Dk_-|J(y!1djIhjarIval>UZYbAJGh87N5=l@IosbX-*Cn9 z4ObffuP|MFrRkC@SN^vRm(BC5yDvLfHTg9u*6dzM$!oH%CSQAcjkjR*SbIN%{@a~0qk@rUzEuZ6Qtoj-`%sAHjEuVYo82QPQ)YbG3tvchkE^6Ctix&H$SvCh3 z7kS%dyUM4!CQ zkk6cLYz_Nq15u4VuR|?DBDK`QoiY`y&! zctP{oXO(!nT%=|3u5Z}h_rk^GD;)lb{c)Sj7Mp#DHOvoOvS;_DawyM~>(uaBtGt7ubH_6>6EiJ@s3p1RVWfE>w&>rk@se`p z;KKD6tdZsNq33>sLY98RrcPu=ywr%qEZo(R_$J}5$c@WLk%>VZ@5dg`gWPCalk{9j=D6Z4stk1}c$N4p{K z;*7TaVf$hzx;SIm{;+E?(5A`s+y%|0)KW@ll8uPD{RIY7SH;&z!*tGBx8Hu&S+~Fc zEnCmrH$T6R(&bQoi~Huco_Xfh`F*@VX?oA$>+SEfz8AUYxd$9$Z0enS1+jkJw6!`p zyKy1Ws?Im^g=S$x!BSWZ&T71V>vV2gKiwQzH(r|W*%}#{Z*I-ZTIam8k%O}*p{6!_l_G2z23A_7+Wx5Wj@(g3ldV#~1(Wn5IiGy7ZiSTmHEvCPEd4tTIEO zwNxz26vE|r(aIMBA?r}9%xARb@>+)5QyHlj=}a=8pz%#*)vA5e)cVY)m%n@8CzrqX z>HAHsk6pj~;_bJZtT)|cvfg_8@{7ywDK?wMu7Lrw+t_I?JJ%n5_uV@-v~GXXY45kb z_rB%teDXf>e%jQ$?~|sX`%b!P`GuQrT3)*KR+HtXn@#qcmLE|0yV~WjT|T*d>#gNe z&NxG}u92#Ip*y5qHZ#!OKh(6w24{O0oWq%g%Jy>%V=cd?G}kUV)3p{Z@)F|c zSPdxGUM0Of2uc_={bjMKc9y>0djDx}y1lhw$K7`y{c2$?zwyM_GREXr1J_mF&2**GfnV9D=&xhV1QS} ziTvl80k4k}`EU4Jk*<9I*>AF3vv}r5_L_>r%Rk+kt6EG)FCPqFVal#s{`qO|KWFiR zyN_A^(U2*-=_t?g=S;`AHf>pccED7A^F1e)-u>M5*Z%J6tABUh4bRz+T|VI0FlWk) zEdTVBZKoc$ALHbL)G5 zFWIl7kl()-J^XHYtIcEk8F%D0ZTCz$H5;Dmnq}r==E`x+^40ge%{gz^Y_pumm1pB~ zf!W-_*-<6SxRT|!#hm5)SmYRdHb@)G&QP<3gjKtv9u4vi)JT_Jl$Ed6BLvkHSyUU; z@u8NC>G9=}$>m|wxA*`_|bR#bicGC=P$otyVkykQJJcC;mjDb z?!*&`7~eVZYIoEYP8MdpbIIATd6xIExf0EqX1T^7c*!;!jb=-;&bi=hc9qRGgYpTd z`Un(M@VHO)*5DkYV`>XN1Lg9N`m);;4?8S;l@g6G^@w5`F5@m!E&MW;tq+$!zV7Db z4}IW+H#{%wnuea)vDb9g(my2%YuL8$2`-%(FmGAX7M5?j?)mq@^xv9VX^Um~_ajRW zzKnH~_9ghZ#`*-`6TE?MmXgV^Hx>(P+d{$c){qtp>T|YvZ#XoUnfK1d4$g)|jizgq z8h?VPuCTYwO8@WBp`{isxfNPR3p2&!9%xrg0pRCY??+8>P^;E*<~$#7wMJ{grc8MN z($|~JA4{EUif((?@w?_no2G?NT<>`4mySPw+}d~b?&IH6=zDx%+h*$%=l;oy*KRrG zUF+&6-2U0qU6slYo;u}}_Z+uva`z`kcfUva7kme7bHd4xcE`pMTBQil1z#azioG7j zuDs~FpM4i+hS=Z6R-W$+p<+1oG!Mql4 zzBhm2efu;0Js&vxZ9Au{g{j@=o_E(9|KJk~lZi{7_|ZpuXD^;Q|4x%>$HavfOz!-^ znI}B*(I>8c3sgJ>73Wz0hTc_e#!Hp{Ij42jKg)s*+N|kYLWTLF3zB%(XSD=${0=}# z-PGu)BBg2#D$F0*`<^>b-1f)U?MgRyUY5G&%^$hM`Zpi?>|gEM@sAJQI=tnwkCeW4 z;ZuC}VPe&xXDrXyb~6X?%uF&CYpmznva z6VLmD4_?0GRNHQUWL^F4Gxzl#bxN}E(pUChyYuoh-f{~=Kql?j!|$@SZ2t;%yJrdk zuN?w|TTLb?^v>JuP-&)ha=Ai~IU9OSLYEF{JhE-FX)^Ebp^o!02(GLpFc#NsYmejR zm?g8}u2ar?&xhX8J-ub=vnv!^fBzpZe&&jI?z-~yGj8)|%};*ur7!Ql_L$307oz1| z3(c~nJ=;xIyZDP*mM>RA%;J;{BtFdQS=Ol8&SD&DR_ijS9f80de!qT)mx;^*f%rX% zMCR&rKK&(TSY}}vCL-p`moJdcYR#!n=V=&Zu?#+L!I3igmP{eYT&IV4HpPSr?C~WI zqmS}d>B!J}GfIh8`3i@5_}WvUnrHs`!v_yqnm3bAd_ef|k?y1c{lvS)E869gX-&y{z%UGez~K6qDY_dFiHO zHrNa^v5n9Zl3``$y)c=NyNIP`uD#`k8!ie4mJgeYU)^CITl(9RPc}V}jW2U^XEHrt z`H}gL;Lf6*`UR8B_{usy|MmdOqRFgC56_hN#+?;!xctt408ukc>SGF;%(8{;f@OgF zf6_gql3Cg_=P}I`I%$qG#gRd#F^e7Fo|jC&zwZyXGc(-PQuocgj&#Xk`99^s)w=oM zp30A5-BwldgKYu~Vq_M!*CIqiRI+B0tX1`&5X0B>5O$J5j!nqgx{vO{ss3N{vY`p*9w$ZH$k_Wm*)L zPgS=Y4wK9p(4G?ItVhl~^BX6A$Ru<@BPo}Mv(`Z>z$f1R44$U^RoK>g!dJU_z z8P~~S1XVbdsDj()WW#j_>licfVLPeS&Mcj*gW-fGm4JPA>@Fv3jj$YvjcFCt#F}i( zR<|S(;#o^Zs#;ULm83+@s=Aqn(aDP3_V#IrrWhlT%*fq7w!;FEtWvN9yOr4uDafp% zMJ_36w0A6aqSVIXl^w~n%W{awB*LLnD5O?qDC1|)h4}3@5{YQ7h?ZW4To69UC5quR zf9eqGNzXp%IfeclA~q=&avc;RWr-l9D7(~%XpyASl4P-xPEuQ7&?XB=BU3}4h}KMM zsm&ta01DwE07x)dY)IclaZaa;t&2&YR54QF5e4Y5xFjf&Sm4tkbNDnVs z5||F2cYN5ezor&B(_xg;aA9+*5=02XX9ss`7wTJQ zC{^GhoFWMkF^E(cq7tbM${a$on*@~0IRI&wa_r2e>QTiRoJetNinl2wNr_O;LKG~C zgFNi*QiX*!E>$g}%uY}zq-q;}Sw$+9(twLZ3-D18QfWx1a4G4PTsp8-S6RCUO$!O= zR@DJ6C52f)CPF~eB!YIzcVM3AL2xO23LeF}dThogkDONT-W@L@CROg;SP@ zfwH7XmrD*6hA2UB2^OU!!6!!uo=98QJVCC=MC1rs zEOHiJ5xKHI5jTNK)m9RUAQj+^Gsb@|!!7%6F@1s!Q8U%72wW8b7+C_%?(nSO5<#ut z(yQ`FxrTg=t;4R@*K=8ju;h&z_iq-+9ftC{uD%r+(CuNP%MXwE{8xtz2VNC$r@ zNsOS>tQf^jI-S_1U5XI5>%ee?56UruGF-dG;2wik{uFZ*X+gNsMLVfdvD)ucBtz| z4)hOhJyJ3y(TPD8iU#y2M;(8vF2iQq`&!*jiIUc0#u!)_#_Mr-DNYvZlW6xUWr^yJ zC4J`E$m_#C4J1BCi z3lOL5M8GGQW=kP-ae$JrNP05kN?0sJ(IAJ0x;&yY*pnkxa$}>a#a)UA1&hL^@|$>= zwm(Hg7yxYIT%02uB zD_lz5s%tBfP(i6!?a4J2;7{NJ?pVZvK;z?e(yDkcDIr3@=w`=-WUwj-LqUQ|vS7;r zNg~8c=aIcNxD;5E7CoRdg-fwhml%wSR)@L0$Fbx#PRoH2F%;uIhLw-Or6?5pBhph; zk$*-?buS?K5r&9hO+dZM55t*HIT@$f=@MY$;1Re8mv!torha%w%*a!WM($ZeS<1bO zRZB7S@(f%e3t`*l@u5{=97ikb&`Vh&2r0_t^!Z%C)GH;6+Epp6UMYuo4?L;zr{Wc) zB5p}ggw)!`B^X8k3YUJL(+|wOUcW=4!>^R(l$QNSf~dhSK_tYU&m-glE`vZ;xm$;FRbLC_J$^!jT2J5oi9yKtOcQo}VrzL0lay@_lho zXMqcaOD}7^1JBpOrI*npI2ByFX-7GbBbPW~0U$v{3*mS%E8J6+_% zDna2#c1YR|@TYL;V!?8C%83i0Gi2bBGl0=6YtbSZ`rF`=q6C+e0WNiwN6IzKcCD`h zfTX2p{IJspJOmW~Mk<>4)jYTpNo2XqmWo7+%#dbSS&qllgXcRWtm0EosiQu-4 zOFQe*yMjzv%_7@QiO!(H28)y(S&$oXX2K2zMO*AK$EXw_BtW1?V*wr=T+&3k6)uqu z*pkFXP-<3-odFg^!Tpy&TTlkKV4;IM!J^>OWtFouE;tK?OBdQfIb>4E5zs2|OMBZ6 zsw#@a3ON&Cacs%q#0AjX@ll?kVD`!62?AW&NmPoXgk0oI-zTKX66nAl1+FRHNm4Wn z1L6&(u@XB))bK#WPniuu}{E($`k8y}@);q!>_%2s)UQ ztzX(`0X`hEPcXYYl;r`J0w{#*adQFc!K@dE$_0qy?j4tj%-~m9mSV=~L4-&jR0x|m7pc|nktlsP z{H4pyd~zU3r?@~s=fMunK&NL&ke2;Og5Xk@Aeq@?(s;=Ah^vD*a2X1RG={D0bY#8w zOOK2Ls(!5`lOz6NdLG<4{>%o20WY`&WpE201}+s$AzW|?_f#dmpZ<)D!U{}4z1oPN z2%=&U68IyinkW@3vOw2W}71{1*ySx zRhm+os(^ojOVN*bL+Qdguu~3g1}@z;;B5o|bo`8~)}c~hYt zwBg>x6h(p<8GSs#B{h?o5kG}XFd~P3U?OFS$fYQ+Cm8f#%|ST^;f7OI)-Sk3Bb|0$ zbpr&KC_-=<@Jgib=3-P0IomzD?g>#GQxLl(xddAqk=__H@5rU@fi= zTzWMv9AWY+g-gGWTU&)oF}HS5xP(#01;i+9P$(`}ZtT5oal%Mn=~S>NxO9Wd_G#75 z<3SY4s8ppB&?=|gZg1sC)dhc8AxFB`uX4EjK{vgf0JSJw0!F{M^$@_tAE8nlWe1ne zh!mu7X_)Pr;$0vK4O2flQ@9j6MbrkEXnfnal;agTrMOq)5*=A7=;gTNZn7QK*ohP) zs9b@qx*DYMmI!ZpP{~4YNj?LYB3!R0z_E;(AaTFf2FPgK@t@#PS^(UtG-Zkz`gp>k zj}}*S<_PEr7?c87{32XX7XRQJl!7KNxYVheHk>RJ;*@qCU#!}B1h3k8xhzh@>zAsW z4wjuD(s#o!?QRcC`-XH+nBrJb!Y$Dq7PpL3JHjApU|mjD<|MG!#-&?u30ImH;eBDj zB{x_;>CJgL5aqN3_Z{$yhw|dYd_J4Q=N6ai!yd6h7&CAwZ3s;m0&?51N~*$Hba07u zyb#Vtg2E-07;aQyQq{%vfMC!Q^7&N`H!eVMiK|CrME3FCzOXJ`P6$I^X0LQKyk?s- zstT8Kkq`xf;FSOXNsAs(p}MugPC4YX0M7$1Rc4PIk$ct0`A9{?flI*>z@<$TsydQx zhtdDyZqi8UWo(bpJ!wxF#CF>i*+M$8gG+b|=~9Hp?D0{S&nopQ;rb+zh}I3X0yGW~ zM^}&1Xi23nDyAqBgc)xC6fRX}a2X7Fg;HD&RS8Tei+>mZkn^(q3ri)3s9TzSY3K2g zV*TKfTR<9S5J5`S4S-FWDzSoB;L>Y$@S2`CLUEx`gjIcT1`*}wywc-5k{|<@5ecGu z_CkRGWkp;@5Pb^&;BHhanMi5tzxnLOV z3oaueFQW^BOBxo;$iQVxlrKhQ42${J6c4PWoyD-xSqGOMznoSshIe8NLgdIVR?&%g zEs126f+gTPY%tQnrP2TL`_=6M=u~5RQjCF11GdJ0UHXpVkUgHT(fFCYe#(MUT3Un) zNWCOdV|ktcuwsY|qk$N5iBp7M+F-b#tp=BVVbSlE%yhl5+*$PGw4$QewJ zniVeX-1UU$3JA)uLijLnDQ$=c!tsJOtP&G&GoB>fwu~BOzsXU!HN;FNqN>Hky~1uC=@=44kSSg@K2>Qa4E$g z45A`iNGFEqR7!-mh-&=2;8JcZ7zq<6>F2;3;+Xn9cmmyT#|zT~Wweu~9Poi@z#>qC z8C;yO7~tkmbmk1P(3GH5a7j;yQqU8}Qk35piTLrSVNrpo9mj)@6n{ZymEjHPHR7pO zap|YYms&#siQH3o7>GvBPG2)HF%o50Fc8h zXYoY5jY~bibFBxzJu^b#`&hJD~NM0sKyKAfZuE(5Vh2bVP91}^E7Cq(&TRCX*E z4yFIm4&V|6(0|9r8@QDA15q1}jK^sfBc&V%SVpXkBpAlo5XriVOP38s+PHKY_XUh{ z7}3v|v!8)9(7^3P2et-y!_s#oB8@2f1Pco`lg~zH4$p>g{XQ;;Xgx?g#PZLAONb$t z!X;bP|D~<=bMquDvgR2so`*M~C@92t$zcfhC1vps&gokEqfvjDrCvk@tcEB3Pkf}% zfPa+!r)uXtxKyLJYV+$Ppw@6eBAWDqOE0+e$D+QtUmD;zE6(E#;yOAOq@g z34%uUqPi{~*DJV$D@{uznRFC;<8|C1xWsC?`H{p%Q0~VIqvFI^^o_foa8Q<%K?puN z2R^(4+=%=1K{y>$dqk9vQgE{dE|HEOZ>%~HDxrZNFj*Z;c43)D4c;Y1|ixKn!H6v1TcTex}pwkerZ$kVWqee#!^f}sV2dcd#i4!7=$g>=XWury!{lDM4{R3UvFMF6ze zW8$v3=Lx8G9{&O2f`O2(IuNw6l3b}+c3_FS9SI?pn!~J_MN0?yfglDS3vhQB#iSgd zg#j~H1iR5wap`hG7%tlql#WJ_SFf`?Pz?ki-hqTDPMY&}@S$+9f&lS`Y9tqV_;nw! z5nKfvEbpv>9Fd!X+EMqZ7|;Xi;U7=t7_PHZkk787%V_6BAgUu~jOhsyeGCTroI-Xd z#-xoF;QRdvmJJ|S0=k2I3_W7;B3wN{A`z{)wy4h7kF@l7V@wd4NfRY5Lplxk(~z(j zq7xp3ZFe+DOQ^%1R}Vx347>zbCPT-_C`u0|l6ouC*LRm?twxhsJyr{7TJ%STH1D35OXc@W;cUpbR*Lf&zBB%?etG z55l=+X2}t`ulBiuK55Z;Y6VPmP|q!w1cgMw56K8Zm#QwT2V<-w90;aDQI*3VO$6zM z$Ed}rQ$mP+Mjk_%q)x#QhRe3-;?Q-A!<(0a#Hbv?UnnGF=k4Hk=;F`tAE;2eu%1*Z z6$r~|rAkM@Vt_}E!XX&##IRq*U|1Eb3io*&Fk(C$_PfJe3I`+MU>l(B5K*w~=i!Rq zg`ieqLfU8|OFgC%B8#9U7^bX{Js9$Fl2189!FU)*fgYe0g9Yfe2N+cf(7&LW$2;Oq zfxR~nqRS{fmI$42(U~XCs=t9StG+Of76&F$7Dee&R9H`?Lh+!UlD5+A$8|~*9}xx6 zh=*wB@uz?im&;}DNE{)Y3$?lvVTrVn0dN`6Ep9!N*0U6sN@W8Q16f*Nox7kT3=D{{ zJRm`I#a@~Z^auf59jt~mtxzmzJYR5!!|^CXuHi7xq5xngIGyYTabe+TC>V`$KNd{! zVKnFt!YyzCcM4f3+#N(fK}SkpMmJiQcEj%qvZTBo=Id%U5|qmq6&r{0UsVkVLlkX)M)u3GX zBzojhRF6gVh!H&zqF^-0;BL?z)>mUHiZd4A>v}fL9E(BS5{f!$CLKE959!f}GZG?^ zh&C9E>xqan820N9BK)BXaEX9)XIcOPE<*x-KToX$Wg)%^k#ucb3VuTB zQ0zrsD|{BVu*>N>Y%*CF}uB z5Znnty6+$Y!xnGIc#01@)e*JPs}DJKs{urX%jm0d8H%cc73c$ACj}V~hl3uYofCm5 zfC?%j+!%%hmvpZ&;FXw;2`YsIJ(p2VhN%!JE9wYEaF!z6Xoy7A4`vg3GRjayAOvb@ z+vyX5P+Dz27K0nr@uxAdY=ujFi8qytP*x}$0hg%|A4G@J2m)MER5X&yMbn{hR#e~( z>NMK)n&K!RL?0olaH+=wLAnCcD}YaW1xPpGP4l^&5FXRPr5?6=!-ZV9iv?S=S>|aW z>Rkz*%y1WUgh2)_yCldh6nnX3Qtr-m922I;Oxl%NMdSGbA3CR#ybBPEaa*8E5+k@= zY{QvIESiXfScu?U0r zi8vbx$~!6*D>%w2RaG(;gLes-cBaZO2RRYRDC7xE>zl!zn~xOf%SJ*pHF^3b5d`D)B1!7GhEycP4}WFpo`!W9oE zoRJtO!-=>n9?d1fBHBVw>BC#&&4*Npk1Ws8Grf60o^b~0ILzzrCsfRKY zNRxtc;<#3*_2rTh!+~U&XOZEU)fX!lW0jZysuGqMuFwJ#q-8&nAOl1d36hz;VkRS< z)^LVCCR}M+y|2zR3LalFnaeO3kxX(Bra^57+R3B4q_RxwKGwFCbg*M{F zSTx395q24iN8&MGH12js-9=y#XILUmC3JV9-ejD?s7zWJ1S3^K2{-C)K@TYjs;*2j zQ7Cjpqw#7wM-E_`E5+&h6iTtECmB!1Q+|Km6OX66%i=;I4EM-& zbfziL4ON{$Hz^j1;^*~5Ou7m|YRZGwkjoadB52dr3c$kw2 zHx(yQIu)lck&hM99vY6AE1HOhVsyM>u81BBi^~YZcq*LDxOgU#p|g`rFi6=|O{HS# zcp@1}#k=BZN-4^}L?o8S<5a7uVmw(96$B!&H2yRa%8K|S0UhreEfk{k1M(CYh{&4; zsRGR#wH7lHqk1OlVdyex4J3PN$$C-%RgX%H*70vcBvfk zu4NvMX`44RC?2_KN4U&m+l*{If1NomL6%m)w8EdDT@5xdyd=i6(Kgs8k z*@VPQK%#WXV%$W;{F&rxtl}gEvFT)@Ud!UklD1^dn~i7P$xMWkxvV#vs^sF?Yzk{F zCQ4avJRM26j)jxaFjPfhJR8mD-I#k`GN-&=y;9F+6S-tM6UijYz(mTT zsB|n*Oytt_dbW~G_lOGgSVH`1EK)!L$!L()JrOUJ;()S9fpnJ9O|}$|VYGTRFEJj@ z$GL%xr)|M>qn_^1AiwVZxWssWS2~lR2GDD(lK-YPA|5?JJa3j%2wf zO$WVNPbGa>O33Sa#g|SO270sfN+2v5P1&;C3?;HQUt~lIN<+Ml&NLi~pKphR7q1dc z7E-BbhPr618jVJ>ko0BZz#^XZC2f#Ql%qnvU>wN*0;!1ULfROD_j%BfC!b6jgLetN zD=o1|ij>5BP@=fd1UC_hKrX!+d%BF9h-^C5S1+Vs)Rr#z$mL1rVw^;{`Akn&Qbe0b zRZ`W0FO`j@J;`i3nu>+eDNh2=9fhiRGLp>4ibYQ{l`N+7(QL-&3wQVD^Ql5Qn~Ubt zwRBe(WfdqYD@7G@ef|0FbhaTX2qjVloO2>pLILS`D4LI^64h!FP*x}~l!&97d=>ap zYfqQNRJ1F}_)0Qs3uOoTv#lKRYqXLQldWEm;Y=+zaq@GQbX$u+cDrB?yT&dV)U_B`oqWqfdkTjcBm6Z#5+!YfkLj3>k5av{n>1BxW7=AUSc5~%h(HEZz@%=`(x{rcp%TDKYC$+YQp>s8lTFGM!i=6){`N8qaL} z-mYZCD-EPq#gJSoWy__k(cpE3BuX(Un#Yvhm0gXEawaB-MH+*B^o7z{d#>aspEui; zDC9EC15(U2O6g(|^kiz8o}xdKPh`F6d^Vm*M6wxgDwa*e5LhA;OBWNBvKLQP&UIl* zet)EQu&bCUW%FI}u3SA^LPzMSn9EC1rNZD~v5_kbpn^;|l_@6hq=^d6N;VnBOJ-6% z^)#UDra+n$lvBjH#4?F+qbxBKE2p`EO&9Fp!f>lFT0njSqiKohQCi?aS6B5210DSE z=msrxE^FGv`U#D(v{12Fuko0)SY!+gi`bQbUvqN@^~>{GoQ=n!|6~yRiiCrw5yoU7Yo%&DX&6W zEJXZTUUo>zRSC6XS6^QrARVdn6bpr7KHD=;po88wn9Bx>3}=-hk={T)Ul|9uaRxez zv|IL~4Ehx9f%y77o~{7#0s200DEHj$knwfV3&~b8P0X!WsAIRDb z(&VUGu8I*Dv6_)s$yf57r#9tO%vVOcJ{2QIJ69t`PGUJMQCw(-n}|%PlwXa_T8?%$ zmqZ#PgVM(4?S)E!T)uoMRV?Hxl|Z@BtY#}^dRn=9u2Bi(imALWTg)eOsc1gu%Ovut z1OiLZ*q2kanh#T~70StCS0E7UA1Rk}6_)f!mI{4^YL&7OM4>1}Rf@wS!BDET0 z1vwhjcF=Wpimh@_t+!I_?bVa@uF*!lQtzpD^_0h;D3Xf+s!};$E=9V^pd~O?E|tr% ze6*bF!yiV9ky^Q2t2FA$AWA5TAowZE4oSHxp|4gQ9v&_hE7SFXTBTAecMXhH=xYp( zmx`ep!v;O^cuOyr>l@eA`qB(h)w(i8M@<}h&7r5~%9V1Z0`WRt7a@r~wL@2+nlELF zy`^HNN?o*NlarIh-Y$AiHDXyWIv|-SN4@plN~sfjyHqUqmKmH;k#2sVjzbQp7&rV$ zUvIfylGqcIC}3sXp;%Y6r@R`+aFQirtz4QOuj9+gj!LgyFZKq?J-J$?)LYl6+=)V|H(M?jvi&HaoKIxxnNru#aIrsMXi;FI zkViN5p<*FZ$|c77Bo;G$Mco@M)*Ol2#_8JTZsa$)xhS!?d7#!^>+WtIVd(BoBsOm% zNLMwndGmCuC7pv}t5Coz_OX!GF$)^w1&Kyuw8dC$qe1tpC`pW<`eN1b?!Ml^o+>ld zWSW)f!DhYL-&^kMo~~7Ev0@CIcXyY%Yq3fX-9df22Rf6bcn_823$bdf(cRtKGuZ4C z5=bZ@6#VqaPEG7gRn=i+pGu8~k-+>+ zqm^Tbs!_>TosD3yTy8kSxnsI}x_f#cK8%ELy!vXxQqg-$wL*2UR?XMD8x6cD@~940 z!o4Ml-QlWJQPwR-gU!L7S|<)xBo6cp^mN9@o5hUYtX3^8E)362dm9yy;81@)z%G! ztBtO1z1rw0RJ+pMHNBkgF6NPKv6`zki$g8FTC28t`U{QTa5yt{RFks0d;1FgJrg~H z=xBO?qI#vMfyPlsHK%(Tn@~Y5U9Jsup@y#E?pm$8l*%^?waU7Q>QJdXPJ!ui3Eec; zRZIC=S9-c7v6^pH!~R6I;Y>HSZfPv^37{6L5~~ZNjlM=-pESuw68dm03)={&sxQ5; zuw{H)dYjepayeVAwlr<`-rXAGJgLFKsj)yJF*r!~t13y15RI~}uWz&lM*HfcBhmbD z&*rh={^6l!cdPFxoJ*pbz(F#;$G4TiGW_0dLS z_?WrDu`X_@278Ki*Pz^754xgVdzE+~K8n|EwOV1QYKNY1v({Ux<3Ebc#^50Rp{-lD z)<=72r3Q$7(YnhpLOB{89_{Px#L*s!BYh)%(XbJRs`>CR4mqr1#_%WOBYnfY5{J?f z1*6?`*1A)zzSVft82(Iv-)Jn%4&%!juD+4zaD61)XjKOLdPjz%!~L7b>chkRJ>B)` z-VGzs`aq=-t`GE;dMi1=*IjJTW;Gg>da*uS86OYVd+XzULzq%Dn%}fIL|Ki2R%xhj zW8df~WsOkOfD|=4xUe|9xqomgD(KC1_m1FCYvpx~-rh!y{(7mmXJ)3pu2x%5fwYzA zW_UxrR;1RW#w6B@WA$htRUdTa29H@B+}%QcTX)wb)^|@0wgy`*@t{W%TCHq$_bvje zYGrrtUR=L^lu%#a-Cd~HnfUC)(@xYFv&fE)ZkpEV#*Q)wQkNt~h{xGBw+xPtOfl8# zWV|@hw=gv^G%-HhH$J#9&>ToJZUBk~ds_pUzE(8aA6;k-aGTYeY4wOdP4}lq2M0%5 zQxnP{NGP3V!B0ze281qE)%57_+}wPB|IqGX)dN(I9Ds!jK3B!Z`R$1A5P@yO5+UUz(aJgP<^)W5#yaPL5^e`=sv9UdGV zrQ@)3=g#I-UwpWCgxHGryA30hqp69h)<7pt^+}v;O)^2D5!cm=(TV>4zNm`%sg}g` zldXvXiQ_qmg3!K9AKjSo)@ods#-9oB2M2d=pBO-9?$%^{qB$8I9Pb%z4NOkNCx#ZL zniK1W`udui2WBVZ&C#C0XmhkxYxZ;v4n!MO+AL&SZ&sQUJsZ|Xn*+`Dt#M2#9xra) zvyQR`N5*U8t@+jzI$D@yakmjEYI1b-W}CfLYF(I?*sMFDC-zJ1KXKFO z*y#B9#v=^l<6T`Ro-_mH5`}?Og?ToX}&=|8QOis>k4rQ~G zlMJr(ts*~}WPfO3bZTPb*wDtAWM#wP&P^M}H%zY^oF3gZJT#o`%Yv+t(dOuIZV*tn z;yXu&M@GB)^P_#6a9G(^c5-xdVrAzB)z^(oPSSbUyLa!<#=+#e{)y&9b2QoVjE+c@ zqm3IjjtzI>#zBcQqcfwO(ed^DmH38MYcQ^2anq>8qh>}o3`?BulDMvaUH@Qyuxl_s zJ-QlqZ5pZ%6DLPUPS~>nmp{mNe)dk zMq)z~qrF3o^2l&(0MFesJTlTZ)IGGJ@2JhOq2Zy;W7EBp>ypXJF(<62tkH?7-s!O& zqZ>C;*35wMPSif^@a_`j0$Z&aJc&0Hj(rj!&0VB;)eM5bCaQpTl`T^To z!$ajJgOc$Li$l%&a9?@XCW%A!&8=j((3`-m z?qb zc0c>a+REDfECwd+b+f_gLS+ubcFb-Dh_a7^?34LpS&?U63{0?fjTMwEt zzj4h3-IpV)-&@bn@{XCqKS%Z(Y!7H7q`jPTlj`?pZ0EE)Ex*$?aV=}VQyb!Z#5}0E z&5vut=7+TjdqtbIe+is*Yi0DmORz^7_eeUnXRsZz{#^5tb{D@>!N)D=U+c(9bnbXS zJJ$Yvcsrzl35Vf&xZ z?i4>DwkW

`{Km@g4Y9fZ=2m=`_>C3acW}|!9yI;1qbIRL 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 JkX1y;{{bcQ7_$HX literal 0 HcmV?d00001 diff --git a/exampleJson/bin/data/fonts/verdana.ttf b/exampleJson/bin/data/fonts/verdana.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8f25a642311b8dde62b6154184aea935999b7c15 GIT binary patch literal 171792 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 z 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 literal 0 HcmV?d00001 diff --git a/exampleJson/bin/data/gui.json b/exampleJson/bin/data/gui.json new file mode 100644 index 0000000..48babce --- /dev/null +++ b/exampleJson/bin/data/gui.json @@ -0,0 +1,83 @@ +{ + "elements":[ + { + "id":"background", + "class":"colorPanel", + "color":"bg", + "size":[1280,768] + },{ + "id":"Head", + "class":"label", + "font":"Headline", + "position":[80,44], + "size":[1280,40], + "text":"Interactive GUI edit" + },{ + "id":"text", + "class":"textField", + "size":[820,40], + "position":[80,100], + "text":[ + "" + ] + },{ + "id":"button", + "class":"modalElement", + "position":[80,160], + "size":[32,32], + "colorActive":"black", + "colorSelected":"white", + "colorInactive":"black", + "info": "sub elements can be defined", + "elements":[ + { + "id":"description", + "class":"labelSmall", + "position":[40,10], + "text": "a button" + } + ] + },{ + "id":"checker", + "class":"simpleChecker", + "position":[250,160], + "size":[32,32], + "colorActive":"black", + "colorSelected":"white", + "colorInactive":"black", + "elements":[ + { + "id":"description", + "class":"labelSmall", + "position":[40,10], + "text": "a simpleChecker" + } + ] + }, + { + "id":"pic1", + "class":"texture", + "position":[950,44], + "texture":"cat1", + "size":[150,150] + } + ,{ + "id":"input", + "class":"textInput", + "position":[80,300], + "size":[300,50], + "font":"Input", + "maxChars":20, + "description":"write something" + },{ + "id":"keyboard", + "class":"softKeyboard", + "position":[80,380], + "size":[1000,500], + "font":"Keyboard" + + } + + ] +} \ No newline at end of file diff --git a/exampleJson/bin/data/guiElements.json b/exampleJson/bin/data/guiElements.json new file mode 100644 index 0000000..e649bee --- /dev/null +++ b/exampleJson/bin/data/guiElements.json @@ -0,0 +1,46 @@ +{ + "colors":[ + {"id":"black","color":[0,0,0]}, + {"id":"white","color":[255,255,255]}, + {"id":"bg","color":[30,30,30]}, + {"id":"tintRed","color":[250,0,0,120]}, + {"id":"inactiveSlider","color":[31,31,31]}, + {"id":"dropShadow","color":[0,0,0,50]}, + {"id":"iconBg","color":[31,31,31]} + ], + "fontStyles":[ + { + "name":"Headline", + "fontId":"Franklin Gothic", + "fontSize":40, + "color":"white" + }, + { + "name":"Text", + "fontId":"Verdana", + "fontSize":12, + "color":"white" + }, + { + "name":"Keyboard", + "fontId":"Verdana", + "fontSize":20, + "color":"black" + }, + { + "name":"Input", + "fontId":"Verdana", + "fontSize":24, + "color":"white" + } +], +"elements":[ + { + "info":"a prefab label class", + "id":"labelSmall", + "class":"label", + "size":[125,30], + "font":"Text" + } +] +} \ No newline at end of file diff --git a/exampleJson/bin/data/textures/cat1.jpg b/exampleJson/bin/data/textures/cat1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1302d97cae362bbf70db70855b265bc7fe1af291 GIT binary patch literal 55963 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 E*?&yhwg3PC literal 0 HcmV?d00001 diff --git a/exampleJson/src/main.cpp b/exampleJson/src/main.cpp new file mode 100644 index 0000000..56e5041 --- /dev/null +++ b/exampleJson/src/main.cpp @@ -0,0 +1,13 @@ +#include "ofMain.h" +#include "ofApp.h" + +//======================================================================== +int main( ){ + ofSetupOpenGL(1280,768,OF_WINDOW); // <-------- setup the GL context + + // this kicks off the running of my app + // can be OF_WINDOW or OF_FULLSCREEN + // pass in width and height too: + ofRunApp(new ofApp()); + +} diff --git a/exampleJson/src/ofApp.cpp b/exampleJson/src/ofApp.cpp new file mode 100644 index 0000000..3ba73d5 --- /dev/null +++ b/exampleJson/src/ofApp.cpp @@ -0,0 +1,109 @@ +#include "ofApp.h" + +using namespace ofxInterface; + +//-------------------------------------------------------------- +void ofApp::setup(){ + + // create asset manager and load assets from "assets.json" + assets = make_shared(ofxAssetManager()); + assets->setup(); + + // create a base Node + scene = new Node(); + scene->setSize(ofGetWidth(), ofGetHeight()); + ofxInterface::TouchManager::one().setup(scene); + + // create the scene from scene definition + GuiFactory factory; + factory.setup(ofLoadJson("guiElements.json"), assets); + factory.createElements(scene, ofLoadJson("gui.json")); + + // register key events from soft keyboard to input + // use static_cast to access special element functions + static_cast(scene->getChildWithName("input"))->registerKeyInput(static_cast(scene->getChildWithName("keyboard"))->keyPressed); + + // you can use lambda functions to create a callback for each node + // touchUp, touchDown, touchMoved and clicked are callbacks for every node + // we add a callback for the button changing the button description + scene->getChildWithName("button")->setTouchDownFunction([this](ofxInterface::TouchEvent& t) { + auto label = static_cast(scene->getChildWithName("button")->getChildWithName("description")); + label->setText("clicked"); + }); + scene->getChildWithName("button")->setTouchUpFunction([this](ofxInterface::TouchEvent& t) { + auto label = static_cast(scene->getChildWithName("button")->getChildWithName("description")); + label->setText("a button"); + }); +} + +//-------------------------------------------------------------- +void ofApp::update(){ + scene->update(ofGetLastFrameTime()); +} + +//-------------------------------------------------------------- +void ofApp::draw(){ + scene->render(); + + if (isDebug) { + scene->renderDebug(); + } + +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + if (key == 'd') { + isDebug = !isDebug; + } +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button){ + ofxInterface::TouchManager::one().touchMove(0, ofVec2f(x, y)); +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button){ + ofxInterface::TouchManager::one().touchDown(0, ofVec2f(x, y)); +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button){ + ofxInterface::TouchManager::one().touchUp(0, ofVec2f(x, y)); +} + +//-------------------------------------------------------------- +void ofApp::mouseEntered(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseExited(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo){ + +} diff --git a/exampleJson/src/ofApp.h b/exampleJson/src/ofApp.h new file mode 100644 index 0000000..4cf1285 --- /dev/null +++ b/exampleJson/src/ofApp.h @@ -0,0 +1,30 @@ +#pragma once + +#include "ofMain.h" +#include "ofxAssetManager.h" +#include "ofxInterface.h" + +class ofApp : public ofBaseApp{ + + public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void mouseEntered(int x, int y); + void mouseExited(int x, int y); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + + shared_ptr assets; + ofxInterface::Node* scene; + + bool isDebug = false; +}; diff --git a/exampleJsonLiveEdit/addons.make b/exampleJsonLiveEdit/addons.make new file mode 100644 index 0000000..333745d --- /dev/null +++ b/exampleJsonLiveEdit/addons.make @@ -0,0 +1,7 @@ +ofxAnimatable +ofxAssetManager +ofxEasing +ofxFontStash2 +ofxInterface +ofxIO +ofxPoco diff --git a/exampleJsonLiveEdit/bin/data/.gitkeep b/exampleJsonLiveEdit/bin/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/exampleJsonLiveEdit/bin/data/assets.json b/exampleJsonLiveEdit/bin/data/assets.json new file mode 100644 index 0000000..3c9216d --- /dev/null +++ b/exampleJsonLiveEdit/bin/data/assets.json @@ -0,0 +1,20 @@ +{ + "textures":{ + "folder":"textures", + "info":"files [[id,path]]", + "files":[ + ["cat1","cat1.jpg"], + ["cat2","cat2.jpg"], + ["cat3","cat3.jpg"] + ] + }, + "fonts":{ + "folder":"fonts", + "info":"files [[id,path]]", + "files":[ + ["Verdana","verdana.ttf"], + ["Franklin Gothic","frabk.ttf"] + ] + } + +} \ No newline at end of file diff --git a/exampleJsonLiveEdit/bin/data/fonts/frabk.ttf b/exampleJsonLiveEdit/bin/data/fonts/frabk.ttf new file mode 100644 index 0000000000000000000000000000000000000000..21c4ecfc553e9fa94ac0c01368ff657f48493ca1 GIT binary patch literal 152700 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

`{Km@g4Y9fZ=2m=`_>C3acW}|!9yI;1qbIRL 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 JkX1y;{{bcQ7_$HX literal 0 HcmV?d00001 diff --git a/exampleJsonLiveEdit/bin/data/fonts/verdana.ttf b/exampleJsonLiveEdit/bin/data/fonts/verdana.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8f25a642311b8dde62b6154184aea935999b7c15 GIT binary patch literal 171792 zcmeFad7M`)7{h4J=3%IFwDTrus9&A2#N>-vdAW&f-9m3;u4nx zqtS?(Xxt(KF@pQP0kXtIV>Fn>#N>(km_(Bpo%eg{b~6K#&-?qmf4%xXRddh1b#K+F zs#E7%=TzP99wsoxTp$|O-8*IM=sm;6EoQ0>I~nuO95;2!m}%dBv&fix3}fm`Crl}p zMxS%tbBqZuqtvu%z2m2^{_hKyGUnUEnD+48rE^yNar{+RF{Xc-G2PX3&s{B#yK{t! zvBV~n`R@FAtLvLow@qfM3;)QN;ng!&ELhq)=|GmT*mZdR>4G_{RxmF!GNzKj-?m`M z+A~v@4jp5+-^zsh7B8H)bd7PWbuVL$F2d>hJ+L;jY9xZ&(D?nnA^ zq>~Gmu3qzscI9x!Qs5{4?X3ALm!0#}#Z#DS#YDy|Tb3-JJ7@ce0XJRxDq&`oN1zw=vZT2FB83R;--AV(t7l2N;Vy zfIPotBumvY*T=cUJEu#-{?3BPhH&4-z33xjkBYY%25$LshWSPVO_8RqBf`=;MZnqgX&R!ZQ=J{=GRt!{WE@T z!?jg)m|r__?NEKluU(V}LZ$w?acxsu__c@M5Akb1uB~dNJwcwQh2IbJJfrw^lwVKg z*GZm#7Qe3J*GuTyz}u`opIu3jZip1*4T%5&$> zn>K&tygAF}OrF2soF#Ks9w}F@+($nCfYPhLLoOAX8s*H9eA!CAp^pb|5odYPDtV5) zdgYvX^Ow$9d6vBV%;UF?oyeB6m24@S!Zfq*Qtwtjz^1abYz0c5iRW{1mMghsUV_TX>|PuVtR1lhSL4|tYWAYRCp(U!%S5?{}1FZ$t#2Qg^<~aPa$M92H^VQNvxAN$ejJl|2 zB(K$I^&IqOJ|CZznA>D7ssBH+8#=y&*EHITjvD*wv-j|%dQG|Jv!Nr;$Ns42L-Q_! z4h%_aBANzGzh<AKLct_8mKa^2kpg-L?C%$Deresi&WL_POU@c=4r|UwQSlJ$v`PzMma9 zc<5(u{QMVhzV*wufA!A0zh)ZkO7!${wvOrG-CQhOBHSR{A#4){R4=JsQN5!U)M~X+ zolsw_-mJb_eTRCV#-f>^nW;HlbA4n(vI2E!WG9a## zv@vJQ6N|^vu|jNCTou>FrMM&RjtAnAcx`-4e0F?(>W6G}lGeMYhUL*(=Mu6(za-NGt9_ zEABt46{l8OVMi|QYu`)! zdhxH<9$t8O*t=Waz4Kl8fA8LnWA(ddzkB+-#dqu9{{Gure)-|stKL4%_9Xn1C%I~_ zSGYno+mz#|^hnjhYMRcf?do~zh3a#M-lJ>vV&ypYKJHFej;}t!eRy;TYIYa2V}tra z_#W@GE7-N{DtI3EvLC?L*$jYO#%^REv;St-u$$N>L14dPAF=PV``BOEC+u(RPWAwM znZ3v!ghiRlt^<}|1>#>~udsdWHFzz1*&i_DA7HPu{p`n>qd#QVv!Ahp>=0)557?jC zm9RjIFyAfZbH!H7182i3ti;TC4(5S#*?H`bYz;df^UVe9B6cDBDZ7JR!Y+n3U&{W( z{)_DrdWAkgC8!0Bpk<%4e+#38(ZU#EEc=3eDd+^fU|<8n2|~XxP8ctoC`=HHf=Mt7 z7Ga_=iG9jG6DA8&gsH+w!ZhJzVY)CwI7K*Bm?@kl%o0u)W(#xJKiC^Wo6s(tA}?Ys7PbpJgq^}qghzy*3XckP!Y*OA z@R;zp@PzQB@Rabh@Qm=RP!OIIo)?Njz3_tYqVSUNvha%Vs_>eyN7yUuQp@R-dI_qF$ zCN#01ut(T)!i{VP+sU41>)A7GBm2AX9r%uqvzysp*t6`1!uNz*RUN8fs!r8#RhOz; zH9|EKn2J{7Ja!Gn^&QoPXw^#fi<*SyM$OBbPqa2|UVF0kEnQjnuKostY~nE5pGo#q1;uVtM$U;M5038__j#g?^QV{fqUatMxDj=wv*T!QOC_jvb5o*#Or z`x<@g{2u>G|33n21OEU%IQbtMppwozh2*LZh#7 zO5-(64NXrs-_`tF^XDy3wytT5w4K{_Q`-~mnfB+)TRZX{OFDKBGY-3@v)K9L;qvec zhVSdD?b_P)UiU2{o)~$_$UpVidzyPz_WXD6xxG94w0$S_UD9_$-w*p99W`ro`{*g7 z7mfbW=s%3HjAQ?+HKazoP%`{=bg%kDER|KfY`H1nY$Kge4Q!O?YL(7ZaN&E}rRnTxp8B_wGAEsX(m$s8r*%$SH0`Zv zzn}Km$)@Rn8L1g$u{UOfG#)BiDh>g)xx*Ur9r_V;IRpZ&t@H)sEO_Lp<)bCPpf=KSQ0RcBl=H#v9d z+;wxmJ@=luyXWqmdwA|A^LpleF#n1((`Wu>!4(U|g{Lq4d{J~!$D)mk?^*n_#eX^L zzO(i&u`GFE>BOaLmfo;**V5lD>s&Tr+3aO2mu*~j^Rgc=dwSV{Wxrka*>dCZ!1Da^ z5zD76U$|n}*~PO*oPFxb$jWzDtz4~MJ%9CM=j6`Wa<2K@>(BksdFAsaowwk;Pu85b z=A*URwZXOTpZ~!5PoDq!`R|?o$pzL6c3kkn1#exLy6~|J_g?t!g&$ueT;#kcdC@;F ze*EHn7azX(lS|Z>%w9M8(k+)haOsnmzH#ZF)(h*M>r?An*NjLU$yM2 zE3Ufz>YJ~LU-QhhOTN|htjB*Y%<6KfM0a8@_jA(~ZCW_Vn+Bwpg~fw$yLw z+cIs-!Y!BHl)0(ceRk8pcMslt=PmWO^xg7@@2&dY1-E){jo!NaHur7e z+y46fJ8mDf)w}iJ9TV<2`Hs`?Sa8QjcYJooz@7R#FS;vmSNyJLelYw8JAT;y!{_fl z{~pafH~(nyz3zL%_r81IgZB;GfA#&}eqj8A>IZN8@fipg$pEACC~ZQk3zcfsBbdvDtNz}_eK9@_i+z5m*0*%#Z_z3`(YsdC;nd` z0q6eY{*n8q?O(b7s{MEE|H=Nn``_RH{zzqlPIq<}ReFuJb;PZpx z!N|el!R~|84lX!&@xd(zA3pfX!CxQz_>k(5^HB0o^P!1{&OCJ9p=%D^eQ5Wg{fFNB z*|wiO`bIO{$%_Ob6sosc%~m*Cg4GH)NiZJ?bjND8l&m&?!flmSo2+$7t0;=rQa)TN zgzO=K2iy?FkZ9g1Sa;gZHc`yk?PilrGTGsK38j)PVHLwDMkR^tL@?VZ@S0E|Dpgon z8{w~^P8%iZp4Dcqx6)Nj4LFHHNXdxi+LaPKT}qS^iPZ?;9u9|hDvyYoeo?ZA>{j@G zCe&WNZxvUU>^7^-Dx!U2N%V`hgqRTPcGi{Z1PH?{+N?Qiu4K<6hRtC!`f9g{PBHE9 z*=_JCO(wflNSYje0j^>RxouWrkU$41N@mHtdZ!Xi)S&ZM0kK*gNeL`$dAl=I7q{D^b&!HhOqv8y ztao5cgfK=%l>K~XFo1n)!@!r=XE%YGI5jgf zt}V<0Dl&243ua|jP>D&PHcsu#j%x>V4E&opnG@8-+@NkwJSqDa z01JW!ISsMUz`t0Sg+U`M0vcs9sLW}M#RmS#;w%oDUn>+Qgbbn_0`i-?1-A zw3W4jwy`!)>{f!7S;xTNSO*&hI*fIKc5*tL4aapC>l*kg>t-WBM{qiljl^{i>jCX$ zy#t@HJ~j$;6dMgXn$t0C46etru>=2&_W>t>_Oo%IP8|4{O<)s1C$dSP zlh|a?$)F!$XKo7UR5lg#Bz6+$Gr2=r1HZ@Ge;w$hY(40Db{Xhp zoLHz&3zh!L9(^$Top);`B;(CH8zav(2Dav8zC@X4imT!>$Fr7W6mlTkKn) z*RktBuV>eT-oS1Iy%F?1_HFiU(C@JCfNo)1KyPB-1^q7ekPc%-Nc0x=J<#uQdMmpX z*SE3n5BwTCCPZ&%TS2#SdI!4$*LSkJ2HwRE%nv|+!08X!-MGG+(|g!G1MjdOv3o)9 z<@7#wKd$fR^a1w3z^}0L@?+2+vxh*j&j7lO(}&r^18=kKY&$4cu%J8HPe8G%1$_kc zm)K4DDd?kY7w9gw8+12&4D>P3x3J269P|nH1n86ODbT0b)1XhYX9nKHYMAJ=>{-y~ z*z=&zvll>L0R07agkA)FiM<5+GJ6^H74|CVtL(LbpVQ6|=pIh@vc0(8$6g1;F44dn z*eN1@NeaV_)k-(2v;1px7+~{crXO=qI52uvhk1(7&<2f&QI+3W}X4 z(9b~kVu$G;p#Nn51pOEL92EOl1AExN*%zSL#{&J5(*ZUxuxA&hfv3A8+q0z>+je<- z_x6d~S8QLmee3pZ+xKrjyxsKl_K&x#9z~WFKk@onqP>DNEjmp#;iS_~QZ1h<+&=Z8 zsj5j+yqd{VJenz!-I^1|PS%VX+o~Bowxk(@V{CJ~W>{BA)7jOj8QvAs^mK(aBfBPR zM&Rhi(bZhilp5!08k?Im%}rA^P0bO_{-(oCA2+EV9r$p^&eWKeM+Xk?*lA1P{9(7a z(K@o(Ot$QBjnQ1W$*EbfWW^elbnCCbuj;2hgAL9U(QBjMDqg#8!@5o1y8gNi*KNFRlhnQ5 zXls#HMpvr3&o)|Gq@{xVvLL@CbiMe|iz@kr?iW<-41t|tJ44kyXX_l5bgEG2vTO3L zl&03zuF1KanykyMiMk@1nB1e0UBfi51o||A;Al-SFiaD0l{9YTbE3HpS3qOOvBD*E zyGHc1NY-4G=>+k){;1{I{;28c{-_a$_VNCx=868OdRKo`wYxtmJklR!Kkbh`_iQfu z^i#R$6W!Auk41Oyiba3=NGyt7d=Z=ZBKGtx*xI*Xhu>m*eBI-!?p^D4sia4`9+~jS zC68#NM~b*yj?1SWdHs=rM+_!otHvU#v>KIKr4pEGq88hD0~@ZnCcJG+|K#c0)`e$0 zYGD0Sr*Fe{-?cNg8TzMGE?F&wRjXI6;upt|ZR);ly1s>Tw&@bRt0-Zmgf-ENi)|8J zONriEVVkRO;WihpzQSZxHQ5X zm$#`?eTlxroQ0d^zJ>DUMDOh0x;%Q=*Bgw*X4K_n-0qdP3A5$CZKKXz=-b>!8MZlU zx2aNnbS&Q1ebsDSBzj}97@jx>p8zaZ4|()3LtP6YGMwm`y-?n!K{-x>xKn8XJzF>% zG|`I&9QXcFO&paNHGA{sQ3-j}=GmL)JUX!MjD&1UY<{@EfAfmI+443v5krIfyRQmv z8+G-JZMNA9g)(|ZjTkj~dRH)JM?L*h68)1-nJ)Kjo?YpBIPT#H)R6Vmt&UiS9XVZ7djCJ$7D!NNIDT_=A)-OP?+f@dhKe(%# zv32~ZhTq`nxsM8r-%~Q-p1|fls#5ORs`*s7r%~>8^LsN8ASzYQ)agT8jh53O;?pM) zolE<%_JHO>&1vd);EA$^t%`Y)GSHpKtWwB+{(VA-OpC3((DK7JK0Zg+=%=4;Q2w- z2kb_qZ^rox^_>I1!Tl?>9>Ih29h3*hcpQ)6z}B;VcBT3*me*dz_G(t+{*%b_ zZ=A=mRhmP}S$iGstzlPaK70f5M=)UG{wwRYg zKD@P~^2^jUY&f1hjJ%zwV;auG=vvdnPSd*BgOJ1dI6sDGkMVv}-_dXCbEQu!sQtW6 z)UIO>Y9rb=^gx@os!9WY#_@MtYmc;z+Bf8&b{%zKoHWz;7~NhOuLm$DyXac;Dcgmy zxt$LEes-VMqY6V-r_k8x4>K#t9?$MT`WHAbrh*0KmT2SbNu0j}O{6|vr@fb*jr3;l zy$Q!!+&fGE1N7@{b{f)WlkVZ(K^#|LJbs1qUs1NC&9J+1{1|CImLw})=eO7z{V&;K z@VpuI->iOM;4jeKEvoduU!bpBE4&`yGRL^9em6im$S~%+aXhPKtXHeTfxeRtqui(9 z@u?+`Hq%(pI8@KL=DIhF;r$cz2YN_ts2*I;NY`+XUO+xA;QJSxeK?$uSq$eo9CL6? z!vQ%9CC$b7EY>LILp@iJ&X8`BevocJ=dGIGW8Bbo-iJ4V1?VRF1=$D*%``gL>vW+1 z_g9XqQSUIq3+XJi^9XO~7U?zVSXIAC@2T(9PtvdInPacOmQWiw2BBxwGvN+>yq}+E zL2r;&-;X{6hoo=SGs%W@j_^pBsGM)8wukUZ7^$AQ3`s9Zj&!cbqI%YBQt++2rh?6P zAe#VNsx`C4>VGhkZZg`B{%8gum($oS#tF#(8T9u9_K@~X%x}MAZ)nb8Z_u2k+QKBw z8|((v&)H>k;QC>lS5*67mC=zi#-DIjl|l6k`EWUZ<&3$CWPv$L#@UH+$ODs~;CwpH z|HgS8WGK-1;Ec~j;5p_MKCfYJ!FWHzv8VESd|7|qqcBcu(g6k=tI>8keu)=P@Vs^4QwUHBIHhX zK#NZxkzQ5i`(Eh54)m4qa4~N$&F!Q+%ACGcD`K9;JV!WF->b~^nlJg-JjTZY_q7q_ zxkkt5ti_l=c4=(D6P10G)$49#+jQ&M*%(hPzel={XLOJBMR)SR0O_#ydzj;acN%+Y z4~@Oy6Xr0G{km#kfa?G-PklWi1K31f_A_Q8Uiw#bxkkon31f&R#amM1Fi`M1LCYt;BIFn`0P-^W7}ZZO)(AYR$83m-+?t z_n*v2IMAKJnlvRgLK}t7;NUX)jD@u~Aniw*`c7xErK1#ll5BOm*>aqRVLsobd6QkM zSFv6C0LsX~@2R+VJ&xIIitZ7d_plz0Il>RsJsWt(90~b8L^3A4=qIu;4zj^c-Ub>c zsuyymGSIu%jI+@fx;IVmW3K!N$NM;TRL+0J`GsS>D;++aNPWAHo+bm&}rbb8>oN2dqp@#-C>2pj>z0PPg;?tR0tzK`|t2G+EUaeJwRs-G9>r4i{!JyX}49KT5 z8jN})?iz5`>ov%sQ-T`CO082HDWyTw;ei$rIZ@tdsAQuPJ`alA)u2c1I^t|ZS-r_f zd{GvM9u?vqo-21yrwO&=D;_F(s@7?!8nsGeMGbo7)@s27^$p>!Q*%BBGzXFLP(22! z(13`>&(Bw6hLT2|UW3RfrO`;O&Zu;Wnq)=>wbl%A;g6SBDo}WFs>Kr}qL@;R zQQ-@&N)gn9j-Whxt<#WTDXju4G}5R-F?5+kuBPVc4O$YU9)C#ajYjlAiw5hoT5350 z&Jei~k|Ft_4(hMTMB;;da0@-h1sHOH(Ot;P2(Hvb5+*o+5&S*uMCnY=hJppjTuG{%B;iqfmZQHN`f(@5?r0}1ZO}I;8p9@bXO1j(P(2Nw9o+zATL5sICH`u zB`N{;2o5Hb36+?PCIT#qgP?ws9)KWi!82%%*`zmVq4a1FY9Ynb<4ac(^@;1l@$skA za{QqiTpvxOn82SF3XPT`paQNCgg@RyXr0DT#UC|=Dxj$WI3)a82%tJMp8~*vSScDs zO;utQeOl@(rU3-Pm%_E03F4whCd?~ZGepYM5FLbJBK#3#&?nA<@J9e8@e?!P56z)R zxS(lS10W~-aYkB` zg|JP5Km!(7HGKttoY8TJBC0|9O~D@@V3O+5u{zkwnZ|)f;LmI~bNm_g76akWcr5-f z_OO2jNFCEK;Goz)0)zp>O6rX9pb_Et(^T-MC9UQI1(swfX~N}!kL@w|qkA~;=_V91 zBhnc2B2alV5P~$7Cr%cqDB+K?XrKYe2>jWpXIvjD_~UhPq8J{fl~7rzG}QxbCmRP4 z!4#n^$qNDK1OAj71StZ!l7Xf$jz2O9$S6WBH98BP@(cjm!bsP5tBTgEGVBk$R#o!XIg!meSNfY78kcrL0g|jb5zakDNrX;+&|r zJRXHVy;|YQ`GRXTlL&Q23oK@nL5t4?A`%`U1_Ul6qe%x;D&jJtyATA)f*@*wzoIjs zf3!B>-Nczd#7E3 zo|ZX-GNe03y@+xcKRl$t<@m#Gqlg339|s(YKsScqkH!)zi%8~d5PzKaaq(xshjB^q zOvD%2Uk#~Lu9Zw8I;Jsl z{OJ_@8384O5sefHbm+3qY_jmu7yvF60uO@OjEeOvi->hO7A%8y4F zWn39d7(>p2&Z5->ghBEIFd8$eln4#oApVe6@Mqy!;Q&a-;E#Tf;8^@sMRDwz^B+R~ zU%(#?nGz~PPx!OCt-v2ZWRy%;ejCk%ziK{$7u+C&6-EVWg83G9(hMau!^oJhbcAkD zQAig9g_XKmYfuw?=z-PUoRP@1fcw^8zGtKj6 zfFF$j7d%5VB&*SitpJ*ajkFL$My*EYrWqZ&rq!Y>>Knq{pr#p#w-U-rlLggdHe$-b zQj&~1JtxPH)J_d^2!GFnq)CU!4I8B?6BL^~VN5|rgUtf`86?<9{8dK8LYsejy{IZ(=^W@P%rS^alOTCQF9@hFugz!kR^Wt{GmCN z3t}M9!otx=0DriLW*AIZE9-0$FJnS0jS@saJivkr)NB&*?E#a?N(PLIR_r6n6aLU` z_@@vWc_tV-Y&MA)5Xx({;miZ!4wd2a9#{t+9Y|`&i^t;e8-hP&?7vF+&~vGi@WkakAiRG7>yC zjRjt+7VSfEtw!&q9&-GlEFehgS_vF~95bkjJY0i>dMpGxOe8SO+KP0jDI9;mmzlbF z1b>v~6<9=Ste!+@7Y$~u!KOu}U_}O+_Y76=NJXmn)8jcfD_l8W;Ez&>1_|>Oo=aAX zNl)K1p|l1PLn9^L3#_wX7jcO;n1MeL){vTGG~vU8Bu~N`#6TyQHi9OyBZG*BV9M0$ z?RFXhhyxXJ{K3fu3osEeu96KRHrv3ExR8AWYvK<$qPyHa!f&O=9Dg)PQbKYJ#UBQU zY1}5c1K6fVhH($;E$wmyhy?xynm$M_=uX#XQMr1y=byyFF|h-X=kP?Ji;H` zAR~S63y82-;0_u^3w^r?NWj(&ZJ3}a0tO!YmoS}LUfIpE;l0}3LP#~;9 zDY&CZmlR-2>A=^RpkDN)9FcfhPzw|SR#t~Jl?Nx$ZZp{ke`uDOHfE6#dp$mySCHcE z1q8_rtppmO{q`z1_qD@o}v|RxWic?vV4gw|-_@$J9YU)q{b%3Wygm4O}q10oe z6JNB`8SPql0GtExr&Ks7XIeV)NXFNwRk#vg;!(|JhvC!Gx9_l_V;3o!IsVW{8{yAv zfx)*}xm|}TgaptwbOy)~MVbl7CPLaKU=h;-pU6a!`VW}_e-MeoK|_E59k81)KVdKw z7KB5|1`CL>LxaL!$u( zTAo>q_(~=e037i}Kdc;(1MmVnXrUSYsTL#2_ZQ9ZX}F48$s~z{9|{;z1%G^ukre?x z5gm4X4b*If3c~fm9gCH0rWG@@p1yDjvj$G0!)~_IO3w=JwDd$qY*+@MRNS|uMI_-5 zw=2PfR|VJrBn2{=`Q%OYU`bRlRAyaOI?xo3KbUw#?5`s#_ycpwO}-jgO%kCCHdJSH z0DSlZ2X1Ug)p%hpYrcWQH&M}dqq4h#;Ze9!gDKk44?q*&7Bv~{R*FcY^Jt_UPByS2 z8S(8)EeR1zFAKh031OlhcnVgm2D6 z>XkEz_IQy5H8hf_zUJ7Y<{uw@kRk?pP%lUmDd3Bm%n@{O{7Gh~NcfZZj>!=zD$be% zdJoOBT7f^4giEUkei$?CjUfl+27EaF%vuK}u~>j-L$|?_z>6WL`#d9bMOmmRcWA)* z;c%d=xm_sL5@EV`y^1M&b{R z<*bMWtzVTm1b@U?;YxgoE2Stp&=0M}?69Ln4v8Ytux)6hgX0eq5WcPr{Gkn2;17a8 zGtgU$jlhBxJ1QmoQRV0k{v?SKgd33t$mNo#gB*Y8IY1}T42J_28UajK~3E6BzB~MRB%Wj(H<`j$-*zcA^59~{ITci zU@PY%od^D$VJCx&VzgOYR(LQL8@<26P*sBBtU0047(&dqM$v4u5*VNa7&EMgkb`Ds zKpgw}I=xv3uwvGQgM}~E!>r_*AwIVC4tFWj-( z$Y$CwGwYGIL4m+YayczdnujqBlOdtDVt+JD9u?^tE$*OPL%5sqs!qfLi&}~A`U8Jd zk7R*Gq=@1q6rjK zE@B%TrLn??RYy0-SYp9}5fovF!3Vnon1SGN=x8-bH5r{AGMN+zchqA#Q^6tOXvG^$ zDWV#rBq%EWH4n$N72BS^%NWh=S@rR+R1dczm3mT1S*CrV- z_1mF@HcXw&6E(L#t99oizz+Z%Z#e;8*qbwju z>RJgWX=Dp%Wr(b1 zFVs?R_UN!C=3oLVVnDs7NJR$mhq=Ry*8r#lj})$yqUZukK+_4_8C~c)rLo5dSh!qR zjea=kajN!sJOJ zW*!MFX*g&?0}g>shZWo4kPc96BmWd&1uuXZhLQWHSQ~<ub`8n#466a4)x#m{|xk zkcLR-s?;mzqZMy3rHE>fenar5jD3~bAwMNn2U|IFO(cS!2XV`8!k@`5dL?Y2h<4g8 z9uy*ew+4$PH{b`Iv)K$L$>OkKg(d+}7&ENRk%O`WLfEPy`~gF>Hv;@&%&-KZhaD0RBe24)ii6gO!KlslOwoc(ne2HsyNZfW*Y872ByJ&Kw z>pYFlqmgcoKbyl0s|fs|4K{;hb=Uwrnr*BOJItXO_yg`BQ^Fs*!%Y@R7c!$IqQT_# z5@rElI1re5Fh5}o@rymkVzo&?r_(BV$fW@ntc)QiK32dVtflC1f{)n&hFB&5e@>cU zk=N}Xia#tOkBdJv^mvg3H8gxf@CT6(i4L(EX|MffE{CQ#?yfZbL99EwV__I0) ze;BGt;EN@T2O4d+LV2+cfWt&!kZ9yElLCL3J^7LlbF&Wb#tD`5ehnjsp@fN{<(!oU zoCm@h#~(RFP$CNOiRkcn0Cb1j?!nRrcWlr!Yz(;Z@hPN{AWn9l$Lb;cVH&p5i%Dbz z{$gkf?a1)?0w$2mMI~71wHh`!6qP0K*yHigHV2^(Ya}a&0&RRC2hfL|N&0y#1%G%B zD@bW_DlB#fOfp;mG&kS`8Z16Nj4lTgvEr(xY@+au6ncR{5jB9b!jOb{DoC$!=jc#EG_n37$9|=skAKAb(r{at_ zW)OS~R!L{D>VQfh0gEK76SwiUj+S$h9UBZh5Z3SlU8kdLP$CLY6AX~m>jluA9)}l8 zAKbA!$>(%>tfCQVClm;r9Dc9lrFj_J20#wsPr}Rfgbf}QfAazCLb*s?D?!weKR~kt z0*aGSj{6VW2gjyOzza9q0 zN*u`N1OwP79;rwLeZU{)4pFCY<$S@FQWU*lsRs;!JCoN*5#mAT(MT^gneeOaE(=@& zY&)WhcD$p3ARtRf&*pNX_ZEpHiM2UdNE!w-!|B95$tl4o(EtVfgjp~EMlkc(ZFYPu~M0>obh-#32L-41JeU&;PKPB>^h6z$4*F+-tNjhK3$MNTq0(Pw6B^SM! z7?h#eOp7I-4MT=ub(qX{(FG-R+HLS*e9#EEbC^9b9`JOq>;nG0R2uJ*Xnn~2GA!qy zGEM~mG_h9jH&}~^OB_BQ%DTKxAL_&%c%s0c%ZoSCNFyPElQZCxe1tzt!*CF3uTR3u z?9>tb0lR?U(fEVy#{`2`O0>cheLf$Q6H^IIS13*j0vC_8LBSt^(FtP%b?06vrOAD; zI?*oJLGThoZoGgN0|v&Ua5-#{C1x8eg)vhS{;-(>*>n8S4M2wa?~(`<*yauf zAUsT&G|OP-ao8OgLs&-=sKf5}J3ThLpCAnsJ0TESA0ohcfsEk@gO7-@Bwro)^Uwr~ zyuJ|kQXx;m9eVsf_=6OVANf#Yu2Z6-C!oMzFdM`>Q?tcm54*5|Y4_0U8W@mD;Le&9 zbU2-EJI31#)$_XCHn-DZcR7Mi_(sS?(O6w)3So;e)uaL^va&Wj$)761e- zhF7e&WT8}iZAXhcz!$r8)gb8|n1w7@RH8O0k0b?yK`gV(bQ>CKH<46m;f3i*(n|&j z_68OQ8$V79v=pzVDNT7Lw+FuhYZt*wiu&wO|F97XZUYC-iqCJ#B94mCs|$*>u?fx! zSK>=tDMc{|mIj9{7;xJxK@UZ{4Xt;gkwGkSffYeZ;_EQS8M{pAUTCpJLg8nL=;$`$>?J7?e3mAy2}e2lE1*t5UC=t15Tw znPfdQl9;IY*E|3jL!t)=P$C~{%z8>Z(s5>I;e43zC;A*wH&*iwANJz;yC)bC1a2&B zVQ93+0p*1`viUq-yVpfZ5C%IkCp4qNC&GI*qseXzQ8{wb>^`U|d|)zX4v&|1RS*bk zcKXx=Wvc`m&N#whl=X$ZVNCs)pxr(huQ6LJ1DQsi@w4$^`g0Pzr$^^MU4(DfK8Auu>u1~i7(=a(mO#O@f@5LuADEp z5>JX@pTll+*~1~PLk#;UVq1mg83ZhH9WIaG7Vre%0-%c??9=!>POk@Wa=83H^d43i zJ;Q|&h=japBz!*Vzt7>daeFVzJ`4aD*gTGq!{c$eF@~Il&*gDPBHo}2+u&$Ac67WF za89xWBP&MG>F@`fUZ4;&0gNs_`4S8Q`&f;K<784P5NNy(kCV<+a7a+*n6FYrRD+bn zM8&`6!3(uHUZjDBhE?K`ZsP}#@p0J-{rt~ zOCCqi=Xd%sh+dEEagjL*(2Qz#IpL~e9chdrMN4*2#qpc02yplFRQB={B^`Wg)rv-F~#&31x<7NM0bkGAkms zUtOXX27~fK7hUvv1ib92kjrav#7$1K*=Ys`Vg&{+rysoi+>xx}5B3{Qu~Fg5`GPC) zq$q=>$>WSh{Z2^^P;@!bdisY@vL0RV`0!imzA#=Qpbb9J;|coQexDP)^@IX|qs@if zuxu_YlF>LPZa4#gEBfm418mqzO(p^u0E_~r!l=vV^Y}1^oJGLn^TuNSu*VbgqBLHv zD)!NX;x4<*8LZkz_&V^tF;f`L;V=o(A<1cs4i5yHfYaxub5-hYb4YUvTM2SbbjUOG4m11~jDoR0j(g*yxgM>fY`&I&X)*LZtwBPLv_(jR< z2tf%0UhwnAz?R%OczkfWTo#xev&$$Wg+Z~hxF}Pm1;|qG-4o6USIYgwPcEl-=kliuDUl80aaEy=<_$ztcz$e*1 zU>D{S@0_c_X@tGD(=377FnK#1_&H2>z%9~kuN}onI)2;%=7BzwLjoAx0hiZ`$ni&F zqrA>Q&`q9c08LJZT|SE=X?9s)Cc%MNfq~l<0H**L_}zo}BY(lDaOHf#wK^Cv^uq)g z0(Vj@ND<;e=jlf~_2`4wA9jTO5hDrF>xX#{p>2MeZM@;2NP;IxLJWW*8b>$ayW*ZZ z=!WI;0)MGw5FG>q%rcmH{9Yf%(2q{Lf?mHb9uGu3-Z)Y&tS|x)2w0;yoDWwBEW=^& zafHAfPA~8mi6Dd9X^Yihba)`#1zmppsvrJ~@6mxod%UQKYLI?I@CRfJi9sMhi8R>w zKT?%Qnn(dZ_RmsnDZDe4>=9okhy|Q4LYoq__E&=49*IO;DZf7u_PWC%n?2x;hQgk3 z!0!$EQ+}@>6JP{0D)#L>&<&I5F(thouNS)+UQfgWSIO>;ptLs>rd1t+lL);i@X`gc zdc80VJ{;auD(Uk@lHnBU#GPP-FdIpDToTfeAfEaC;Y`w(q8A}p)ObaBMJSFJa&2e| zYDIwC2KbsP?Z?S&qB+SP#_p=ei_W-QsZn2LBkX1^zy2z%_Q2t}_4tq-D+DLC0ae@J%4LU9ub(I2t}{83oLkO#f> z%MrXhaC-56&jT@-JRZ2Fd?X?fNY@+j0y%!H)w0vn zfpkqc?hm8`GNa=ERO7!x zdqO@s56YciRaNfTvm&ZNN}{6TU-JND42cmSK#4TaAzw8f={EkkMy@-DJ!88w9;}OE zaUYD+4i2sTmEd&7A@3ZNS`PYRvcnnnCZaKaEF2C*!?|!E3>PvU4EnJ`@k@cA#p<_Y zkqS6G_MkuR_j`h1Nsx%fqEG+?4-tB66r>A3uf_}N4F+<#Y%mzl#d4?6r z_u7$;NAWBij@4y@IVYUHIFv?$R}=^Y@!8exa1gMg*%)Rc8jV_%<`eZ>qZvl= zfXD4mfMqHLKHdblW66P!#-!62xuDOLYaqvl0)Zy(mqTk58A{60P&`@(hHy91*f)Xs2*UJOY(YyMQt-_j;b0od9|p^4R1U|J@emI_ z8W+M}m?wEXeo!2RLR~nVE+h-6GaL!W(lO|5Iv?^okWR-U5pYU2)P)Q187)wQkUfkR zhr@P@dsH+WC0%nklF20C3w5oAfFLLr#9*&2TusgCVitV3}gVK~YkW7bReY{CDw3Vba)`pq#!{$SEXJ#lW30@Nl-)MHw1q`#*ml_RU-{_B2tY|L>}?aqgZKN z342y9Z&q$e!hw{tw0}cueO29w5owq6?Mp7FTm{(z2oBeH`+8AxNB-^;JHak z^NEHe{BPEPwKVmH{&GC4?rM3li#uM?Hd>RgC zz9|-VBb~2FB*3Y*+#GN5!|8)s#9Z)jQPd^*C#T{m?pu0mYil!^4Aiw6A`;C){#-03 z$KvQrINZ|G0yoc_3Z)TIoTQUW$43K2{Dz$8o7{3)MjJJSS(e{dt(qhBq>7-m~t>*#o(#S z`8@8$^YPkfI)!!OuwnUBEQ?twit1w7Y${X8f<-zO%crvGwzga;m2OLuOB$DJxqVF2 z7>0v#9k-8(+GwN>Gl3tIh~#W&z)Tm9`dhkaVL^dFlaFPSbgoLha#rS;uTn)+gOtQX z#lPkO$QTmyv1+7&&L*o7ipV4WJt8YlFJsTx8!V=V=WKyMsz|$cwDwm*AW$q8<#HyI ztxMtm8ul;ny_ZAc~k5pOD9jK?D>ute!p zZ6TN7Awrb!m*PoYO%zm4CClaZRI1osD5Fl?$rZEE+hS`%_99)(;aMhA7~Y;L2ZJ_S zu^3OfQ-MG-nR45L(=(|Ic2yAIwqfN2b*+Y&M6*z!E|H8UlEoqxhvjlPRhRT-V4$-R z6wf3w2{?YKL@EJeVwZ!psoGQlejj2ai7ksUBcs7q4Jr}8PhIOj3o%3z9;6t0{vxDro_?Zsr=o=LQ~77~H>BE@9fhR&mr zWefU{$(N#y`DTfPn92JxnTFbQA)ly8CNqsiUosgGlF)PJtQ*Ft7K2zI}2a9YnS)a*ghjrF9*JOuf;gSZEi9#fmiYGHD zo{Wa!;iM9cjo>3UBoe70CK1Wi+>Dtn6$_SoQ;;PE0!=ZIPt&<7^~#w~=gc1LSp}l4wPP9_kw|T;4_l3}A(aq`w6?aU zdJ2VNQ?90|6pj>9ZKdW+bFq+ZD2yy*3veM@VR2wSGQM2S;mtTkIBm%iiYX(y_ zSfX^U)Z73CKu8dwg<1|?W)@jGL z20SYin#YW+?TKPl)7qNJ`f4NCr>Mne2hJ?y06UtDo12>(8X6qc4%F7B9VC-TQ#PB) z=2}~^KJ4k~scp)I3tT)XUdR+OO}LZEWm1lmD-|u}O1Wm(og(sN1KB`Bt|3QE(#@^8 zEH;RmYjdd+%h?8BYK#X8o&g7vG%?6!nsOA01>eBICQihQ`6}g5xDsFDN<1l!Y|Um| zg-lO(b2c)vm0~u7*4LwvJy!IhP%0-oN}Uc8VxfdJa$Bjkxs<8PW((!ka2D3qk;`SG zkbMR|Mx1VBT3aFATx+g5T`XYVrvHT2Lbim7DP78q$d*cl28>}TQ_N;t3yt-Cqnd^n zihadQHY4XU%?TRKVr{lImyBiFGPT)`j@ssQsx6br$*F|H;qC0qp{BIlGoco;q(Go) z$u{QcJSca5MWQ`kR75pMNmNw)YaW`jLt{&}8fl;#^VJAND<+|EB>N=Vl3$2YOG!`1+XLQ!r*A;7u zbug9gK;AvJSb)i_i4^ml`Fu@1SfX^Xt)sP$hZ>@^P%F|71F{y2^;y)HtuOZXkFBro zJfWi>b>dEIXLEfv+c~C?jUe6Gif4_D9TQKe?}yLm>g>!Hg7xt@iU(csm5s$lZrh?A z9UXwL`$!M!bMD5P#+rD!P{`L6(V1+vzrVk}T#Po>G$EpRV_joixuIOFE7s-QIZrO$ zR%|PF6q@8Fxv{1YDMVU}twmyz>*y>N(#2FqeKC9Th(c>HH_2BQ4Ay}IX9Whux^j^s zv52~r7!Ne%^EtP|mG}}@;z{v@&O+YXSa-shjzau|PKt%RtG>PkjqJCf7maNrG9%l2 zv5C@LY;21*HFmW%bhOn0PK_fvqlIF+=q?uX5Cfd_`h1#h%^&3 zI-3e@jg5`Dw&K`ATU%2r#;~ofsZi)_Y;PWaVn<(N^NG!Mg}OwsZdgryeZJUKU#Kr; zQu(fYeci~O`eC)%uDZHnB3pycK=kz$QBy9_KOLjP1A(Tq(B44jLAmoQ67BIK32JC0 zK~eFqdFUt%jh%&Rq=9a4sKx@k4~qDQ+HA_jQ?O?hOZPU<80JZ*n|mYaNE$Yz64L43 z-rl+??d|36ruy#T@pQQ`YWRrKh;n;lXZz&##&&E~_BJ<{U_KhcP0hY=gKrX2O^MoA zb3<=KL%ta-QMzgPh)&v3D3xkqof^ndZ01Q`PaSAobK{gLlbV}*Cy$tdI&o)MZ%1=o zUGIcaT@2~oVJ$7-G-Af2<|*m4$J5)}&=_e>rvj zPDNjPZF@f5-PqVrYC>n~>ZVMY(%jt?Z?7#QqIi3$z0}>(-PF+3Q1BJ}h4k>|;mspT z7^TiRpO{LnV?8xS(x;bMSJ0pb|!BRL}3b&UyD==tk=x(A& zEaE;Tro-h1a8|eyU*bwU5t}CWHa7U%OOq#zD5WR&QfzGSpz~h9x4K+;-BlGYdn##?k z=B9kMVN^p)Y3vEjBa3yTN)635b+tZUc-%NR7|q3+DRVG7JP>GlN?omV9+W%3BGDc% zlAwl05)>8xng<|bNbD(9BMo&|Yc)1DD6t9uu72j#GZ}W)Tu9_OefI@y#f= zwYS&QC(AAUEiLtBute!{-x%^L5$cH${>p6>cr_)^Qn`KR%u~wc{!_=yM4jc1a!>z= za;elmy{(i)y1%ER1DwX3aY}h+F6a06_qVji%4l)99P{U{?kabc%h>y@88c=KJU1Wb z%Sn^3tG=r~H@dC8rL7&EDV1iJ73gN?bqa$k8& zTX#)2^0X)0lRf30GBIfy)8F1!EEmR>+e>FnZ0m_N&W*IiVr}3+tcXFmb#yyLVo~E$ zVovUEX=(H+T!}AnC7u*d?Qd@hb+w*4eN0>K)P9QXE&g(OBpNx>i4Ju2O)O37o9gT8 z8iDJY?yeL2hK=cK1)RDj_SXPYWna0yC0B0uwX}4!6xv{XTgLT6y5;`z*rx8Tnws2# z`TgDPeO+B$O?~B4+WY#tdohN6t=;YI{avF*o<4ibNnImOAJN+0THD?_w!WjIrMXhQi-h0=6!b_OC)Lvle?FU4c66lPo~|2 z?jxbDZt~>+McsP`Hg(4xhfCt!MK-hrUBp5J+ z)i@inNJ5(3jAk{X8Oa2; z)nzY=H#9beqDAq#p1QhNygc61+&nej(b-gt}shUy|b?`g+-&CQ*w7b`;(CS+&#^wc%xE9K?*cz*VT%bVlP zamoxzJ3Bku+uO6pXQ0$%H%D7ylzw+df-+Z8X8h&HkLL=r{dA5T;q`k2>K<={4zNNl#;4Zgc&T!On*A zB|Y@fSckiB!%YskFpK7nIaPBz=4WFG;w>GeEiJPdRSZdj~_OwiI zUA}VWg665qTk9L@!j1J^QAMe1oT@Y^jj_tQ*>y_8+pCWNb=zk6a`spAJ z0(Jp0tT-ZEF&=IRaG4MheW=c4*Ocy>FNrVsLa`lmLy>_`EE-8qi zGeWoEPj)6BDw~4Wp4AJA6Tw8!|Ec- zUBs1}hO%;}$*I%(axytLS>Yz`T!|+hIZIxg;=HqK7xgj0Nfo zWX{S{R}u?7l&UfH^M%AA+^Fu{q0T2a(Z3yJ^A2*eI*BX8`jVTr{QLzwv8iA2W!|SIv>McI$u9YSae!Q{ zUpjC80(I`fIa%uBw8fmnU2^OrY|d~HZPZXm$Q1$lzfjhrUA)oYmOa*(Tc3$c#!OF% zzR+0WF7!+_w^@}~pLwozg(ZE9Z&SgR(58uEL3dc_6nH`KbsKoAV9|%V{aH#DpOrPS zJKflsrdaqi%Y;%6o62Vtm!_dO)uz~ZTTZE!Zd;#MYLmke5N86Qb<_fwbOZoXf=wKR zbY=e&pfw8HU>+=`sz_x<0SOw8e-0Q1^JD-sQdxEUSQvTio(CTJ?LGHD!ry!J&`m-b ze2^_RVe!{7}sVDt`NArJj}=gvFs*s(*+ zObvjw8;*S-r%PV~dTy?T`#@Q1Kqgy#T7|2^8!K;Y==8LDJDa!Um{t`G#u6E;BSr!5E(r4;pjzW#&d9%sFdh zXE>hLlJ570YeY{W2kg&nahg2@r6;b!4O4C3Fwg?bc3`m`zz2FC#E=8f;}o$&VZ4Z6 zhS-U5ux3_Or4w|Lk;mZe0@9OUk&NZZr-)uvRSj1J8(^vEyEvQR)vCgn;9fU(!AR%n zim!mJK2cyB@ir9&Z;FtL2qC4Jjd;Oahk_{FM z;feUGffKg%cZ_rfcO*ITigjXX(TOd)@14)zIXL*`3F?LK?^^fu?-!gkF+9uHwtH>U zmdc9yyUr?GTQ+f?U%j+=Fj{j?1+eZ$;bn3fKr;k(zc33 zPrnb{<@csC!e@8!*=LkCJWdB-RCN$ z7Q8FnCAiWHNuf}fUg&BiilC&oy1Im}^g&@TeG9jV9~OqwH#uDnBBpKRh$Ai%Yz^_y zu|xOK8>RyVwGtTlI5bw^d%4}2wr@f|ymuR~3&!a3I$}}2sIU;cFT=qf#Es9ms;;qp zT0{KeZcK!)S6@~A&l_8w-gXMfx&1~`ylwRHcH{G^A9wyMev`NkcW&n{R1BTz#I6`@ z)q0BKb1|6D&zEMKW?NSCtEC~+kYyXcP1<1EU`Zpg6`gYRc8N#lr%tg;%ctMoVuCUlJoJP`)W9(q*z;i4{B!N|l0Qn&*BfxtS3MGiH zAU&8a6_t}}Nr(sqnUc6pQ7@HGmDI~7lb@-lPbRD6Q*~suqMjj~bmHsk{s;)`@;Ug5H(N5mw!MXeGPeoe&L`d?!w0HRaOq{6J2dG2=ODTI(x>2{rh zRRC`6PvS2DSwn~Q5Z5FC(E=$9K@yN2NxpY;@;yFqGaumV>EJp(kbIBfz%D*cyx>qV zrO-o4Nr;bewR{WLhV|>`hqw{$_uzxP&?jPVb>74CJfue!1#a{py~$WWFeESJhxv*3 z)6XVx_>A3;{{g;_=(%$8(6IvwdJpiuVG;*bLsL5lh7V0KXpfN3zW4%XlVcyMF9{16 zl~ySQ0=Akb8Ki*JaP3?(=_AX@N#rbIBo1B(<8JUh>?XK)n97PB2NOH?Vj@IXkc`~H zKPNlC-J@%!I@#IBJ`gXEzQ8&JxgAPg6{$5v)9M^`?r3fcX*V^ebvQcQ&ADl=b^{-1 z7mQZWzynkbwFbC{j(y2=PYezz*;MD`kWq-^H3%a63V50q%J*gmWSpp=$phaj+bH#* zzb(#{FV6?GbJ3+vP#C0UO@Zg-b&(8psFDSL+Cvgh0Dq#AR~68FY)YkeJ3o4Li(>FvyI z_YDXMF(J)2^w|fp7G@`M2D}5gtArtWseQ3)ZSF8XVjuO4=8WbRU^WNtqc_b{JdM*4 zhxR<>`fyH#RYAWDh0YO2%nogor=|0}ZyM42czqy)amftE=rhoMnD5P?ph3buM#%n_ zar9qXGQYogSDx^g~ zyy&QH<*W1e?z-aa`L8WCwjNyjF%d(hMJqd2?_VMWUY>Vf|08dYj-0Mcc_ldMoyU4F zp3=CvedX_G1CGA}HEahQ8@Pv*UFd-v_LyAZ5>sKgq`ux1b56{QhNqcYoK1O6;XcwY z^_zObt4zzntLitKHibuG+v+{hNzIe^x=Da9DYuvN<>e*Qe1?g<)$B9#Xh%2AUOV^n{z6+NRxgQpI-u#n5TX zm)#bh+Ef>Oxn^2vN!hCIu9dmI%$rBIR&}G)x4H4x5pbOuz}I_W z2^!Hd?tLX7q9`}t95pwahtc;BJVfqIGq+(a(Sg`tZYQvE_fn*hd$Cn0HqFz=jh#jw z9Mfmzb!j3{3it`j_@QH8E1*-kSM+1M47pP#V6FQVG}YmI2|A_X_|P%UOvd1IrIMaY zh*kE`y5u00503%|&jf5r zxyzIWqu!$r=^OMhdqYNtzS%xcKf7d=eybiy;+}TOWFZO)0@DiQT;6K*0VYPvG_;S* z^LKiQ7rp^y0-d`Tq=q9Jt>MV{kJlOC{9Xgc-r%k+vzGbFc*9j84a;D@0m;||4~D

T&y1Fp$HLJ|7Rv4bIG4q{C4uxj!6Ei(e~oX(B{q=tNevNcN%}}E_Fl{OQO|xrexKx zV4vl2)!ZdYjf_gQ+5*HLs@n^uOl+ziAbsX8e^+2>VB>E}OTr_=d|MS)H3BwJ&yJztHbr{fiO)Hco@$<{Wch~9M6l)I2D<{q!tsWxSq7vQvGO$?ck2R zKyoM-kXhm-$%Sw5FCM*HI3j*^#3JS01s!SYv3JE^NMCbVTrpQo^bd1|AXqbiT0kk6 z4)Vta!LdOe2FfP-UU?|$isT_7AkyrboY!2`66tcy&zhG#&o?`7Ak<$rFmZNdcJ-is zv1PGian@jPuxOKIlVe-iSq`tv-&%Ncm@mvQhDE{KYU5*VKm_4?Lly6=KN33`E3zV^LrWlVae)!kG0A z3d)3a$xx!-bjr!U?CvQzcgm9KzV1!o z;l#WX9=TxmUF6!|9per^x&7HXS-E`uE$_c^)6yra<@&q%&efxvm$j`daZE~|vMae^ z!P=UP!n}#MtlDw+rJ%KS$39|uA*Ho5lv=%*C6X93-+7m4=y6=X8&E-BsWSIN3QY#tgHJ7MsNT)FmT0N|J*L-lGVi6ZIL zoWWPNQ;UXv>(RYqR*lNdkWLYw2X`2_Z-Ye2uy`LTg+_O^kV_9fE)3Q{If0@l6?#R_ zi|`Y03h81tON25+W}d+(jC8+>j#+aRlO)cDGfbw+733j)rM>+mQ9xqEMTm6Dk(0&K zj;sFT`(+@y%nHr;}-dR`^RDe@rqAsljliw)`u5$$; zs6iv&Q>8Nqltkg+)Y_WeJ@-z&tYVUK#g;X{t1(V}bMVc7s~cZG)@wx!`F}M)~J!L*ID0dW&aQEZ~^RVZ&=CTs0@(mXj9D&Cv1!87~gV>o#t9fX3 zGrK#~w(My;=ic({H@CMBPrml+($M_5bJe3aU8nwQVDN+$151eU>b?hOFS@1w5%r1n z8%{ZEWP~){{}hR?TD2~DL42t8)ZHW7n$F@cJ6AordZb=a_kTnzfk4I42Rc6JzmcR3 z4lW;AyjcC>%A3?L7A;+#;ojx4j;`N8rabvDiErF^*7o6H_4lg6%igT}Zoc7Hjg$&K zh}SHHwxENa{?xr7J?P=zGD{E^y*AJ>F-_IzX>yB>M?WV$zXOzmT@W~fQP=^`jT2O{ zUEZMMg{V=X8n#iPIu?Ap#$hAf#Z(r^R*4|S1@9HMAC=O$e6AMgGml#Z-wgVworoqX z#3+TNDrtt)D=n3_VSBS76LeLWiY(@Ux1}50h)vMbgVhH}h{N3xFEWVD2Hz-G!Tp5VPWt(p+gp zX}x@(YcxxC*vq21)F?s6BEB~_SLcoDh4QFQpW$+pQ5T73b6EXUy5ad(N)DZ~wUBxM z=&RIH))lz8Gzt*#*-yqaQfg_lSH5D=JiN6Z16bVD_GT6{w=QOlDKS2`%!y4?@o}ud zQ5NyT;4MvY!44D@`SW zP0zvegVgs8F{0U*a8NKEKV>=+O|gYXjv1Vq(h{U6Q5GYGX1C6M_NwHUC6>3ji<2rRdqy~THW8)a6#Yo>c18b zu352ofS7OG{KanTwy(}vcYkZkjNYcHkFL1j@ClYR?$XTk?D>lZNWl{ik-VWr%Op(@ZFKq_7UY8HQ~mKC3V6Q{YJwGylIqv)u2{44O1`{Naa&j+xJo zA{F#Inc)lNk11Ua`jLh{_x$GKWk+6Acao8}2-}rj@_&6^ zePDhZxDu}(P@j6^t}k0Ei;kRLTHAVn;sszNUJV$TxCH#wagjA?V>1nf z7;)7nH1&^C*E(>j0O$keGW!#+J{l5UKl%^BO8=yn?^ajboqRKO|D(8n19#OuxL11X z=+wmbA~k@-^ny;$35ajQPU7X!WQ$i$ zw*)LPOFNlt>9#DDmztJXMl2&JGL9)h5)7sZHd|&ijrT?c<0b>iv*j6VfrpN%3VP1* zy@55H$S@mylNn}zGltpw{{yqB+lR5yBTA4$h1*zYEmR7551KpDPa7DC8?dQ{+-q1- zz$W`0qQXlJ@vjA9DbYih(!Bd1eHbN7y4%qGOJw#w^|a-2=%7t`pBomew#aBvX`K8Zl~)eY@`chB_r zO4P^I&(-(T#|v}G33qDvAk{H^{_q|l#)3j<+y?;YZF(M?*%@KWOL_zEgeAKd(`KMK z%<@HmB8Ql)z~B>2R&WfR@%&RIpPh?64e$v#LI5N*#KmzlNJ24pnFYPzgbwh^Sn7#J z8F(c{8TeAH3Z82Ofq_OMY(TF^2MnF0|DX(wA>f#-L^?^l9spiP(F!pT8s>oy+#ZqY z_9e6S?c@KtkN5Z?xPoDF5=bq0^6O3)xy%7Rg-Bzp4+*a32$(J4s$yp*4w z1s>qfewX111{$7VpfXy<;PVG45QG!PDfdvNEs4KRm?t_}NfA8&buSnTKz)wzuP5(& z@=1RBlTThQ{_^t6j||{`%8vb={}lJ*;?^n7RR}=vj)+UZ#$r(cUHu$R!1}|n)i^wc zv7e7&tOhci^A_dBSPAqY#TxKzB~C(RDUp|EP(NLYhlYTTnz0OMQQ7>Rjm&g=ihum4 zUp!lJU6rY1b9})GXi=m7o+sq=r(UzCJ#5J>Eh-+FE-bwUcaG4Uw2?vb-^yr~p^q$p zK4vI3)EK52Rv6AP{0aL+6Qt>oEFN(*LoKN_#7ym^-OyrMK$e=;b6fN_xR7>|XJ8WE z3x=yV+{>Gw<(*+9dOn4iU{%xqje6}Xt;$Aqhwk8v9swb{n9|#bdvJ$bA2$43b z$CCH{94Pndm&xV)W!I=W=!pM9Jg*tIP36iaKuh8_K7dFnBnVdRfTGb1r$aPT{J)bT zpQfaUJigYDm~cIXsMKV_gNBAS9qrl2ACO)?OrxDtANU6Mlt$W>`F%!G!`Dbv#?5ZTQTnFThu&FFdVvvgUY z?lYdjJg^eHL0H9f^nU(-t=CdifI2(IV03HD#{ms&(w8y_YS{)~sE=wX_asEB)^>mtKQ zdJECHOvI{xtK^BC2&kDHnOvrvm6qk0L*_`cbOWZj=DGHP^jVoU7mYi+>1600<$UiZ z!xk5x9d+@6sKMyQ{Mfy^UEuoKR5AF30ULu4#{|NcN|Z^24G3xz8ghvj2)PVVbFpUu zMR+R<`qE7rF=p>rS7@altA77Z?#OQb8WJJzZm{oo@tN%Zf&OLS71;Y4Ez#XkqhQcm1HJ%ncWG>Tm=hVYrSzOGFF)C#?d^x6N9AH$4Q$I}^t7`++ zKs>-_>73a5ny$nctT9NTm4TrZo@;1@freHXXqUs_W42U=HU962n(EVsfJ^vEP&4^`C_+ZI0ctIe0f3>B?QZf%?~ zBMFV7yrTBD9W&PF`?8aFgu)f8C=RM8N#6no3%H5g@0C`Hf1+FTQv5?3Z0`b7zq#MO z0N6JtYmRrsZ|n6f^=LI6bzTo$^rIfIOt zRrVMvVxXZS245=06cw{KM63~Fjrbz*h*0)@But@SC4d8fAa#vu4F74q0!5L@qy>;8!tsdtZT-fEJ6|=p%U$0`&Hnj|-rFM%ol&yR zo&DMIXsTXpH9vljD0~k^7g5wzzfjNVSbuVsQMmR82&>t)m#6Uch%!r0yvXyKL~6Y) z);4FGcOL1p_B+>-mHeP_sp(|0(PXDehmFIg4N;y+FM5=F6*!K0$sJ{CF-2=7AfS`3 znLt1OR`F6yHs?@Grd#UCy=E5a#m;wr@N$O9Om1ZfbXQjBC*1#uf}(j_q~j2{G6@4J zl%SciV<=p&;V|>QfJ;!V#0{MU8VOZ_zw@@Fd@JL|@#X3<)uR4wANl2u``WtaU%zWn zc{H@C>u=92Ja1xoi0?|?ExjBpk6d-qFaKOkZcvuwc{7uL2$YweK&91L@S5{g`?9TV)himm!wwm;q zuc~yKzQxv_-r}29)Lc3j=-cb-Enl6rEPJVMS!gi4Eo0a>>>nu|DL=~*G$o*sIJDkG5AtJf+4umNTs!MxRN)l znmCp`k&0`lg4&uPmsv~0cdohiImIjN%Zs#OL1anUd-%;Za?%!0F5`uRU-`(Ez`lY{AkDX~*M~Y8-=*2}#I__G$?{QN9 z_0`bhExqdBFS_=3gIko(dTzdj+&bsBI;E|??%RdS&e^bJA#HwJ`uq)#eo>fzz65N@WdqK$#I)d&7p}{a+m~J>J{iIBNj#+SFA+w#n<80G! z$4t^s6>P#m@V81(pZWSo~KM( zY{81_;Q2Rfb{J@a3IoKQaWOhzk|k~RkNT%TiIicYv|&u9(CB_)4A#L|A{q^!KxHXu z?Vj<6v(I~}wYzm+ps4J!RjV&8FAD7A`>y{-*Yv5=+IkM$Dr`HtZOeJJlc!9cQhV_U z!a0D|n1@~F&Qq4Pk~Xj@QPRnC7#VTPfMwJo%FE5R&mj-#tZ6VFbj^4y4N4N|pEQF3 zznC|Eb?2);dry5@{li=8rsqj5i9&@!x+`EHzILPx8fmHc#*tj{L);b8C?%@xo46;G z%Qlj&I^HNsMvv$+mWe@QwPA)h#W+_O5a&vB3|+=KrWL{o;tFZGVbHkTv`yS#%rw!t z8Jv0@yep7Yk`vBkNz@UeN#^x54+HK zJOct-{hFl8laJL^>foPvoht1o7m+LBbMeEuw={Vbe}Mm6@&-PEdq=U8_z57O=U!75 zl#w#ASQpbNL=hETmu`hPtTSfFS^6TmSl=i2>zB%_u&+Cvv+M-6^PCxfs3zicf(Y{x z7)0lcWTsBzs8IwngBeX%nz1v@Z$j-1M$s6k%z=Wz0j9ZQpwT!6n#+$46lQc%CO8UN zH_qfBep4DG6!lsgt&3u)p%DZHi-s5wz7!(jC&@$ml3%?|E+bdL+S`-dz;71%lgoId z)e!Dv;DH`cFmU}!6`ZoNK3!j^uhLJ|_vx4EH(}2A!Zo7P3E({` zckzX~ng179hmLDO+`NY;at~Ml$H6!O3zZo|g!Rb`a`>s=WnjeMbH;)R<@T`GP|Y>w zm`^#U`F|z9<@M^#WS+WN_lpbueHy-NDl(Gy;=2THl2R-X-bk{LUR^^vNIzLYHj}fF zo9p0&Fiu5s5jThw=u~d?aaqZfpQt+scf*zPO>nuGo2OyrS>SAvrnjxL=$&Sq~4N6-kHo zq8MY$@DOR?B{rbTLI;{v$a^@i32_*@cFcmN+FMHWv&74k!-(37Y(Z1`)sXw_#&G%} z#bq$yx#p(62q95lEFKe}u71lD7^b(vK_&N2z^?8%W}|xJuu@IG6Gj{G1KT_SV@%BL zZ(^#XiCOR_D423D9plJU4%3;(#Yic6z@0(Os?-k>mZ(o7q@@kecosmf1qfJDAl`xw zAB?49gwPe?m(8#KF0K8zEL_3P&eGBXMDL?ny~W|JJ(s<5!qR0V_r~(l;^BsA4=gfP zzqEAIT}ph)qkVsC?j9OBX~~Tz*&7_0zGto)y}G>IulFjm-I=zcg2%1-Md1m%*Qj0y zFK2q@qTazpGk^mR0|zbyjiqyb;!sMWe9T(ss_-}SE!GZ~;-BMK?ikf?%fY^;a^@5} zsz-7a*=W)`>6%iw&;j%&DF4}%_{MzLUykWWZ7zsyASA+g7c%g4zVm~L&xcQI_e0fshbWhCr^i6%b@p* z7j`za-nMLDS4-O6dphq~yYJ&C&bYYembR`9?Z5a9Uwz*D(>puM5mI(0UzGGA>Fq75J(bHuzm2IzN{2@JmH2QwK~XJ#81 zz8gRd05GEf12d%z3}o=Je9ItZI5TeyQU_VM8?ZV)*bOBC(QfK7fF4Z!RO4}O4QZhd zS4V`e7v4Is<+--@E>ixl!G~uU`yQNg-NX0aSi31)(&jQwEw5~CYx~Q^#6fDRie7GN zd-J8|{+#P}h3&x2HNefL6mIfLLA|FUr^esunUd4ypDVABhiwK2;q8)pvIXU2xl>TV z>ih{_!)i5nPoBbT3W_5^#&VeP!(q!$3OFVqN*NHDr3BpkTq&oFgO;g{bC}&4o~BA# zSPpe|wjNuj^1TSasY-}mP0y~TXP$4s8GzQaB!4=Vd$F@OFj0TzahM3iJI*hS*cU@g zDxerD!pE;Mj$j^dAFChCv`2*FlZV8nJ>7RNf9CJqEzS2Yn!B@O&z|X*EhmY~6=6U||+|z$-rT)NG$377U#qFrq^l{H9MTKI>Tp`w( z>vNmL4s%EDJabpZD)V6GX7kou3#s?{tT_!XS`BwV%f&aDba5+)G{E?MfFWWQg)-pI z_hxxGKZ7de)y)hSFMu!52XCO@LtGlC(3E`S-)Cc&K!DM~z~*51>0n@Uu=gFPn~-}Q zXO6r603^-zM>#Q#eSzPGnCFBAzyjlz87&?R`ZaH=!v%b$^&;Zn(Pta0q8Ie7|La8K zz`hgIPt|8g=+KA%e2`px>1Fq(@!89-m{?IUzwE{0D!7|mz|kq{w_lh3{Q7&&fOZ0H zUvS8|fZ5Z^au35S4|6r?owd%5Q~?mtUns}w`&4z;}&2jzBneuToD)+Nzv zSL)qb%Fcoc*WDXf$?q&JpUmQAW? zHgu#Q8Aw+qvb2tJiWEEsJP1Bkp0}V8 z@Z4Q60#29ShEA{JZcx%mGY{}o^MVX-3eD`@4G0}o${4H$MK&>5I)I$WI0+piCESB5 zRA4F@9A&;f4Ir>~QvgXtTE_r_H#C4?K$nGu&yO*0n6y(rKHbEAO<&p{VxE&YOZ8zX z!k8yH{k7N9_Uw_|PaZBn!aBzvdqVB!U2G;<+{;SPDCMAO$Jlf-8nYy9F|O#$otY$a z)QEc3L0S;VkOBkE35kJrKlCkjKN%FWjw&EH;L4yea~S33%mbap^cV=8cQw5*i-nT# z97SIg(XtTP#F1W^a!w3BqnSf;Zx%L(#!;gDGHZAC_-wJPiOR~cDWfP8E&-U}5Xf}i zFs6_i{ht{Y$OYkDfW$Mm6rWyZ%o!+en~R+q|3+@2fH6Mxj4kb6Qx5v%uIm=gxQ6-) zeg|s13)E)f4lB*Y{GZ6%2Ejm3BuKox&sqCLWecaUaX2potU` z>gnP2LgZtZ7JUIchm>MQL7dr-YzjDz7?ubOO9VJj5V>GjB6zUg3*E7IBHi86p)idJZf0&E~H$cq{d>S1Kb7XQ?eEs`wLA`tv8 z(L%iITUFV*XAkc?nEW^S+lYFu>^$n>!^xw7)}sK~Nr0BX{Y)uB;)TuAZ0U9_Y%|)ssOXWPH`L^5^O>Y@i7JD0Yu12 zd-mW~G>)mugwzX>XOs>hUnoh>PcLcqHy1uws(YY-6!^S3`phZCd7@V$wj8}uPJHDR zGsE1tIoQ{`7 zV(_IBVv}LY6Io;{Fy*BBEiiyt8Ni_6f(oo28-oS?9vk}}Jby(q$8Cl5@;0U!#g86tUui9`-eKEcbdmIb(~0LCQm)!%oI?4e>D05RVQt zCY^&8MshEnQ&)gCP*BK-(IOu@r<`IFY~gV)-WUejD1T-@Yysg?8<)=XRmQ%l7ZhEv z;;7eTl@UK+<0y#*C;uK-cWE_z?C8>E?lHSE`?@=?=@dk5IO8hH=I>gv{@SATdsaVm z7r(vjtm05vXG3N~ZZgJipLS+(C`4JmnAqOlGuS)W`ySGDQnDAAltD^vdmkV;&-!aoqSSYf4@!kha}m26hNsYWaL1t^>qP$R#p^wzjRbj1ZD z{0Cb04F+2F4F+Fn$~N{yV+2Y?)0p1_tcIySnxsO81EUw5L9_b+RSnPC;IPs_v6#Cs z%bMlOif66O5*^IX4G$L}PLHs9vgHiAlCoBg%oJ3a*+xiURu$|UBD0 zJ;ylaO_JbEGMLg*-Xu7Y02U_aQ{E(oyAK_EX-t*;QWNf}T&6K${-aR+=6`f6f!X|b zZY7NyVXZZMrUQ)|{a5~_|8y|XRrm=H6IB-(^8V1nG_!Tey+d=(Z{M@0meelFN z7j)m)0SD97ck}f-KbSeKyRcX-lm5Li-mCsm{p`7Crq(8R;dK{42!nvdka*7E;bPs(AXpW*%g?n!adMb|@{ z#SvC5^`%fUNcm4J^eTG1^wVCHu|Q5r1iJ>r=uMqAj^gCbhLLB7gZd6oZlSGdFP3zUWF%xad2Th6krEx zFr1v(1|1Cg7q*}fn~YY3?0~D|6+WpX9_+2HIES5lnvRJ;=%bjfj;Zr>3_I8ZpPZ(s zVUSW{QeM(Ad5JeZS6Jl3fMN#VHWQZAm&b%92LINadOOp<;|RxVX%s6V0BJruQ*SjN z$v94;<)}=!zP*29S($L5(J-Uo=wHReP4hY=RA(W5_t?k6n}{ex$Sh@! z%p0;@d{%a$p)|kJP@g}=Fg<^vl*pJB=nK!TTq~`~81xT?msUErN~87>|CZvB&^ctM z`ApA_;-8Z%vrU}ET_WZRr{sZ+P@F)+=SIy>pfF`0?twsTm32mJ@jc~+DK4ZaH{k+1$HN~gK zF5Xre1-QRt>MuyNaEPOdWH0rD$Ocz43Mmy>-~C z2{2^Wz^nhzM6eDU*WuNjImaP42w$^8!e}Ftvfd(ac!dE>&2b&0J}%hk)Zg`;uaHm1 zem3#;dqzk1kTcZndUwW*&Iv=<+1cWF=y|^98ZudZ{2Eo5yChUxkZqt?{~PEKb3pSb zF;ko-IZL-yC-9QXAlc!QCi)+DN`J%j0Lo{Xz+*0x&lN9I8uZLla=f+%<((lNRr)pU zL5VPasyRoP8qDq1oFhN&8-agX3!7t*QoB=*>M=Ou4b4Et;2)Zx(=)1}&lxAd;Gc|> z=yx3N8(~`6aoRN+3T5w2GQ9bWck|we>1)D^d>5r%5t`kdEw_je;oT zP=+I%h8!81wtFa{dwx z`%dG&dYID#xRi&`81{F0vryA0|Jgz5!7O-%GE&Ny2nAxHl&=q&qNGkjvX3-}%oY2k zIi?f%#o~~Dm0`%Z+O&oIj9)K~=(ia*7`K{o)9Cbd9;C)_1{=K1W63c_80}+uF#rH< zaub#X&cn1Tm~}v?T^1X%W7b*(4)^jt<9!%td2|>c!=GYXs`Jh1sf2pC!VvsSrAlDH zY92ApM4Mdhs;s21!)1 z)T$88v(Xv?(T1oDK;KWZf$IZtd74uaA>t_qp-TVmZFE2AI!NkB{a@5}a)&yLFXt<0 zSJ>oR6gmyiuPG(ykSR7rtr=uD@hI3anEH`dNg z6?slT!vsE!UjfGm>I7*jw>Bk83DX!YNZk2|Qy_^fU2GATiW>o!)AY!Q0da#2=yX8T z-{p#d4v;6tlBVb~6O{aoJo}Q`gl@NFo|rhSBd>@>N1qa~sHpBm%;Y27y8+!IC%N>K zP_s5oXwfeaX6py_qr$M>h^&}KSwdD!<8fIryG%Y)+%#ZXYZ^64{244eX8(_6$IzBw zsk9j3qoZ5-bCahF%aiN*YtI#8SD$s1+1Pieo6$1EiM;JTwEOT*(oNI#1(ydm2IWcK zXc?y{PP^Nu#b@WJ8X>AmmWe0wBv`_1p&d+GX}+pawO>?^nJ zT(53^de0@dKK_fxZ@pyC)90Lg-d*QDR_(5S?A*J~Ls}6bTagn}%sgP(h=xd=02Lu7 z&ew?rMI9oR21tfmKs{RVop;g<9SZkHG3VuM&MTFYfFs6FbSS*y*qSD%JGfc#g3bcI zpumvbokNV>AUM>k7`RNPSg|fh7M~;;xK2Ou`@swDr?SXjWP2mTpn#Nz|A2#b4>Xhn z7b#>c@?)uzLc8104iog147`^SiHOU82mlQ%1E+sL@WE0DM*ks z7}5<{S?J2^a%Xw!^ielDWVz=F^NhXb+1c~GgVKr4MedE_R_8`{rZs1_oHkqbW%x=d zXso524SjYg>{#pKgJ^CE09uI7LKhMpifODc*hs1y2@P@Q;#h_JKfa`V!f8Vbch6q7 zpmO1m;a6z*6FO%wadB_gvWDf01mW5xdpl;#?OgUV<*uiO9-A?3{)`oi=RbEVckGy! z>#6JFtB|J2kxXtEI*M%MJn;DV?KGig*nSGyc5-%$tSca)SRw|0C(94j6WA5G$QD2x zHRM^y+ zGrD2S?p4-8`AQR_0hU7$U;#`mj5{14fq-9jh!Tg~9$H75Ztt{qSqH6xH49Bh2MlZB zs7$Upe!lQD`88`OT*Ibbq(ld{d|7ed$xJyc-I3q|>e zDH>|xn@laCgl}$OZo#~wh4DrFU1H;8)^7l{8I;n#3m?*yB5LKba^xR$Ad_{+b5h~qk9HtVFxVG$(!7Hsk1VTl40zuVPu)V$*8FkosTIsU5c~Z zie2DJDoVOahD#v!O7gAjvWXb3%kt9MCu-PrcX5lgPw=*Uf4-7Gm@g78KiBNls1KiD znR4=ZxD!PE(Ixc!k2u^d&s9}>3&-x`hvzgM(9VffdxJl9&KvJ*=hQ@ha2@IG@$cG& zb8?jo!CE_9%kx~Vt=3g9Q77_@7s0189(RkS2@o7 zpulsJQeV#~V5Qp6a*}Ge14^fLQs*QT_?GGl3rfoi!gZup7b~bMkA^!)XFw_FELXz) zWLCi%vaDb$*;wE*>9h5GQBf!!6f*@+P0hr($AD&+4F=dL&QfTSe`2mY4E8feF$T1~ z0Q{OXAlFLGLm7S23MVmkG)Z%-GOLk0f6@e&zceA+&&+>6a}oKOeeY)(O@8JT^`BXr zG6GXsOZ8M!V9x#@r6Dbi=_e_O8Q4Fa-4vMN6{H7u7mR>#=2os)EbumO*8h<2Wc3-+ zYjY^MTxaymoSQMh$%{Xc0fkj%c{vR4+BCdNYO9(TaJa`-^@ry)rOrXi+@Cz>jel#` z$@e?B?_G!Co%UV3aE?Hu0w!#D!Z@O83moMp3c!LLe-SU>G#;* z@!mzpoz6JEp~ojW!s}uAr4cS|_xJo` z%zcpZl6k~Y^y?V&kztVXk&PR-n)4QKXzpALj*R^9c@Rbc zIF+7wMj={6&oDH{Q8Sp_?$n(z%%=WLcr%&9Pw$avlz(h082r%Pr%eTKXj8#Jn~GuQ zc=+|WsiXufvaGd^J(qkHe?$pVRbTobyKNoE-NLuEX$B`>tI$hvB8S%L}~p zrcPye$)Y(jy?5>0F)mne-1V5ZhTZ#I?cP7v=9lHRImYJq!*iN=?Hsq;fDINj>GZ>M z-uPBKCp+^8=dgR%zH1j~GefcR6**lwgV3qCoYcwC@o02=hd3Wvx{0e-3Ux*khl&pA zHd#hL1ZHXS+!9`-W%n>ji=`#QsDBA3KEW0otdxc3bYTqbl{ICLv5xHGeDwtB3`sqK zT#SF@VxZ&E&B9LUREg|T*HfhBuH;`3_MqyIM!<>{_bTgB*H-IBm*|=;2-evKJ`HNJ zqg1B7&!DQ&BQ^AywxOkmp`>{ZW}+Z;bmZ@;Z#2ekE@nnPp!?hU{C&COfv$ z2wJ?kZgV`nGo4RQH)pn@BezwO{5cglN{*1@Zq1Pd)?qxI3-}Fw>OC{KsrL+Y@fmB? z&q#=+6^5x*<4v==Mf8_|$iYq~kUB4o$)TePe25S~%vCJ=sdGeTF1S>uUv&3no1HL8 z62|@n%v?y&&XjDYlLX!CL~||Dt`UVCx>3@dP2h*6ZrLK*U@sye_5gKN9BjRB#iozc zBgFL1rWKD&HdWubVe=gklUlUn`pc)~h6VL%y7!I$@K+?1L6)e$6v}+hm-QHqK5XnQ zIa8S8eC4tGUjfFT--&px^f@eoN0bGAZ`4)k6@*+@Zb9y3%PhnIiw&po1UT7LK4$ro2%t{59H?>p~Ys>*L)EVTU5|JcLlkg8`0 z$+Q2VwBn`<)pyQmIQh|96K?+3>L}`~zTld;Mcl2*s3aMSoRYVw(O)rThON`zRH;l^ zU|X2cUAe??qHR@ZNu|9<8t@Mk3>3{TpI_TGWwmdWe`&)~Wzm%FhV8bI(8xsFwyu!@ z-mM$xDw!mQ&5=lTJdE-OS6u7r?am$$`*e{>*YqmUJ>gG%QX6wmw?V(vq0&7In;uNN{z!~lCK6UY}wYrMk{oSWWD<|c6pUAFX zFsHUPGqb=op|exHJurDvWNN0{mu7M~4drf6-^9wP?o7YQ=uS6ImYeay<Wc3L#zY;fh)yM%HMajXWxP^fojS40tAl5^mDv}dCxu0kk)f9{*HG>vZ*=3wM5 ztSMl6LjjAa6nF~9v;_=k@+9Ajfu<&4kV9kiwnS z$AwVf)u%3Ac>U1jI>96ibR&wgtR1gbFq&$0eO%%y1VU`AB$|3p!1DmRu_zUzX*2{s zU;W41WgGI1rAun2ofruEUfp-~l^MC&a~oN{5R zO>W1eiP6#NH{W{cNv8&<_`E@HQT`bNM}8;PY=5wEQr(@G4d3H86ubwf$X$DEf^HGI zGcc)!&c$~qTeq9H+lSMKGq-w1iZ)c~%pNhA>v05~#buVDEzen&5pd@R<5^X~_N>;t z9`|a?kZs7hI%8Fq%ac`#z2Hkq3kr(e6SGS>ug%-(72KScT!=cSv^%`0dvx3(7kh4- zI59U%!D|(_<+{4Oxdw>PE(6aHiPAgWCX4p7I#^36JD@;JtcxVzNQ8+3$8d5lbw0tF zid*}Esu`7s2y2elNOX%-Nxc#ei5wxz@HjG}wyV$K z(M}#DRd_tO_dWIg>u(}83%AzA>((vt=LCFHW0#CJ&hz@R_zRBzD7_Ruu}5uYS7;`C zPJ<}ATDaKe%UjgG=+wewevQL!RG&}J%z}4U_#Vt7+@;D1V-VkxwLU11K^Z%t=0{2+ z6Pn$V^P5YXC(L%w&YxX6d%_sJ7rR$^hw?KEMzPOZS*bfW?T%axytarx!edLZo@`%1 zm^v&=dIGMl?7)8j8Tgq9)5AEBseg~|O7}m2R-()nJ-AbKEMp9nI{PC31z6Sfeb>(X zNd1Kax)3tX_ib8hXhWf96 zfNNP$&^w?6w~3pjt#EYmTha(h)Zm?$^?H}XVN36F3FcyxwHnnJPa)CTTFn=uB)iyP zz0+3gyfZz#Ke?Z&ZZz#AiP}e6@JzcLCBzeGm!pXlz&7BNfCn%ul8wqlIzS?;{EzL< zgPmVwZTtN3$3HsCe?0mz-!9nsm1+Zd4!hXwRZk-)Z%p3LcWmSc@0BuyC&y|LTS*_c zjN62kUcyh*BGRpN1f&gJa<6=zdJe5dB=aP<@Y|FH#daBNCWGM9oRjunM*A$(Zc?{9 zR+5TMIN!0JDRV~n?bA=IOP+ojNw!ZuNoB@Av8T{wViGw>JC)gJv72Vn>qNm~N4=2w z6#hc~I{t1R{2rUO2xfse#92DKML)}|L#srS;vy9;#YHu36LH{moMI6EAI`1>FskZm zzjgL4Gnpkb$z&#bCi_l8NFMu6AYq3POWm!l zqEHu9shJCm0?@7?9xvwY_}PLE3-rfjP*Qi_zIf+ieVTZ9a`zvlIZJjf z5%1G;+N3gZss51Ia^5@G<6pyb_Ldi8_)GO4Mg^KQ$&fV38hFKXd0u8 zQOBFcd+lByI06t0U8im`Nj8s*IZa%tK!SeH;(CM_WoG~yz~a#%V5HxW3x>t{ME@ES zaHbR;GT_rasE32e)96#m(LhW(opf#uV=mCCx*%1q_Bm^8k_ZT1YKK?(gw)q zba>riH9bX6b7p!o!~XOs(qv^OD$31BndO@poRYpFkqR!8kSUUB%e1G20syk)m#ve# ztX;M)dzWK_w=>k4)*0@M_)JowELy5m#;YCHP((5LrAjbcu=nzd{6P5PO*aO!2OZc$ zP{Ij)@T(*iXbo8LMJhSbTrcPMC-h+x>0ZnT@|ka#WtOnB8Q%!wgtgd>Cbsw3y|ziy zHLJw($`e$3WU9xZCN_}Ph)icg{bci;5V1qonv7vi$<25tRd7^3P5a}~c zN!3tyRLol-7C+Bfsp{%p)W2Jxzb!VDmW-b;?l0FOQBr*Jilbvs4lOC2IIi_WI!}Hf z++v;!Bw-L4$~D4j4f)QN3V&W&Sz&fw@xba~>0_%WNmI>pZF5~SeUkz+LQ~4;ODk;i z152`(=PW2*P!ftiSoNT6@}g2(;=#y+e)svIwdGQNLMRV8gq?NKgkxtdIKMpuM)1gVsWd<;`bu&}c&2#_p`sVkCxBTg< zXFfXq(w6s!wY;_UnU78`Zho@k@|(NPJ!eyWR<7*0aQ*a)#zd=pjlagb(hXnf|Jb?x zhU-N4!7oL}jn`cNbN!p^)~&ne#?8Ct&8Z(LZn=BpdF5vpuQ_)YcG}y*BkE)7e&37w3tE63T^1BriVF za_m$l0N<>WEnuS68~~8M1|J=<5dDgRwICJ(WnyuYz5T| z06qW5o5YWw(67gT;oBi2!RRlj+l+f#NcScHDk9XI6i7RiFu-l8#=WVk*mG|(zqfwG z{%5+oGcx<*?(jdmJL2}=aPm^+r*wC+SI>AtTq-VoLeDt48h0lO%b}Xy0}1W{>sqYb z)$AGKYVk}46ZJyZQqLOKCXY>sp-8KTz9Ia2!RuFuq2-W^6m~ zK{Co<3mCA_hPa}l!N>}*JOeUWLr9bNqpIpCW~{!l(sPt&5t5D1{EJi-5Ux~FG*SpL zV>JvEaF4EuYxQmW^lkVt=uL5)I1#)VznycrK2_Xv`Dl4^_X_D+8lm3+-LL>IRX?yF zDadb0wW}WBQU#06Axb_vy6ADJ0oW88ln(?b6N62$3Tt@H>pIb5Wak_jf7Rf&0L*23 zFf-T@l$`xi%)>aXIJy!I!`*6Q<`Q0WFDn|{phDvt)~WH1X$l(Oas$f7M$3j8mc0pL z@F_PYv&+$@JQ!q(5vMI&Me*!>iqXL}1jUP|lfz-8EO^*9@S<5$yN2xB7rSXz`{vqx z>j#e+p>=<&{`2Io@>_>C${J|{KRK+cS=}!m730-|!vn*I zUTUs;wzy=)rm3&#&zIFczUP{q&;BMpk=DttPYqRPU?(}?*;$H(Zy9dCLOvw_$qvOu zv=_;h*d*=pB3p+Y)GF}zSsnodMz-7RM7?r`cjS4I zt+7d+LKljjqzW@3(0X!w-X~rx=y41eErw~WuN1q$yem4@RO?LaWu8@u#;45eM}t;2 z+vcBWSnSvwfZ%k(LC81y(PK#6qJVtSQKD4rZfs;_y~#A-xxsPuJ7_a1mbU9M&y zPgjr9*8{lgRgl1gv4icxxriRoT{qcOB`oa44O6)-mSDvRdGOA=8sqT*hyb@hw;Q(Z z#m(`Zi^g%Tp(1IT-|Uwlasg}<;hyB(QHmM6%`@NS;FtF4jr(3w{vba?smd%}8FzU( zGL^4}mnJT>Y9UBvEh@l|2lxYXi9$eI!yY6F9%DC*#yk8z(wJ<-Yo3>w#y*-brOEU_ zG|4U@HOdUHN2-}^aPAwa13wtNK%_<}SKDH1Vi#4{EMBs&dPRjTzC7!qn(D=ipKe%G zt4_1{2Mzl9iCbPgFngiQe`O_J(7wMx^2vMQ*+7o9Fby?1Vz)LdVxf6paLFU`rxGaYN}z zH{eN+8a|u~Ee7RPZ8f*r6$(*E?l!CBZ<9@qgof$#CIqUMO|~I~7DXty^2XIRsv&?| zH*WRlcfWn{*s&LX``zQ0p0{z!mW}73Hp%Azhgkpe7tyAl{QUm=AK0_!m-o>QTn2Ar z9Cwf}e4~xFTCL8oHH?zd#m;KETrE$j_KlE7_?CtjWGsj;&GDq=BA6SnS7%Cjp&Bt@ z$py%U4kn4wAVaF)@RicMEZfD6_j%e2-bCXE+JtCX{8DOqeii{j83A4vOZ3kIa2x=5 zI{p|Eo}E*4eO6YX%O6Be9Du>-v2WJg_uOHh&Y1AhStKK!+gH!i-ljcM^gMG)p}}hW z5fZ1Hm?tTU1h;(Ol0f7?MkIr@oElgS+$V+Oz#lioyYCu$NlDp&A3pl%hlaAUu3_DG ziI46+B(7!-r`3mci;s$%^JmsI?CgA@yZeQ6ZXHlREnh$XflbrJ%2!aj7K}^!-(JyQ zo4yG;|Kd|0o13BY*TZYyDz<5B>}mFl^t3!B=B!mJodX6{4<4cnagG@@WN@pqwQkDT z`ObND3&;8b8DkTZO3x}i-}w{YrsxGZYf9G)*fiEYQf!QO4i$%bhgQkuA#G5tQe0fn zT#hjTV})(v;E-)-gBTt;%p0##gppJy$l+)p{fGrb8p6Uz#%wu~qDf@#qQUVB^bWsh zq>ZLzWC`)#{E$pk>ZvPukmLr;WTuzliX`s$s>#}9aXkLw3HtT;hyYU8<60&ymk5J5 zL|C9Dl1jghFw-xxxy{flDydQ~=M}&?&1Mq$15l*lqQzl^dVFjb@Tw#@ujtKoNGaMC za76S%-Thqu__usSjQ56kGw?sj02v^xKJ-N9=98~B)>Utty7H|djtOtA*mZ22e|BZ_ zb!)Ew)AEIL#hg1z3ky0MTOOI|tb1+YZGWmC{?Y}9PCTyW#kL#m3{we{5f}1duFZ=f!mn zo|}uA?J@3;Xw6I=<*9#Hm$*wZOPWhomMBq{)dwvVdpR0$FmJwtc>&`5c>z z`7}evHfEXG_{rlumbExpv{qd z(d=l0+K@U{)ts73a}N#7R$JXG)rGEw;f?A>tH;}gii{q!7cg!)7E7--+oU2{_GETa zp+;K_c#1T?Vq=mXTB%Xg3}-IRFo?2bO*29`7@l;|q zzRB#V%tF2vG@Aw7DJoW3MWtOXQrq29Od@JKxLpYtkE4~lDN!fAO8n<5uh@=+_t0mQ zDRnqs{wUO|d!^$*j}(#?B29MV2{p4=Zr03_$WAt5ki&yAA0tyPa-o625Z-&=iC2~P z>rvet{cJh4#Pp)+BzPCcXvKbWm3f$XwOKKPdXU&cC9@Sokuxkyz%z)8ML<#HN!Y%y z>I4>tEITG5LW?`S)bk#yWWn)f*)LGJbLatat7v-hwqVQ!5RMWJ1T-7~TlnHM=+Pb6bC5Y{ zc<|FLLa~;US_^1Ym@lTzhqXZZ3%5^H!IrVQaKlfs6UgGZ^X!b-+Tb0t3ny0F;&Y0- zF3LXp&_5F4*-cG5r!}-xtA)1kxwk)ixgOZEx4I@_wm#}gz3?9KZ?m~R6^8S%z#HKnCBy|#2GDD$&3w$PMRJ_2?_P9r zFEp92{4@PVy&?7STgP8HVDRGNv6Itp3O;h%sBHrWEh`x}!*^@i19y(Px<3EH(g{;j zZ}B~G>-ftXvNzR^og7gnK6_wnNp)SvrpKQjQ(8W7#Rc6bpL}j?N#?k7Htm05Olf+{ z{EZliN@)GJvVB1nWh+KWBV}o(x)dCnQ2hnj6h^*5y;LhNlNQM5gRjsihXB2k(#_q2rkA9Q5P;c!%EamB2#WkqmJVm@?A5x>g zIwbyPhWPaJ`e7Y8820Uh@i3MS;ve(C% zB2K?x79tv7aSJgBn2d@3;si3xV5$a#F4*qEn*2<^nK4{aDk$amQb*>+dF-q|=J|x2 z3QUuuZve~Sr000>>BZcF-!*PhqA&%Wl72X?gl^E0Ki zTa`}G*GX;T_Q&R~y=c{nS%27GJ9w5j;`O)1#*V6CytbI4Y>3qk`Qg6%z8qGM_@PX^ z2qLh(jWqB|rQBIrIIy&`ys~;=t%kZVTH*Lotz4@fU)$zvOPw8<9d1i+ z%R0+>R{B|4ozB%+5wWqz8!eLE1%u*BS#!ityla~Mwy3vA3>Q=6gL&_YnfDH_Px6Y1 zU7!zkIC9A{LaHb#M2Cgq5Y#w|IgvU>@1fB{G*3ORUdxwgnZ4`D<1Sb zdDpc&Z@*{z_PeFX;vE$gWi10_TIk^bFRiJNY^Yx@Onzjfr5 zH{X5>qGG4is9Yeui}?$|w>=s7E!C}NB1Z@`q{IYEQ4J^$$^|FW<)cy~^GV}x%xAN| z0pl$Dlm3je=Cl7M$3dA>k16mfi&` z5PO%{n8CAz%P4%SN+^N+5IkxRCE8xKZLC2qM~|K>Y- z7|hb`_*u_-Dg)RSPZ2)tmeCEcp$|db#KiUOif&S>*T1>kxHsCVe-zB>uhbMnb`RDH z1q89DTJBdSqe7R6n$Y*7{1kGm#d2bUQtlJ%CF*^m26rch9zh^v_CeM94i)aY@r|@q za2sKf&`FHL_n&$}J)%x#pF2$(I7%65nyySU zEk>eQm(pnhHB+Zqg8L6oBA3e@^40LaJ}gM(QU?O?iu7=d_{!0bB&OkD3o%7hC<~|Q z?O(P-7&2ScYF3YQFCt!T@o9aiK2&^K+Sc759gq%mH;C`)*?KnRiLi`FhO(WF(;*;i zdyk`RJ+2N{rwgC&LMWRK9EK5Q9OW$ggHjTaFLLS_&XP3EhXA{VI#l#GsPgQx;`m|7 zSI}~A#6XW_+D(R*GC&?BFBTSxOQ;w$bQngm+)R_rRAzbX$?xu#9h@bfj_*@{QCAFpWfhP(yd>0U+fdS!noAG~L2z4;pVrwbi7GdG8d1wMrM~R>xr}iDQ!p1647SSL z_A2_(UPXa`xd)sVKYhR7PmKuYroz4%w*5R1DkF+C6tSQF4h}izn~;|vHpC8Xu1BD zhljbFs`A8AQCaUVL&et6daUt+!jd-z4|@Hf^`Yu;u++c)@i&?WVdQ@$+%FwbmP0Qr z)~u_cPbJksq?JGolm*ld#}eq(_ej<2QS_uENxklV@zELLBfr-_)jvhA&!X4QlD%Gl z;#|}#sc@`UuC|?_S1Z@cq|cIi8MLu+zXwlx+VA!8B;Al%q_n{!Eh85yU5nd24W5qh z+OPu7JlXG0YfgdE+LYl$CZ@%n3TO;D1L+V%<9qHrRKr4tl4^s@{gU~i(D;LvK_{ld zXuA{^1XP&6N<`g8; zSgki(0ck}xGj)xs&z?Hl&ocXj$v9O5N-Oen0N=rtc@zON1Q;nj5WXvhI^j;u;|s&mV>=PN(-lj)uw>pa5sS=M|4>{Hk@;OywN}@6&gJxj@t;is~F^NG~n)^_2V{V+!&_~IMkrt;XVeT0+|NZVS{t@Usz%5 zl#%<2uBf?Vvp8CR8l(N!_lI9yyiZ+WaV)>GnDfF`JoAPNJ_n5PuZ2x4x4|b&)9URm zw0qynS?8R-t+H+opY12OTDnMNrO z{nH*&RG#|a&rQkglm5_?0znP&gsN{6FQGJuJLnsDKJY`I1B+1T7Eg&^$YJcm0ALGK zQOdETOl-!v&Vvia0r|yOU*Wn4&W7*xFT|_Rl7&)!ny2+Y&E2vnW+GLCs|66FNxgs$ zbMY!V%*6;(G9>B?l*rVVS(x;r8cw|b2QbY_cB8tWWbUV3;e79>UiGLrnLR2F|77;* zW<-=fwqL6rg9YdYt4lsktY%@Xa6r4-YBAZYAye4WXl@E2%Q_SahSM4YO@)>`TVW_K zT+o=?G{QN`J=Hngz1S5*+D7h%qV*LUhOQrN%AHgux4;P{XHK$8ZrNoSS~O`;EKN(3 z($Yp(OsezQS{#~7a=1n$ga)xeOEd`8Vs&Xk2#A5|KtaOcGP%L-CwbBnZp@C5mGDrc z2M>m54;BEeQ);r{4-3QLXrjkPB!l_i;5(zExo^fwu80~8eKJ_!4($mK^=;?&xu&ls zFRy+2;m3dVn};9!mGlTZ?4`~0g5Es->lq6cO`pDK!3^cvo>o)xw-5KcRej{};SY`+ zes@3B(mC-8TJPZ<@yYuyyX=?0y!28%Xfz%$e)ECxx+i~}WzTY(`Jhl>Si|lXC+>F{)VaLRj}_!FkhL0>%m^M{^lI>YBPp9A}R?sM2GoX4(0Dr7EC zCZ@SK{i=h)RmN2XNzcR?t{N)rIYVD8FPVMf06s3lImUg(GI=sGed6g?9YkRqo;#go zq%5E5s^lk%LT0irCY8abidelYtOcK{dL}+qoJYV0u<-nU!KccOD4di$H&N^*Qtij1 zinE2$sNxPpu~toyKV*5J4O;#Tb*gEJy2!LqU1LJ+Q+XojeL7VngmyrZP82$XPTVth zjT82kNdmUZv+aGM?XfErf^CS&!-dUn3|y!o7&*3t=F>aB~%)hhP#wB zXPULu?a73I3AB2g)O}ik;3yEB6l5TzF}YtU&_IXbk9%E}V*4d4YiAdh4bHEwRxY+| zJG-(yQ8qeWRWF;`cHEesTU0c2+zmJ8=M)ys9)YI~sdci>EQ(YR!?$^$#Tu3bJ`7I+ z15DPt!_p^e9gGhV#bsTJgwb&lbIL-?LdQDGI>d`O^NVaU+4fj9`DaWy3UgCVtDk4eKs!4I50_bos(lm7AMn^3jzFk*>nmH%pf z2wa3qmU|#!dFp_d6oY_Lf%`*90aJrOdaD6 zSI=2Bhlb_H1oB^B*?#qFMEP*dy6Mx`t)Di1ooUWh2Yz?;RnI?v)zov>Pn))WJ&oc# znlrYy&rYB%sD8hZ=$<|-}>VVj;--*I#!5w%0Tn=}iCr0knKhqgUBE|V? z;r+1-JGHXW0I@Am5e=a#Z;D+7DLRsUWzdy5w+l9dsG6AsVi*+wlR!l@46DGPfKM6& z_=Qn*LrEp5m4aM3gAbEy{FNyEint^!c?MhqRQxeD27MCgBS#*_&!VCkB;1(dp!J%6O!dy zg9{DbnGYV|dD3;&2)`S-)HubF=TCefgN&Xkjh>t~$&|c`G=h&=PiRq3*YTd5HkDt4 zo!85cWJXLi;6@otR6Y~2I7QViD48Nvzhv4W8wD0WA-of&4`0NY^uPns_j2@y1#%P< zML8GhKCDLYBmhT{KOitFut-{*qC}#WMu14d)ebqc+H6@bh#47XpI?v|sT$3b;i>+b z0amg5KVd5njgv$Z3HxwuzB^yb@5q;}5vn2$OaKGvM3Hr1X6qUBhC~~TFhO$JqQMt3 z8it=7`QR``@tUt^G$>&ZT!=}+J~X=7dNwcT!3M*|=Ify>$=OFPAoBOH@+qLQqE*1_ zQp3~nhw`QzdDSi5~{`jos0n*W{q&dxXbM@yBKKS+U%6xs?Row>?^&>ySNb}tNC^(%e zgiEwpY0g4trC1%SFRCpWE{<~!i;XE7Rx-0_a>+_{ZFFtiezkL#{(eQZERDT;>b3XYd)1Khr3>_Z`fkznkB>x4O-<*)F?Y<{ zHgr;%Cv9l>!g(vM)o<#)eBiy;$LgXbMGx+H^nqg1?3n+O?G^67+QkJ-wK zfK#eC7C5ayV~zhy?Qadl@6r@H%{3@!im(zCP|ewrBVtY!{y#;(ISLeE(VptxN3n@O zZVMb0Thi9$JteAWRaXMf$Y|=&W`)3MLKy`H(+!a?3A__QSV8&;5N06Ivz+--R<0k> zIN{GX95`^`)y>ZiZJYC2^?>pVXFh+=xjV{=3uWKzd+W!J(t&Bw|6WpDv*&_Q%d(?s z-LDpw6fVMOGTv**b#N^UU;G>1YpSAV@Ln?*`+rJzZIr(~bE&ldvpgDi8WDXpqywvj z%dxn4ho67c;5c@J*}89?G-C6lq2)&j6|je(AW6Z+1RK{Rj-AE7POFjjA2C>)_jbQ| zI)yd#fp?`wU}Pw!71dIN$!@3?nktrq^Ajo~Id56~!qA!3y(fy5H+f`B%odiYOOyw3 z(&lNwx21P1(mj&+w)&1;+HDurOQh@IbWS5xi&n=fp?y`Z*(&B+#X74P6xAgw^>O;R zmEx27sFgr4KDtsL^-jN6;*+=nw;*N%*RWlE3tp2_Eu>B~!IR~Z_lPdUyWDPvD#qro^UU$A@GJ~1O1r?bE(Bk$z11g4>8&D8u5`(g2zUY> zL@1zDV!DhEhepjdL>#bvd^E7V6ht;a{G52e9G8FJZCP+n)x~3$&75(6xpU-$(;ofx zyft+<4FSTb_U5K@3eP@!^6+tkG9L|R-*UnH8)gpv5IA&Ao=7B#0i{=@n4@4Y>e{0Ap`2K zn=$9^F|NYr+81nI-+9%Aoy+Dg9{*giYs@caKKR>nX3V`Sp8=(esgSY!FTGGV z)X$aZX9GNWdD5U=0z7%Ymaf5_n58CpANr})@?@zN{nUDD%WJ!8WwAo2sIC}WF}Gq_ z#rYLrj}@%VR6m^G8oslBF}pZ%l(jf9QiR*I5e~O?Qkkh4Yy~E}R84x7>amN}9yun9 z7NmYrs8awMNd=<{v>RKh+hu3*dpk=*0$(lOh2Ht4#%fg9ZKSZ;0eGeFBPygx){S~qL3dKt^xaQQy>K*KCg)IoH^^owoxDM~Lx@PP&9fNTU2#1gY zM;Mj5ig0#PJ7r#_KAxz<%oD{p?UMc~49FJn3rgx2!bq{@DPaUc3Ir7$MzIBI3`awI zj9O(b`d-Sum$2`}4tl4EX@+*YEmNo!8Y1>crmwclp2#dL%c;#7(QL2Jtj@1bRM%Dy z9+f#Pe^g>7? zk)s^0!7mfhQ=46@#Dbqb`Rcs+V;?;0z%ydw zx3`Fjg1{RGktbRYhBxj*3rw-mzA7Vch-orMsG^rRIs*gL-X1pSBRJ8Y_7Pp zIU^_wxn-KECS1=5^e?Oz>+1(K)hJOC!G6->qS34-#?aT+!_dd0SwPLPLKo5$lb6+t z#$JTVg_i?z38~Ja$B1}hPPNE5G_YhD6<-;4JKDJDJC2XfjR<7}!X_mHtKdwm`f;{G zu;H;fwvBU-%N*A{Ztl3QacTyG?PP2ji?E=iDw_7bYX-&iAQ6ga*}!~Z zE8@qNLrksU`%EtVMIFK9QXZWs z!qy(oa7nSFhn0<0lVwtB1d~!*U*kG|PPWyZlu~O>_3!BeVYgvDlos{!yPe+C2jBCa zaCYlpcHe0IM5z)rDzz~^cMRRa0u{;aoh+?oX+vY;U@5Aye zdXqU}U$7#Yl=n)OGE;!bm4a9knagz0P(nqY3a!YNiPu#5tHgeV8&5pBZ~QOMIdH6X z*s#YtW^5U!|6E+Q?@9g278DJB_|h9D-lcqZ!m(~hD_{;O+x|R$TuV;=Yg=x-@x)GP zLssbEE6=?;5^=|qrc2Z?FyCjc6rLYPrSMNxHEOy9u*m;1s)-eMI(qYvP{Gy-Xo>s8 zm`>+BJ#>(tiw)Iw&Wnn564vLMil8$@z+8M#yP5E4rD~I^Wpr9h1JcL1hP!9Drn%LO zXhyp2Tl3GGfpu<0&qWYSGRpXxyS1 z@ZQQOIstE|XCt!S;i?4Ns5>UQ+!?5ZODg|Gd)W^YdvO<=bRXRXLA-gYn|hr zQ=AK(o1A9nf=tFu{2gQIYA3g|(A?h0a0lciz(GSQ`iE z{kfa+4ur+}T(uPELIX61Dy`j~q85d{fue*uENgD=WNl$!dG1--`QGz0x^g?4-3}$9 z)T=WBO9E;`LoG(d=4l*M&V#N6o}8RmbAd8^u*X&ofUi)6kwTR^Q`*4M0Px{ZPi{zR zP?>hT6)wy5m9aAIWemhxMp@S^L9L9zD$9^L4yjKLSSJ3-sw8y|@BCc@{Q_Fo;N;I7 z-8@G z>JytVq_5E-Ku{&p25I(aYqs}J5l>t)=Ih6*uc!2xL9uTocD0my$(4Uok3Azf!FqL1 zWp=}#KG64nmuT;{MJk!U9UM-*wc4>K;jd92W~V?tI|V-IiTlQ*7B1l-4Ir0I`H;&p z^w%8GO_+rJS|fBifFe;zlt7V#%!8uUv4J_`%`MU4v9UQbZA)#Psdi*W2SmTgnm!nO z-j=K(R=C)uKnSV;7tqvrf~MCLmLRN;YeAYhq-+wxh!w(BSZz7{j>B@P!RuToOu5JF zcbRh%jn9}T2aWGFmanX2<~8R@nM_P)Mid7V({M@{V%ovh1b&N;Pv%MG_7T&)*y$qJ z24o!2_D#xYn7_0Nuwq1Txgx9OG%QH3@F|OIyr9ojUWFu#2_HjYQqq+YWsstHYk=3;ud%8(g4^SU&%o-cvCF=ifE5hx z=@h|9LjY8Vefp;JZ-k+@nj%@v@UqsppqGwbp%LRXo+$AVB@Xg6;gYI zVy`I{_xIUX%ByTE*-hQQm)|=1jqIi`y=ULB;8RXjMv~5FuOSmj8ZO01QoZtGU{v1L zhC8F-C~Cqui=x#^1FDt}tQ9SZLa346^1MM(V)KqXWj@477gymfV3j}m2oc6YVDt=3EL(asq^=Y zY~KG>(tONKlO&m+GHjqt$`5c&pRvGsW`#Ai+)F3UZ4~kgReHT*LR9)zJm>PKAG+fM zA^@x6TK`asX2jVYmsK04`$VrRC4g=U^QBo};+e(CENK$7RaYd1B9Q=asC^YyULxYIT znFdPlum(kbSi>kQyWEyM%-B{s22q9k#8O}ai}~h?kbMoGg$!w>tUuX$K>F-Ch$LtR zAE*mR_TZUN3s;`Z-UQgFQDU%ztE;s3fcG|zNV zliqkV42Q8%5x7sOXgm%HVe-xp?_4vJzX-PDae&;ck|*O~PEz??E=Tbc#vDO9(j5I< z%Q8X&dM>G58911Crp_DUkjfT zJb*DLH~;moG$p8XW2aR{Gjf(OBiCp-fUp3%f+EG{l9edW12>t#Af5s{#Qq;(8Xn>6 z`wYeeh!8heVErcm5(dUF?w@WSnkxg_;NGcjvH1C?pPEundOEHbfmJIg%;WGYhB)IU(xyl8_ZQ*^{4%`;u3)C!AtjHNbdAzt7gg4NlM4x33Qnr{@`K*|FZf-~jH| z*9WIMjJ^UsTMrWM^a%P^A=MbKs>*O?^1e=wpl>ze-nBKRN_Gu7TES=XC9|^b*2)~_ zbaSz}(Tu3Fr_JINLp7+07C=E~UqW?fWD<1%Ogq}}k;vTzX&yrYJ4UIleLsgcJ)c!W>` z$Ja2DIdaUg+-Bv=?k{9(AC!$MS9X7a$BUm(Qb%R=cu}IYK{dV?QzbN^);!fBEJuvK z++lHs(=5?&k)fiKK(Wv(qsH zrYSAyUFlN#WffFkEBVg|&iANTjuKNfYyX;}k)tzL)Yr z>UN}iB&E;j!nt{dYKO8}_7;bF#yVK$dEyM!4^i7o;zVu1((%b!BEosgPu}PbJBC zS6oU@k48NxCmBDjoFqy}3II9$yYi82YH=M8Dx-0jozG}|!DqwFXT#hD9Q9?f{&gLens-RKjJeW{CWOF zVS_eHg7l7yT6|*s_PG3&CoWzc7oWyE6XO@gr7JvfE#4WI_r~|fzmCgSbP8iYmdZ5cRUl9(jTdDXiv$yH#I^E;CBotNMJ$!|Ef7$p0e5ptdh)hCUp^> zqQG&l zcBg^=!B|1v>w^&@Nx#^TyM3=>eX&^0ASUS#3-!sql31c-Uo5W-z2d|>453aZ9&i>0 z-biGc<>gFkxky7mu0{bY)r^EYDHRIpA6ZZb4X!?-VW^KFB!lS1Yc6om;Cdt)?=bZd z4X&u5!4(xWxGu1M?~455sOY!Hl5`NGp$ zmLe!7yTk4c3PDqvBh5QaoTj#!=h~+`r>D&IwFNzXGTZY>*jqjHJ-4OaGcc??{HRAGz?Z#c}=0aP;?h&7B&~6Jb|0JklZY8g7uBH_gec>Nrd)SC>AAWp!?pgJj3rbm$Ba#f?V<}td` zTl7;iXU^kfrMI6Nsh|AtV=z5g-hW>--`~AeTBGJI(BFTOQbk7sB z#DV(n^!N2Y>o1CRqUjNg<&slhn{w0-4JO%3we*}&aiu@kR8(p8TP*?El8EM3E)!?Xc#tjMN63J4hdzO%@*3b1n^hcdaeVs|g`PC;Mmo{Z(zWdVe zUmr>1M|$oW*cNH1nD%$AP)=84L4Tfqpsm5xklqv@XB+Jrlim_<3odh=@7fqUALLzm zBl4sSz&e?pMhz{)n_ia@vZd5z1T!3}+t=g~^O|K_N(z-l3BwX%mr{f0+=nAVsyo4g zdsxkUpQCX^8%$zBFbIwkZWdx$nNZyBY?gSR47QlqfFd;;!p_8;A#lc%f|ZQ0a2thF zS;3c!m*BH93}L8>FdMP<8JQd3;Cy9cl@p6%@AB?LMWw9KKmYO@{qw2X@JDBldvuYU z=ze|J`|a1SfA*YnhFmkGdCH!fckYt%^{@4pz#ePb`a5k@YfAH_qaL}{R(kW~%TC;N z>Cvf{@|wyAx?cRlpP*T;IQ5DACH(G#gdN(@Ja68>+JU3RVWAn~CW>+ZQFIigDOQZ$eyzZo3RS7OtNFra zsfw+=s)&^h4@x+~0cB+aX5G@nWg>G86j2BQyPtdn$>2C`e>jS`=3#7nDzV8%i2!a! zQY3dBVZ&EdQ619Wm&9!^f4S_nH7$3I7(Q*)hFQz!4%Y5yIqR;O&LPh&D4CGRt{PBY zvbbjDtxXFOg{W+pyKumw&qg}6@91D}K&8~7#e;^q zUGgq#O3IjlHDmm~)KN`*{i<&4e=IfO9xc$|uZfKD505CWW~b_JvMLd*L*@sy!;Rr` zSsiZhHYZmk8l3LcOC)Q3*5N?54jDO~aCK&8=1SDEVJi?z6Mni-)hzkkpa_~106Xwr5UgpcV_oXTsKnS+(g7t;Ny!Sr0>%9qj;FBdrTK#6 z=m#x@p1@!$W(+H)+b8^_%~4*>xX29Uq%7Lf?4q$Zuc!lcee0`txpmwYbeRY517ux7;RrFHf1T ze}B)@pP1y&BvF4$Kk?+BPd;q>4C8j{BoIE~Qx8B}Faz`DmL|djWSXct6@ZUbAn_pH zkXXq)y%pu4goSq;3QPF-M{1P5UOG>|?>uPzVm8*uyU^fj0i-3Lg(4n;CL7hj=oLfB z>6K0ymE;7~qjn)Ls;s@HhQ2UfH%bZl0Q9|pF#ahal{lmwbLHtOMSZ#IAGBBUuCdqRIQ3KE*29k<-qk>Da94WPJ7VPVnK>S7tz+mZDi%+vV$42stGcMh$TVOJux=A?F94+Q+1i7$7;qO zQB2c-v)~+ro|kl&kTCBDWvZs`2DJQ{VkjoD{1m6I zt+l-L(QlUiYLGQJvZQ9-@I@PjPDz|q_mgwn-uE8cwYU|1_o>rQ2-t}c=`Qnh9o^8zfldmEWj*go- zYFNPT^W^>foZMk~Cnv}c58qHWeth>^>Ki5HW!Elv_g!zOJm<26hcQ*LJ+$34zG!Y~t(RiQ9NHlcL zgBp+0(Fy?u2@@AdufV^WcIx>-_|66)pRHCPIB!rGPbE~qpp!B&yCb^`EC1jLtUnqJ&s4X5l|&5~8e4 z6eKmv%0taaC^E5+!5)R2M7}vyqcP4{`oK88B=(`wMZF)*K3<_bdy5(9T=Ip1T}yaL zbBxRwl{qzIM&{zEYA3-LfZ!8J48qZ9hPEzc6h@<&g>*)GQ3@d2fp0BNEwZs}U5$cM z_%m$`iOLZD1p#453*_sgg+iC#Nl|DpHx4en}oHLj^&(RKc+(HnDJ(m!~9{pJ6XK`;HrTlvW! zU;KMK{>#d$pWl4_jv?97;(p2WJt^~&;6C-4v_<_BM!ZP4Msv1hoR!g;E(b#P6k@9S zTB}3dBy44Sx*Cb70k7BH8nEV0ROOKt(d*4Dv}h@*brgPf9L{ZSXXt!L1|i`ds||M>~JIVz&N2pXl>u z6vfBfQCzgT>%+68qI)l_i4m4O1l2|6S^*GPf+uT$8}wVsF#FJagVe}z8$>=1=JKVd9w5BOrBtv_{P3| z1TUD#^y3Zh%K&4%j9Tw#TRq5eARpKxc)@&OKD^<7871LxMGTqH9ahE4$Cup)z#_}Xh1FTQsBlF^IK9yRK0+!ei~uW@IO8og-I=uv0WiN?@- z=0-%tI77rcK<_ORY(T6#?C{AK^;8U3-@rA)FnIyt9jKRd1*>V!t~ebldQi9*UQ!!8 zpk+mFKkwyqr0Bu#1R(|7b6VcSJW0sQ0<^3M#cgpe++g#W{z zFe@9`oa_qL3yWRwUJju=4Szx}AsTvnVcu!p3t|7=8VWJwi9%k?k8$A7$NFN=$NM@g zv>1Jzen(W>o%eMZTZG0OcNF5E)-MAA&vj7vgV9T2t{G!VGk1D6!od@4l%(<+tws`R zC?}z3%#qK)?g>ghdOIwF0s*T>TyVk(6xdXWi1BCxU zc+6ySne#GCK3CiYE(LM0Ym#fBX`y|-YprW-y1ST8v23VAm6f$^rOpC5t40I8UbaK_ zc!JdqDFcLM6%|4PDl>)0kk~+)460b5FJ=5XIc{3<7+fJ3y8tCx47XZj&uXaKY06iMEMQ3-4 zzYv#qiPoLo%=PudA6$7{e-DPHspFYZ`YNey=9_awxld?rnZL+Aw_~1|{hYW^yk*en z&qEW!nT7f@`j`3#`ZIY^am54O7Zr|hyK)1`NF9Wnu|DAMFBhuCW^HIrWp$-gMQPrH zd`*eU;)e2J*0H{Ei6O;f%V(jg!py)@ak;uQuu1KVrIb}SSGQEl)zwv1(Ja*)_ZMhU zh1pekG&|r*&}3)nV86Mdf-RA%Dk0>CLKM%bWteSp*05QihQ`czZ&)yeASD04{@O3K z2=~|4X4W>>N=3|9RuqBNis?tV+Q0~gSVX~a{V+UYXmgFBvi5_G_Tomti%B+D&x|u0 ztiG9S^fKmmENaiiR5KC?W^%z$syW@q3nyA%A1|VPqB2z1_3vif+iEL)VL``Fva_R8 zZaVLU&nJx-{HxjXE*|aJyKn48+D#8%va|K>>PNm6Q@Zq{`uAzU{ob0=!u)fFEgCjd zjEm;0-xxQtCBLBjmI=?0dFZ-NrZ{AO#?A)PYQP6|ud2P*`v5ZI1&u1STn< zA}e#*HDiry2(cB`ykbjaW#qPq97%x`iv%qeTrZH&kl>#e)Q_PX`-Gra|Afmc1{6yx zl+yi}UF=hEDx=t>-J#Y%?cA@W(|bbD6O@8>PY~sE93ZYe0Bg%|C3~g^@ zg!>G!WIq6-tLDA4T@Izp@UA#uQM`roKB?9}8LgPr!LF<}WW~?J7 zrTT-iVYhM{Hk{&y3CgQyp<$3xIN9gmb&u)F(~sFZhS|!;9PbzyCMTO)=Vg6q0T~J+ zNGaW<7V&?uJ2^=mS(zAbUU%#?BNGXK8aJ5fzf4KcL#BkSIHgm%GR4g8N`H7{WOx9 zorS;$R?=L2J7sRfN^%QV0AN~)65~CKrOe$7z&A?$?bk9X@ZnBbVPi`MW&UQm{+l)9 zWNQXcW~`YNo}L|3`CTP=eL?gHMi+tcTMIEzI)5+b1uiz!9ydJn-+r|DMh$Z^9x}9nur1^s@qv80H9YVmRI4)x$2zMK*rXLo>>8zj%kwjQcWg&+6)# z8UD0va-cfl`0Mv@Y^KVuxbpIC+XoLHJS-o`-^DlX|IN)Cmz{O-KX(xOoA5I*SP^%B zOxUW`rL(+OW0N>U_)UFn5oajmNkpS|DXY&G`7dS)DPts6jUCdP&5+z6qzE$ApTKpT za28?|5&a%1+BbQj2ZJxJ{hZ6sXHC{2)8m7E)|^RMm)>YKCT~Z2Vcw*PKKrdU`|Vd| zk$$yJpDT@E>}e6<5iOnN_#$)7>;%y-#W*C{r8-j-B{hL843G-jgQ)T5>OxWZ?R0XZ zKm<8$JB$fqv+53u9bGOFVuVXeDjmwTD`W1H(h|Sm)5;noE70K6>bk7gyNl{Ipx!O| zgj|5k94f17ZZ4w41d0Sdj0LFMjjQ=kWZSZ_c&sYc!epfPfC}hn+V2 zt=pPcrYZIlcZO>tG$hbri%)$nk7xR63D-|gEr))Z`j7|=!hQ|f9lUY@1tvDMQ|Z*R zKzTlBx>E3?vcvDRLYtT_qBhpT$hwFe3WOt(aM;`ASGj=_4!2t&Ts_NaT7!iDHIl1mSkhl(!v^}s2UYH=_Q!!u`TGtu0zNHB!-gph1~@g7u(Y3 zmW-Mn2sr;L-o1;{8b+Rf!Q*(uo?cK;uxgTg$*qqXEQc7;S7D>CV?K{kjA%f37rp^M z8_zE^1~d}F#Op}|imQK%$j5`GRQMw%ux zu~+S=%sQ(;dPn>-=-5QJGgHivGMy!2nX}xk*(ckVNE<~5ynkRvwhI>Pqmmt5ZK&jG zQ_Y}=u-K&zTc-{D9>Dm;h>_l6M6cOOmc#JJ@SF;#XzpaRnXSw-c9HvS`|P{mGEJ^~j^Jex6~fzqu? zR37|6*Ea6kCuJV%{-^lYwfYrGI|U=UaVP@+hY?&4xfK?kfX9L47RpGrVWA*x!7N%l zo=~DEAM5X0I;|j^i!^eZ4bg;jcRH1}XX}vZE%X~S{(Y7Se{fvdlh4qTWx{P2ad{+p zCeb=f<}*-}RwBxjd2&ib zIZ7Bp>^)FM_dGR}hm@)_JhM1@+rH(Z`oQMg1qIg7gn~J(qAB&b;H}HK<9>(Zc6+d8 zn!k$n4rX2*z;+sCO<uthai%!MBpGYdtXN>Ih>At@cx=c~ zK|dV&g$6ew%|0AHJQT?qY{k-stRg$oNE>99x{Y~-Z0CjCAuS{s);!zGk`GQg2w3EJ za-$p#V__>y#^N=%#nIr_IT}2D3Jt!nslgONWqGjAtU{C$|2YmA`H=J`UrAs?wh zhS&Z>Wfj|yOEi@1g`@!T z@^CMdSp+Enri{#oq@3g#MGampK*))yP8_^Ad9j`%;CWe%(=;FXt0jWdgR@YMlhAZn z-9BG%sLidWTP=BcQd^cYH#ak3oPnwp5FV2KtOokm{6O*f5Z&!81kWBjD3KJ5d5(mU zzR#Bf8iqP()ICq0r1%9tNzvfT0S!(cNezCITA5?UdRf8g%Yl?b>^y=C87rX-^3Bphy3PAFbiaNs=X=2?NYO|GXXbk$?eLO0(2@A03ZOoqEEOo*J?F8 zY_1f)5@O54@Q;Tbs0joXV$yq4NKBhq8k14;Be_EG>n}N0&zwc#!kkKy2=8*CY`!d~ zk5C|07k*GYBu|tfG#+WZEKP=)SEOzg8JRLQ+_J(coMh_a$RrAXSM_Aebam~c>I`Cu z{wGT)FutX9K>&~Kee&hqTg04O$&q)f{_d8x>GO*Uaw9C8k!78*T5$s~r9t6sVV(d~rP4rHh{D6*{wRb-P%V12(rj;bXpnVKygqB3 zbzFRG*15iOgSIM?9Hpg+wn}Guj>#$et4%gQuo5sBk8lhSXhXAQM`^S;)MEHEap{W&jmX z5K90-5G`m`a6xdlwkmbky5lZYY8A`1T3eOgTD8_%wN|XPUh6`J-}jv7oh*p$_1^w} zpWi=*cxIpXJkN9X^F90!IZz;k&FVTOHblr!el8XGrJ2;i73FqZ3)h1Za?SBVu8Kq5 zGpTo~Z4>oue3Q!I@H@P7UiD#!PRM=nOB1F~*k4dqef7#yuBs_3*gs)<&B>!QeV}Fj z;@eLPm-*$ci8J26L*0CM^QMbiMt6?xY`OeY^}@sF-T1ej>b6W@d%$X&Ck*fVu~H{N zs#nSmROT8X%#u;dXl)cd+o5NnmqE4{7Us0#W`O#e0i``L&65BV2XOB zvG|@9_dT;WGaQ*SqwDU;d-GCo5I``v`1ah~Gbi`_<|V|+&Yiufs=9nio7(x+O%^T$ zkPCM2C?<_?99pn;@TqHM32;zeVV&Kq^pxHP7PZmLntg$I4s~zy=^cCygo5@izfZe( z4tF-v2~QWp!SGo}{1Mu-<1HNxzwftMtmw@#3wge8UaNZ zH2_c(%`tNn7n*7JnX6h_;ypQiNXQ_-P)zuR?&7*)rLeHrgsLp|B9U0rh{2+`UxSOk3|rZd zIW%5}Vk?U4i(bB>f9n+omfb6Nf~&66j^TP9CAyj*#{Kc+wO!VB1T5@U7Q8eucjRG)5n&qFR}$f?v5 z1CK+bZGOh|g5yT6$T+cJb<1Yw8NSn^n@2hod()`;EHew9W0$?Vd)l-ycN!J`iW@4_ z3W`-$)X7C%-ALY4gKwT`^_KG!t@f+O$&h(If9sF_tphtfEDy_KA_4EnG{(W z(^bH2LQ|RfB$ClUiBL@%my@KyC<4tLV`=C0SW4?qZ`F`_W=GRM%hss+w}{F*MN_d7Y(+GQUw1jgfw4X`;dB9IerI3}`fW z<~M1y9nw?Q`wTvZ--qkLgl4=%rg(eweg$6TKGTD9>-J(0jdwAIVS4$Udt<$9rLw-{ zDlwriFX4C3vtF4w@JhUR*z1ngp<@^=0}*~sZaDBd$w{#FaEp(jO~(LUAluB8qiOYN zOVau<#xsrZ>xH+5iLCF)=Nn$EMZ;r~dgPr)@NPUg_0c2u?4ft2x@dl)4STLvQ=*cIoDt6$ zWz9l$NstT3Pa)>T{uP4QkQ7M%Qv($Jg{Y{I3E7*fAn0F{XGk@6t_+Wp{>zYU7?ya^ zSILu3$hhw2n{VoWVZ}A3v*VgM7hfc=N?tCXn%wE`TcD2nW#sJ5=U;sOZ9kXg!mJl7 z>u=e01#T|8p*js;OS=EayLy)1fT(YwwAl2HOmE5Q%9)qGvfzvYz>-lT4$0X{^c98j zE8L~oE8Lshy4+A$=+18d0-b<&K8 zl_#@hjn4f;mzAecE$-CuF*?UBGJ*kvd zly6&b!>j4a#&aL)Xm6V{@zv(Iyigu3x5^umFC_n5IqTBK#@1KvCmZs|n1B7fV<2&l zRzKFQ?q<~XH#71!VSuyzQATTCyl$jfiq|ze@ux*< ziME(6TU(B_=rZuP7Xo=(JqGeNLvPdBxRBrZHN11;W=T5sJ2%if$D~*km7rT=M`F5M zBh@Ud*59Gw7YOR%dO^I+CTzjw(l+ zW2|E#3{D-Ug_h8W2jW+Ng_GrrX-o2#(srDu>c^12d*2M;P^#1;1C0z(gZd7b(kLOo zrlw;_Etk-X5hPuXzva{9-;nOZ^ksaN|4Vb5WW}SqR2>;clI{-l{YW(ex*z4|EHyB< zNYzJNIsy}mw#r*!*dy)X(t`X78`50~GuzOe_rh$!*|1d^kUnw4S;f_J)UuIgNHuBJ zGyr%>R@PhqO>rs;A3*t49siX65nD&d{ZBpBf7??}i4RO({Ij3^jCLoiQ+*Lf9*SwD zwX>&Q6CgR0~VMu+dtu=XULiywU#q6cxvs=r&${s_;WiY%X7b!TP5yi;Xz&rLry zljdXQha_X@A~I17)Q(h(0CWKH@grpRm{>SAVXDw{NKI4;&L-lMj9UJrs$rir+4`jD zkWV5fmOn`cG9-FF`IC^ods`p?>*f48NEjabbJU;n=Tr~-oEatn5LKDqR$)s};Wt;< z@>4jv4$JXFGemE$w6aYK#Xzw=G<#(&$GR>LoDwCE#g(AN`bZSkBO>%x&V| z@n*JCrUKVODJv`I%PGTlc2h|OdvYKsm%)=-(NM*9_!6P8v8* zZs}owVmRFQ!Zx?T?nNP48kI$SiZniDQmK~A>C`kSqZ07)WT}%KlaG7dZUDw@$&#}! z8(vlRt<#O4bM{HzK2TCc2}RDPk~Kk-g!unlm^65hxrl7YVWzS%ZRD(x@_j%4ank+c zA8Wlz9f^>E6V1LhPPCsoHo$+X?geTxZUg=odX^qPANxQ>Aa9=8-lea^7y%9Uszw+? z=d;nhRD!V6I0U~ZD`VC9${h6+WvRMZS+8a&s*YY9y9~rH)tH6u4MMb&$+QVj6#|mp z_|^7FFdO6ohoYbVGm{(=qQ`rNDt9DXLG? z^e)(3XJQVdrmLC`_OuLj((P`$j9(`v-Zg7ewb|M-ZL?;>j_#%66{;75QX%(ypOxE} z;6$MlO>Wdrcr{s_tbSgp{#e(){7V0obp@aCH?AMJBFgdlF_Q|cmeyj6KE`ianW=uXXHUz?6=X- zj(kAN$|U?6FaBvyeYHoM+H^Rg{;7#5K%Mp5?>l_@efXXhrVqXsGGO2&?G|tzdf_k7 zTgX>nt$hd#iBK=>U{QVzLX=;FuwsCy&>#^+F<=%^63YtQK5Q0In8|XEx%^tzNe%jPJRsipSVr`N6d7eSzlTa2MUATVc!Gss-`*9_Fzvh)ph`clkQIg z>L{jEYwB*teU6t@!Sd07Kau^Qunx;AIHUri~CV2rF?2iaPptoub zo5&bu#?ubu%x#CZ?V~@aU?DE`u7MYTEeTT}g9!_C>8lOOs{Y%xiHG+ollm`IuYDBf zEo0ApNh92U6L^Ln%6)-n@Rx9#JvY9M=qGNE1rNnpXk(u4fwmtDo}yI7oL`b%lBYzB z^+7qI%?YO>j${{cSyoXcDdr*$ z*A&?zL7NYdKtiX1c#E|uh<~u60r4J3azMPoiVeg&57Bnc#3G1{I|vKg(9Rnhw*@pc zh<7MluFT$Q-)+Cou0~6GO8QFRtd$hIOA;lppD0Wtl=3sgPwYG7@+`9MP!$fWRrrqy z)9iIwI7|qy3cQI_J|X}Dff;m;WHlONr%&zq!`07T`}X8%)AzSE#jZW!+2em08`->H zz2v&zj2SoHnS4_2OqxfVLv6OS{JzMeRlogVqWsvtm?iVlQ(nGqJ*$v_?Ge9gXEKK2h?W)*a zp=D$TUNewVgCGBBtclz_! z$=Ax?E1lQUcEidSzxd+Cl{d7t%qvZvbYZj=)23Z~(zyVN)iMe`s zF%ee5Kn7yYZaM zIb!xID0m>rOCS~e_sj72Ke3)~(-?@^%5uJ~9mn5^96G;zJ?aued!XmBi|~Bf7gAxq zEkN%N4-(RjzRwP>CyUG7W`{ot=h5b#6d6-GCO)ThQ-x6*O?St+t4*iJ{Mpft#RYOf zfm+q!l4B+ya9r6Q%z22GM^FO#A)Ce^1VRLecg$=u$~`{vdOX~8=ZPMByRimkwf$&4AQ|K8Hy*vn4lj{KTzL3+ZQ42a-X zmvt2vcb-#LTXW&5T_+br^E$7Zc;%1ez5kK?yt*=3tpED0WL0g|g$uX*q$Df++|~0} z=STg!bMp#MnB8|;th#!A$Ke}G^RI(k<7^tDt9I$F$0Qrr;lu)AN4*7jgDhqCdJLsB zZ1ymoX*0sGt8~@ngc(^WO_JtIE2Q->fOI`uFVV;8bM)oV6PdB3|d#_V0%Zltv|rz79l?Og1{ zz%)`C%zXOu4AO4^?Sr3#Re&A3&9XuzJVmCGG(ep?SWTzVM0&2wJ8 z*m{)zwPZGDEvl%f8F3tV7Xp?{Y%0o0pmV*5Qx+a5!8pytLBWclBLbA_wb7gf zWA-eVGOF&k$F)p( z|4$do(&>FKEOK1GZQ6?)*C*fKSvax0baK$IHxc((rU7-#k3gM|Fj>}RtErkj*_Ccr z=v>p0B?68fh%nCaVE5eM$>wT3iFb@;Gjluv&lc5sAlRga$;{PyxNTMINtXumgG++{ zyJ|f#t&`g2Abv#Io`w6uMtS=7z&8m5+K5;y?7&o^9+DKtD%2a=Bqz{VAc2EN7vsST zx&WGJJ@zE#ivU+ZdrYc3a&V6m*+7U(GZ#cbB?7+@`m?-RF70p^=NBu*#YSESw$%G( z4jCh@o=G0XBUg7ALAn_;#sMJRS%PNXuh`53Axcs~h?NP_$_z9v3U34Vyk$1gMz+8R zrN;cmM59t%$|!IsmB5mg!fc`K?_x#i0{lA9KNWHuaj(z$13^H2(_3wI?Lzxr>KLOHhFB+4RAQ4$aNl`r6{wUte?0 zuUkuMYD!yPzWVByTS{twqK$}Ftm^JwRZ&={DQo*LsVy$=>+bF=FRoRkC;Mk@yWoOt zv-+RBN4Cv8=fVrmnU(x<*3N^?<6BzB$6wv~qf7qWF|Gr@e z!!CaT^b-{FBhEzjNm^zwj>`UEKn*~a>@!=5Z(9%-4%!iHkYPvq5-uGrVsbc88E6h{ z4cr{ivjZi8(*suo{v7xsU^oInOyqXEv4S6)xehdXNMUz4Kb#1w|DJ|`clex;YdO3j zAT<1(w6hH3NXQz(;i5_jnjhCoC>)|OplVHU-#%^Mnzhs((7WcS1_54a;3{%y1st~9 zKTnS81H%5+iCYpm?Y6Ycy7aoKxnIeDJ~eqR8V6pJf7CrvxfP%&1vvsK{K>->|DhFz;QT_y%5?7?pf}wqCiO| z)RZ0n$w2f$BLre4YNNL0h2*2jtDlj7^_!Q~QHOt~MdeQ|`MM1HI$JtoMm$j*c$NO3 z+ryWpXLjli$?kN?lwA~JmIxNJUOLQ>mwa@25GZb^nvwbJ;FoSMHZ zkRMnQ*cDLIt$J2I=8iC2abaSCuuLo`$2oCZSXLl}t_Sf6j{WeFH`Y#ZvP5-m_aD7e z25v(RPy>lo=AQn) z>t7sxyllppcGbj5cSak&NQJ;_{~K=Dgum z=hVz;UlG_8aEF48iG~JOalxoUIgtQFStzHWp{St1Qx(Yp)-VTV1zaRNu}|4zW#5bh zB8bn~U#1y+2Tg!(#x>3UU{Q`|E7q1aQw7-*(!^F?kyd7NYsABa4wj9;zPjhU30xNj zHA9jT1q_sugojK&BqtFg^?+eK+Xgp9l2S)Xe~5L!l9RmTxP@Vg+$CZcL-9({(mm`Z zL)>Xu3p*b?ZgOkw#TP%8=p5HjUwy%pv#y%E;2m`&f)=ON*EElAtl7|WXY#k5D^O@L z*-U(YLC)Bd3i1n=%)T9V#Ky7lY0WL|SI?VvZfwLjZ(7bRC(qp0YFvALZeeu!nC=t8 z0sk%KWhE=ymah$kY;`3?i%Gij+zE7a_-XEh<*i)7_@;U2j|#R1VtJDSWAf$znq1B9 zaBDg2k3j#4{m($AA`$^czr?-?2nJq*GD`*FJ`oeuTVdZS(k}GiuZ}9AZ}uy!eyIV! zV!)jka4*uwn;+}!=uEzr{QYac z*!OVq)WY01Nl&eS#rvgpx>O-O1YCZ_WkkItMa{nEBD3g>d^^e<-!gru@JfWbLrN%= zo5lyPC*E_mkF|Ri4fY`;O%K_8;Zw44#B;_*D z_o$Pj2RG`YWYY1?aI9VEZRr+0rB^bxZ)z&XNDq1X>ff|365%UbfKzL1aoz}3-KD^@KE4} z^$Cd22qpw^z;FV1nMx7DeAq5X+~K~gFt#A}Ai`tsrsB3RAn6J9nSGf`W)U`@h%y!h z=~Nc6fsT7WGuaL0Krp|djo;7~rtq%dB8dMKueDJ0`FSMXX!@%%dl&2&rKe;`i6Y{< zvb!W7!Ce*6MzY>%y9h5m71?F09~%pnJstt;xtdeNcmF%#UHy+sx@Y`+-4pAco7uB? z@8qVD=Z|?}%=shR#_pA$Tzh*g9@mp6%hwo9EzP&BRc`42;hJqlrFokA+~F2Ir>uPQ zMrA41Va<`ZjV!FgD7nIk4_bw<8T1-Fzk%mnusS#^!^>((u~vBW65V)>ezAkx?FdS}}WnR(&f z35^qc{#@g6M^1LIrFHzGNXUQP1@G)yEB|B3Pbc@xKXJ_16MCmidFuE(;gZMl9vY@Do#CCyQ^h4`bwyFTg#2Evf%Xi6g${( za-3Yn+8C2TiC?`qMqI&1h7n0y%5OtsbN5$q8S*t0CZXXiL&g-?z_5W9o<_ap#1AjM zBl*$s$FEp%!eZHT$Hkv5&Ybqej#KZMIDVd6Z94q)ya|(@>AUbBJ(;7+Vm!X(k$dI* z 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 literal 0 HcmV?d00001 diff --git a/exampleJsonLiveEdit/bin/data/gui.json b/exampleJsonLiveEdit/bin/data/gui.json new file mode 100644 index 0000000..46745df --- /dev/null +++ b/exampleJsonLiveEdit/bin/data/gui.json @@ -0,0 +1,105 @@ +{ + "elements":[ + { + "id":"background", + "class":"colorPanel", + "color":"bg", + "size":[1280,768] + },{ + "id":"Head", + "class":"label", + "font":"Headline", + "position":[80,44], + "size":[1280,40], + "text":"Interactive GUI edit" + },{ + "id":"text", + "class":"textField", + "size":[820,40], + "position":[80,100], + "text":[ + "" + ] + },{ + "id":"button", + "class":"modalElement", + "position":[80,160], + "size":[32,32], + "colorActive":"black", + "colorSelected":"white", + "colorInactive":"black", + "info": "sub elements can be defined", + "elements":[ + { + "id":"description", + "class":"labelSmall", + "position":[40,10], + "text": "a button" + } + ] + },{ + "id":"checker", + "class":"simpleChecker", + "position":[250,160], + "size":[32,32], + "colorActive":"black", + "colorSelected":"white", + "colorInactive":"black", + "elements":[ + { + "id":"description", + "class":"labelSmall", + "position":[40,10], + "text": "a simpleChecker" + } + ] + },{ + "id":"border", + "class":"colorPanel", + "color":"white", + "position":[0,210], + "size":[1280,2] + },{ + "id":"container", + "class":"scrollableContainer", + "position":[0,220], + "size":[1280,548], + "sizeScrollableArea":[1280,1600], + "bgColor":"bg", + "elements":[ + { + "id":"description2", + "class":"labelSmall", + "position":[40,10], + "size":[400,40], + "text": "a scrollable container" + }, + { + "id":"pic1", + "class":"texture", + "position":[40,30], + "texture":"cat1", + "size":[500,500] + + }, + { + "id":"pic2", + "class":"texture", + "position":[40,560], + "texture":"cat2", + "size":[500,500] + + }, + { + "id":"pic3", + "class":"texture", + "position":[40,1090], + "texture":"cat3", + "size":[500,500], + "tint":"tintRed" + } + ] + } + ] +} \ No newline at end of file diff --git a/exampleJsonLiveEdit/bin/data/guiElements.json b/exampleJsonLiveEdit/bin/data/guiElements.json new file mode 100644 index 0000000..2263d9d --- /dev/null +++ b/exampleJsonLiveEdit/bin/data/guiElements.json @@ -0,0 +1,34 @@ +{ + "colors":[ + {"id":"black","color":[0,0,0]}, + {"id":"white","color":[255,255,255]}, + {"id":"bg","color":[30,30,30]}, + {"id":"tintRed","color":[250,0,0,120]}, + {"id":"inactiveSlider","color":[31,31,31]}, + {"id":"dropShadow","color":[0,0,0,50]}, + {"id":"iconBg","color":[31,31,31]} + ], + "fontStyles":[ + { + "name":"Headline", + "fontId":"Franklin Gothic", + "fontSize":40, + "color":"white" + }, + { + "name":"Text", + "fontId":"Verdana", + "fontSize":12, + "color":"white" + } +], +"elements":[ + { + "info":"a prefab label class", + "id":"labelSmall", + "class":"label", + "size":[125,30], + "font":"Text" + } +] +} \ No newline at end of file diff --git a/exampleJsonLiveEdit/bin/data/textures/cat1.jpg b/exampleJsonLiveEdit/bin/data/textures/cat1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1302d97cae362bbf70db70855b265bc7fe1af291 GIT binary patch literal 55963 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 E*?&yhwg3PC literal 0 HcmV?d00001 diff --git a/exampleJsonLiveEdit/bin/data/textures/cat2.jpg b/exampleJsonLiveEdit/bin/data/textures/cat2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f548a7323d3e143296d1f6a7fecef0e49691dd56 GIT binary patch literal 60590 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

kM^?(!QkyrDn&?H?e|#-@ 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 ZoDlh#_B0tm6CT_{6&`UgF&4(3|Jm@5c$feH literal 0 HcmV?d00001 diff --git a/exampleJsonLiveEdit/src/main.cpp b/exampleJsonLiveEdit/src/main.cpp new file mode 100644 index 0000000..56e5041 --- /dev/null +++ b/exampleJsonLiveEdit/src/main.cpp @@ -0,0 +1,13 @@ +#include "ofMain.h" +#include "ofApp.h" + +//======================================================================== +int main( ){ + ofSetupOpenGL(1280,768,OF_WINDOW); // <-------- setup the GL context + + // this kicks off the running of my app + // can be OF_WINDOW or OF_FULLSCREEN + // pass in width and height too: + ofRunApp(new ofApp()); + +} diff --git a/exampleJsonLiveEdit/src/ofApp.cpp b/exampleJsonLiveEdit/src/ofApp.cpp new file mode 100644 index 0000000..21db340 --- /dev/null +++ b/exampleJsonLiveEdit/src/ofApp.cpp @@ -0,0 +1,111 @@ +#include "ofApp.h" + +using namespace ofxInterface; + +//-------------------------------------------------------------- +void ofApp::setup(){ + + // create asset manager and load assets from "assets.json" + assets = make_shared(ofxAssetManager()); + assets->setup(); + + // create a base Node + scene = new Node(); + scene->setSize(ofGetWidth(), ofGetHeight()); + ofxInterface::TouchManager::one().setup(scene); + + // create the scene from scene definition + GuiFactory factory; + factory.setup(ofLoadJson("guiElements.json"), assets); + factory.createElements(scene, ofLoadJson("gui.json")); + + // add the file watcher to recreate scene when file changed + ofAddListener(watcher.events.onItemModified, this, &ofApp::onGuiJsonChanged); + watcher.addPath(ofToDataPath("", true), true, &fileFilter); +} + +//-------------------------------------------------------------- +void ofApp::update(){ + scene->update(ofGetLastFrameTime()); +} + +//-------------------------------------------------------------- +void ofApp::draw(){ + scene->render(); + + if (isDebug) { + scene->renderDebug(); + } + +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + if (key == 'd') { + isDebug = !isDebug; + } +} + +//-------------------------------------------------------------- +void ofApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseDragged(int x, int y, int button){ + ofxInterface::TouchManager::one().touchMove(0, ofVec2f(x, y)); +} + +//-------------------------------------------------------------- +void ofApp::mousePressed(int x, int y, int button){ + ofxInterface::TouchManager::one().touchDown(0, ofVec2f(x, y)); +} + +//-------------------------------------------------------------- +void ofApp::mouseReleased(int x, int y, int button){ + ofxInterface::TouchManager::one().touchUp(0, ofVec2f(x, y)); +} + +//-------------------------------------------------------------- +void ofApp::mouseEntered(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::mouseExited(int x, int y){ + +} + +//-------------------------------------------------------------- +void ofApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMessage(ofMessage msg){ + +} + +void ofApp::onGuiJsonChanged(const ofxIO::DirectoryWatcherManager::DirectoryEvent & evt) +{ + // delete all children from base node + while (scene->getChildren().size() >0) + { + scene->removeChild(0); + } + + // create new elements from definition + GuiFactory factory; + factory.setup(ofLoadJson("guiElements.json"), assets); + factory.createElements(scene, ofLoadJson("gui.json")); +} + +//-------------------------------------------------------------- +void ofApp::dragEvent(ofDragInfo dragInfo){ + +} diff --git a/exampleJsonLiveEdit/src/ofApp.h b/exampleJsonLiveEdit/src/ofApp.h new file mode 100644 index 0000000..3ff9e99 --- /dev/null +++ b/exampleJsonLiveEdit/src/ofApp.h @@ -0,0 +1,36 @@ +#pragma once + +#include "ofMain.h" +#include "ofxAssetManager.h" +#include "ofxInterface.h" +#include "ofxIO.h" + +class ofApp : public ofBaseApp{ + + public: + void setup(); + void update(); + void draw(); + + void keyPressed(int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void mouseEntered(int x, int y); + void mouseExited(int x, int y); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + + void onGuiJsonChanged(const ofxIO::DirectoryWatcherManager::DirectoryEvent& evt); + + shared_ptr assets; + ofxInterface::Node* scene; + + bool isDebug = false; + + ofxIO::DirectoryWatcherManager watcher; + ofxIO::HiddenFileFilter fileFilter; +}; From 9c8a9868d3e4d5a0f256c87cb9108cb17926874c Mon Sep 17 00:00:00 2001 From: Brian Eschrich Date: Tue, 8 Sep 2020 13:15:16 +0200 Subject: [PATCH 6/9] updated example --- example-advanced/addons.make | 5 ++++- example-basic/addons.make | 6 +++++- exampleJson/bin/data/gui.json | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/example-advanced/addons.make b/example-advanced/addons.make index 51aff7e..a004113 100644 --- a/example-advanced/addons.make +++ b/example-advanced/addons.make @@ -1,2 +1,5 @@ +ofxAnimatable +ofxAssetManager +ofxEasing +ofxFontStash2 ofxInterface -ofxAnimatable \ No newline at end of file diff --git a/example-basic/addons.make b/example-basic/addons.make index 3f201f2..a004113 100644 --- a/example-basic/addons.make +++ b/example-basic/addons.make @@ -1 +1,5 @@ -ofxInterface \ No newline at end of file +ofxAnimatable +ofxAssetManager +ofxEasing +ofxFontStash2 +ofxInterface diff --git a/exampleJson/bin/data/gui.json b/exampleJson/bin/data/gui.json index 48babce..bd7aafb 100644 --- a/exampleJson/bin/data/gui.json +++ b/exampleJson/bin/data/gui.json @@ -11,14 +11,14 @@ "font":"Headline", "position":[80,44], "size":[1280,40], - "text":"Interactive GUI edit" + "text":"GUI from json" },{ "id":"text", "class":"textField", "size":[820,40], "position":[80,100], "text":[ - "" ] },{ From 1158775da7d3d59f1ee7230926b6674028078ee3 Mon Sep 17 00:00:00 2001 From: Brian Eschrich Date: Tue, 8 Sep 2020 13:16:04 +0200 Subject: [PATCH 7/9] component debugging, features --- src/components/ColorPanel.h | 2 +- src/components/Label.cpp | 28 ++++ src/components/Label.h | 6 + src/components/ModalElement.cpp | 33 +++- src/components/ModalElement.h | 4 +- src/components/SimpleChecker.h | 1 - src/components/SoftKeyboard.cpp | 100 +++++++++---- src/components/SoftKeyboard.h | 4 + src/components/SoftKeyboardKey.cpp | 4 + src/components/TextInput.cpp | 233 ++++++++++++++++++++++------- src/components/TextInput.h | 19 ++- src/components/TextureNode.cpp | 11 +- src/components/TextureNode.h | 1 + 13 files changed, 354 insertions(+), 92 deletions(-) diff --git a/src/components/ColorPanel.h b/src/components/ColorPanel.h index 15bc7b2..1d36913 100644 --- a/src/components/ColorPanel.h +++ b/src/components/ColorPanel.h @@ -37,7 +37,7 @@ namespace ofxInterface { float getRoundedEdge(); void setRoundedEdge(float ang); - private: + protected: float borderWidth; bool bDrawBackground = true; float roundAngle; diff --git a/src/components/Label.cpp b/src/components/Label.cpp index 4325180..4bcb24e 100644 --- a/src/components/Label.cpp +++ b/src/components/Label.cpp @@ -7,11 +7,27 @@ namespace ofxInterface { } + Label::Label(const Label & mom):Node(mom) + { + font = mom.font; + style = mom.style; + text = mom.text; + alignment = mom.alignment; + isDropshadow = mom.isDropshadow; + shadow = mom.shadow; + shadowPos = mom.shadowPos; + } + Label::~Label() { } + Node * Label::clone() + { + return new Label(*this); + } + void Label::draw() { auto bounds = font->getTextBounds(text, style, 0, 0); @@ -56,6 +72,10 @@ namespace ofxInterface { { alignment = alignment_; } + void Label::setShadowEnabled(bool isEnabled) + { + isDropshadow = isEnabled; + } void Label::setShadow(bool isEnabled, float w, float x, float y, ofColor color) { isDropshadow = isEnabled; shadow = style; @@ -70,4 +90,12 @@ namespace ofxInterface { float Label::getFontSize() { return style.fontSize; } + void Label::setColor(ofColor color) + { + style.color = color; + } + ofColor Label::getColor() + { + return style.color; + } } \ No newline at end of file diff --git a/src/components/Label.h b/src/components/Label.h index 274cfec..dfcaee8 100644 --- a/src/components/Label.h +++ b/src/components/Label.h @@ -21,15 +21,21 @@ namespace ofxInterface { { public: Label(); + Label(const Label& mom); ~Label(); + virtual Node* clone() override; + virtual void draw(); virtual void setup(LabelSettings s); void setText(string text); void setAlignment(ofAlignHorz alignment); + void setShadowEnabled(bool isEnabled); void setShadow(bool isEnabled, float w = 0, float x= 0, float y = 0, ofColor color = ofColor(0)); void setFontSize(float size); float getFontSize(); + void setColor(ofColor color); + ofColor getColor(); private: diff --git a/src/components/ModalElement.cpp b/src/components/ModalElement.cpp index 3a50e66..555ba9f 100644 --- a/src/components/ModalElement.cpp +++ b/src/components/ModalElement.cpp @@ -4,6 +4,22 @@ namespace ofxInterface { ModalElement::ModalElement() { + ofAddListener(eventClick, this, &ModalElement::onClicked, 100); + ofAddListener(eventTouchDown, this, &ModalElement::onTouchDown, 100); + ofAddListener(eventTouchUp, this, &ModalElement::onTouchUp, 100); + isSelected.addListener(this, &ModalElement::onStateChanged); + } + + ModalElement::ModalElement(const ModalElement & mom) : Node(mom) + { + colorActive = mom.colorActive; + colorSelected = mom.colorSelected; + type = mom.type; + isSelected = mom.isSelected.get(); + isSelected.addListener(this, &ModalElement::onStateChanged); + ofAddListener(eventClick, this, &ModalElement::onClicked, 100); + ofAddListener(eventTouchDown, this, &ModalElement::onTouchDown, 100); + ofAddListener(eventTouchUp, this, &ModalElement::onTouchUp, 100); } @@ -11,6 +27,11 @@ namespace ofxInterface { { } + Node * ModalElement::clone() + { + return new ModalElement(*this); + } + void ModalElement::setup(ModalElementSettings s) { Node::setup(s); @@ -18,15 +39,16 @@ namespace ofxInterface { colorActive = s.colorActive; colorInactive = s.colorInactive; colorSelected = s.colorSelected; - - ofAddListener(eventClick, this, &ModalElement::onClicked,100); - ofAddListener(eventTouchDown, this, &ModalElement::onTouchDown, 100); - ofAddListener(eventTouchUp, this, &ModalElement::onTouchUp, 100); - isSelected.addListener(this, &ModalElement::onStateChanged); + + } void ModalElement::draw() { + //if (type == ofxInterface::BUTTON && !isTouched() && isSelected) { + // isSelected = false; + //} + if (getEnabled()) { ofSetColor(colorActive); ofDrawRectangle(0, 0, getWidth(), getHeight()); @@ -58,7 +80,6 @@ namespace ofxInterface { default: break; } - } void ModalElement::onTouchDown(TouchEvent & e) { diff --git a/src/components/ModalElement.h b/src/components/ModalElement.h index de3b2df..774c0d3 100644 --- a/src/components/ModalElement.h +++ b/src/components/ModalElement.h @@ -19,8 +19,11 @@ namespace ofxInterface { { public: ModalElement(); + ModalElement(const ModalElement& mom); ~ModalElement(); + virtual Node* clone() override; + void setup(ModalElementSettings s); virtual void draw(); @@ -33,7 +36,6 @@ namespace ofxInterface { void setModalType(ModalType type); ModalType getModalType(); - protected: ofColor colorActive; ofColor colorSelected; ofColor colorInactive; diff --git a/src/components/SimpleChecker.h b/src/components/SimpleChecker.h index 756c51c..7732a01 100644 --- a/src/components/SimpleChecker.h +++ b/src/components/SimpleChecker.h @@ -17,7 +17,6 @@ namespace ofxInterface { void onStateChanged(bool& isActive); protected: - private: ofxAnimatableOfColor colorFade; int currentAni = 0; diff --git a/src/components/SoftKeyboard.cpp b/src/components/SoftKeyboard.cpp index 7c7edc4..0138c51 100644 --- a/src/components/SoftKeyboard.cpp +++ b/src/components/SoftKeyboard.cpp @@ -33,33 +33,11 @@ namespace ofxInterface { // create keys wKey = (getWidth() - 2 * (margin + borderWidth) - 10*padding) / 11; - vector< vector> alphaKeys = { - {'q','w','e','r','t','z','u','i','o','p',252}, - {'a','s','d','f','g','h','j','k','l',246,228}, - { 3680,'y','x','c','v','b','n','m',8}, - { 9997,'@',' ','.',13} - }; - - addSet("alpha", alphaKeys); - - vector< vector> alphaBigKeys = { - {'Q','W','E','R','T','Z','U','I','O','P',220}, - {'A','S','D','F','G','H','J','K','L',214,196}, - { 3680,'Y','X','C','V','B','N','M',8}, - { 9997,'@',' ','.',13} - }; - - addSet("alphaBig", alphaBigKeys); - - vector< vector> numbers = { - {'1','2','3','4','5','6','7','8','9','0','='}, - {'!','#','$','%','&','\'','*','+','-','/','?'}, - {'^','_','`','{','|','}','~','(',')',',',':' }, - { 9996,'@',' ',';',13} - }; - - addSet("numbers", numbers); - + auto keyLayout = getKeyLayout(s.layout); + for (auto& l:keyLayout) + { + addSet(l.first, l.second); + } setActiveKeyset( "alpha"); @@ -189,6 +167,74 @@ namespace ofxInterface { ofAddListener(key->keyPressed, this, &SoftKeyboard::onKeyPressed); ofAddListener(key->keyReleased, this, &SoftKeyboard::onKeyReleased); } + + map>> SoftKeyboard::getKeyLayout(string layout) + { + map>> ret; + vector alphaKeys; + vector alphaBigKeys; + vector numbers; + + if (layout == "de") { + vector< vector> alphaKeys = { + {'q','w','e','r','t','z','u','i','o','p',252}, + {'a','s','d','f','g','h','j','k','l',246,228}, + { 3680,'y','x','c','v','b','n','m',8}, + { 9997,'@',' ','.',13} + }; + + ret.insert(make_pair("alpha", alphaKeys)); + + vector> alphaBigKeys = { + {'Q','W','E','R','T','Z','U','I','O','P',220}, + {'A','S','D','F','G','H','J','K','L',214,196}, + { 3680,'Y','X','C','V','B','N','M',8}, + { 9997,'@',' ','.',13} + }; + + ret.insert(make_pair("alphaBig", alphaBigKeys)); + + vector< vector> numbers = { + {'1','2','3','4','5','6','7','8','9','0','='}, + {'!','#','$','%','&','\'','*','+','-','/','?'}, + {'^','_','`','{','|','}','~','(',')',',',':' }, + { 9996,'@',' ',';',13} + }; + + ret.insert(make_pair("numbers", numbers)); + } + else { // use "en" + vector< vector> alphaKeys = { + {'q','w','e','r','t','y','u','i','o','p',252}, + {'a','s','d','f','g','h','j','k','l',246,228}, + { 3680,'z','x','c','v','b','n','m',8}, + { 9997,'@',' ','.',13} + }; + + ret.insert(make_pair("alpha", alphaKeys)); + + vector> alphaBigKeys = { + {'Q','W','E','R','T','Y','U','I','O','P',220}, + {'A','S','D','F','G','H','J','K','L',214,196}, + { 3680,'Z','X','C','V','B','N','M',8}, + { 9997,'@',' ','.',13} + }; + + ret.insert(make_pair("alphaBig", alphaBigKeys)); + + vector< vector> numbers = { + {'1','2','3','4','5','6','7','8','9','0','='}, + {'!','#','$','%','&','\'','*','+','-','/','?'}, + {'^','_','`','{','|','}','~','(',')',',',':' }, + { 9996,'@',' ',';',13} + }; + + ret.insert(make_pair("numbers", numbers)); + } + + return ret; + + } void SoftKeyboard::onKeyPressed(ofKeyEventArgs &event) { diff --git a/src/components/SoftKeyboard.h b/src/components/SoftKeyboard.h index 077e368..96a4619 100644 --- a/src/components/SoftKeyboard.h +++ b/src/components/SoftKeyboard.h @@ -28,6 +28,8 @@ namespace ofxInterface { int margin = 12; int padding = 8; + string layout = "de"; + }; @@ -51,6 +53,8 @@ class SoftKeyboard : public Node{ void addLine(Node* keySet, vector keys, int y); void addKey(Node* keySet, int keyValue, int x, int y, int w, int h); + map> > getKeyLayout(string layout); + map keySets; Node* activeKeySet; diff --git a/src/components/SoftKeyboardKey.cpp b/src/components/SoftKeyboardKey.cpp index 4aa7d77..9225e7e 100644 --- a/src/components/SoftKeyboardKey.cpp +++ b/src/components/SoftKeyboardKey.cpp @@ -74,6 +74,10 @@ namespace ofxInterface { //------------------------------------------------------------------ void SoftKeyboardKey::draw() { + if (!isTouched() && isSelected) { + isSelected = false; + } + borderPath.draw(); if (isSelected) { diff --git a/src/components/TextInput.cpp b/src/components/TextInput.cpp index efd4485..6f5d86f 100644 --- a/src/components/TextInput.cpp +++ b/src/components/TextInput.cpp @@ -1,7 +1,5 @@ #include "TextInput.h" - - void ofxInterface::TextInput::setup(TextInputSettings settings) { settings.type = RADIO; @@ -13,30 +11,74 @@ void ofxInterface::TextInput::setup(TextInputSettings settings) style = settings.style; styleInactive = style; styleInactive.color = colorInactive; + enableNewline = settings.enableNewline; + alignment = settings.alignment; + autoResize = settings.autoResize; + + if (autoResize) { + resizeField(); + } // listener ofAddListener(eventTouchDown, this, &TextInput::onTouchDown); ofAddListener(eventTouchMove, this, &TextInput::onTouchMove); + } void ofxInterface::TextInput::draw() { auto baseRect = font->getTextBounds("X", style, 0, 0); + float dy = -baseRect.y + (getHeight() - baseRect.height)*0.75; + + if (enableNewline) { + dy = -baseRect.y; + } // draw content if (content.get().size() == 0) { - font->draw(descriptionText, styleInactive, 0, -baseRect.y); + font->drawColumn(descriptionText, styleInactive, 0, dy, getWidth(), alignment); + //font->draw(descriptionText, styleInactive, 0, dy); }else { - font->draw(content, style, 0, -baseRect.y); + //font->draw(content, style, 0, dy); + font->drawColumn(content, style, 0, dy, getWidth(), alignment); } // draw index pointer - ofSetColor(colorActive); - auto indexRect = font->getTextBounds(content.get().substr(0, indexPointer), style, 0, 0); - ofDrawRectangle(indexRect.x + indexRect.width, 0, 4, indexRect.height); + if (isSelected) { + ofSetColor(colorActive); + if (enableNewline) { + vector blocks; + blocks.emplace_back(ofxFontStash2::StyledText({ content.get().substr(0, indexPointer), style })); + vector lines; + font->layoutLines(blocks, getWidth(), lines, alignment, 0); + + int wLine = 0; + if (lines.size() > 0) { + wLine = lines.back().lineW; + if (lines.back().elements.size() > 0) { + wLine += lines.back().elements.front().x; + } + else if (alignment == OF_ALIGN_HORZ_CENTER) { + wLine = getWidth()*0.5; + } + else if (alignment == OF_ALIGN_HORZ_RIGHT) { + wLine = getWidth(); + } + } + float hCursor = font->getTextBounds("|", style, 0, 0).height; + + ofDrawRectangle(baseRect.x + wLine, -hCursor - baseRect.y + baseRect.height*(lines.size() - 1), 4, hCursor); + } + else { + auto indexRect = font->getTextBounds(content.get().substr(0, indexPointer), style, 0, 0); + ofDrawRectangle(baseRect.x + indexRect.width, 0, 4, getHeight()); + } + } + } void ofxInterface::TextInput::keyPressed(ofKeyEventArgs & e) { + if (isSelected) { if (e.key == 356) { // left if (indexPointer > 0) { indexPointer--; @@ -65,56 +107,78 @@ void ofxInterface::TextInput::keyPressed(ofKeyEventArgs & e) } } } + + if (e.key == 13) { // return + if (enableNewline) { + if (maxChars == 0 || maxChars > content.get().size()) { + string in = "\n"; + if (indexPointer < content->size()) { + content = content.toString().insert(indexPointer, in); + } + else { + content += in; + } + indexPointer += in.size(); + } + } + else { + string t = content.get(); + ofNotifyEvent(returnPressedEvent, t); + } + + } + else if (e.key >= 32 && e.key <= 252) { string in = ""; //only max characters allowed -if (maxChars == 0 || maxChars > content.get().size()) -{ - // number field only accepts numbers - if (e.key == 252) // ü - { - in += "ü"; - } - else if (e.key == 220) // Ü - { - in += "Ü"; - } - else if (e.key == 246) // ö - { - in += "ö"; - } - else if (e.key == 214) // Ö - { - in += "Ö"; - } - else if (e.key == 228) // ä - { - in += "ä"; - } - else if (e.key == 196) // ä - { - in += "Ä"; - } - else if (e.key == 223) // ß - { - in += "ß"; - } - else if (e.key == 8364) // € - { - in += "€"; - } - else { in += e.key; } + if (maxChars == 0 || maxChars > content.get().size()) + { + // number field only accepts numbers + if (e.key == 252) // ü + { + in += "ü"; + } + else if (e.key == 220) // Ü + { + in += "Ü"; + } + else if (e.key == 246) // ö + { + in += "ö"; + } + else if (e.key == 214) // Ö + { + in += "Ö"; + } + else if (e.key == 228) // ä + { + in += "ä"; + } + else if (e.key == 196) // ä + { + in += "Ä"; + } + else if (e.key == 223) // ß + { + in += "ß"; + } + else if (e.key == 8364) // € + { + in += "€"; + } + else { in += e.key; } - if (indexPointer < content->size()) { - content = content.toString().insert(indexPointer, in); - } - else { - content += in; - } - indexPointer += in.size(); -} + if (indexPointer < content->size()) { + content = content.toString().insert(indexPointer, in); + } + else { + content += in; + } + indexPointer += in.size(); + } } sendContentChanged(content); + } } string ofxInterface::TextInput::getContent() @@ -137,6 +201,43 @@ void ofxInterface::TextInput::onSetContent(string & content) sendContentChanged(content); } +void ofxInterface::TextInput::setSize(float w, float h) +{ + // resize font if external resizing + if (autoResize) { + float newFontSize = style.fontSize * (w/getWidth()); + style.fontSize = newFontSize; + styleInactive.fontSize = newFontSize; + resizeField(); + } + + // proceed font resizing + Node::setSize(w, h); +} + +void ofxInterface::TextInput::setSize(const ofVec2f & s) +{ + setSize(s.x, s.y); +} + +void ofxInterface::TextInput::setAlignment(ofAlignHorz alignment_) +{ + alignment = alignment_; +} + +void ofxInterface::TextInput::setFontId(string fontId) +{ + style.fontID = fontId; + styleInactive.fontID = fontId; + resizeField(); +} + +void ofxInterface::TextInput::setColor(ofColor main, ofColor inactive) +{ + style.color = main; + styleInactive.color = inactive; +} + void ofxInterface::TextInput::registerKeyInput(ofEvent& e) { ofAddListener(e, this, &TextInput::keyPressed); @@ -160,6 +261,11 @@ void ofxInterface::TextInput::onTouchMove(TouchEvent & event) void ofxInterface::TextInput::sendContentChanged(string content) { string send = content; + + if (autoResize) { + resizeField(); + } + ofNotifyEvent(contentChangedEvent, send); } @@ -182,3 +288,28 @@ void ofxInterface::TextInput::setIndexPosition(ofVec2f touch) indexPointer = iNew; } + +void ofxInterface::TextInput::resizeField() +{ + string text = content.get().size() > 0 ? content : descriptionText; + auto baseRect = font->getTextBounds("X", style, 0, 0); + float dy = -baseRect.y - baseRect.height*0.75; + + if (enableNewline) { + dy = -baseRect.y; + } + + int w = 0; + auto lines = ofSplitString(text, "\n"); + for (auto& line : lines) { + float wt = font->getTextBounds(line, style, 0, 0).width; + if (wt > w) { + w = wt; + } + } + + + + // use parent function, since class function is to be resizing font as well + Node::setSize(w + 1, dy + lines.size()*baseRect.height); +} diff --git a/src/components/TextInput.h b/src/components/TextInput.h index 39f7925..82fc5af 100644 --- a/src/components/TextInput.h +++ b/src/components/TextInput.h @@ -11,11 +11,17 @@ namespace ofxInterface { int maxChars = 30; string descriptionText; + bool enableNewline = false; + ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + + bool autoResize = false; + }; class TextInput : public ModalElement { public: + void setup(TextInputSettings settings); virtual void draw() override; @@ -23,8 +29,16 @@ namespace ofxInterface { string getContent(); void setContent(string content); void onSetContent(string& content); + + void setSize(float w, float h) override; + virtual void setSize(const ofVec2f& s) override; + + void setAlignment(ofAlignHorz alignment); + void setFontId(string fontId); + void setColor(ofColor main, ofColor inactive); ofEvent contentChangedEvent; + ofEvent returnPressedEvent; void registerKeyInput(ofEvent & e); void unregisterKeyInput(ofEvent & e); @@ -45,10 +59,12 @@ namespace ofxInterface { protected: void sendContentChanged(string content); void setIndexPosition(ofVec2f touch); + void resizeField(); shared_ptr font; ofxFontStash2::Style style; ofxFontStash2::Style styleInactive; + ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; ofParameter content; string descriptionText; @@ -56,9 +72,10 @@ namespace ofxInterface { bool isNumberField; int maxChars; + bool enableNewline; + bool autoResize; private: - }; } \ No newline at end of file diff --git a/src/components/TextureNode.cpp b/src/components/TextureNode.cpp index 9a1975b..67cb580 100644 --- a/src/components/TextureNode.cpp +++ b/src/components/TextureNode.cpp @@ -11,6 +11,12 @@ namespace ofxInterface { { } + Node * TextureNode::clone() + { + auto ret = new Node(*this); + return ret; + } + void TextureNode::setup(ofTexture& texture) { setTexture(texture); @@ -31,8 +37,6 @@ namespace ofxInterface { void TextureNode::draw() { - - if (texture.isAllocated()) { if (hardShadowBlend) { @@ -54,12 +58,11 @@ namespace ofxInterface { switch (scaleMode) { case OF_SCALEMODE_FIT: texCoordst.scaleTo(dimensionsT, OF_SCALEMODE_FIT); - dimensionsT = texCoordst; + dimensions = texCoordst; break; case OF_SCALEMODE_FILL: dimensionsT.scaleTo(texCoords, OF_SCALEMODE_FIT); texCoords = dimensionsT; - dimensionsT = dimensions; break; case OF_SCALEMODE_CENTER: break; diff --git a/src/components/TextureNode.h b/src/components/TextureNode.h index f908a89..5b17c3e 100644 --- a/src/components/TextureNode.h +++ b/src/components/TextureNode.h @@ -16,6 +16,7 @@ namespace ofxInterface { public: TextureNode(); ~TextureNode(); + virtual Node* clone() override; void setup(ofTexture& texture); void setup(TextureNodeSettings settings); From 7769c2208ca3b65e4b89fd396a4ab2da502e3a2d Mon Sep 17 00:00:00 2001 From: Brian Eschrich Date: Tue, 8 Sep 2020 13:17:12 +0200 Subject: [PATCH 8/9] slider added, GuiFactory updated, node click debug --- components.drawio | 1 + components.md | 18 ++++- components.png | Bin 9626 -> 10449 bytes src/AnimatableNode.cpp | 9 +-- src/GuiFactory.cpp | 164 +++++++++++++++++++++++++++++++------- src/GuiFactory.h | 9 ++- src/Node.cpp | 4 +- src/Node.h | 1 - src/components/Slider.cpp | 110 +++++++++++++++++++++++++ src/components/Slider.h | 47 +++++++++++ 10 files changed, 319 insertions(+), 44 deletions(-) create mode 100644 components.drawio create mode 100644 src/components/Slider.cpp create mode 100644 src/components/Slider.h diff --git a/components.drawio b/components.drawio new file mode 100644 index 0000000..a9c1ee2 --- /dev/null +++ b/components.drawio @@ -0,0 +1 @@ +7ZpNU9swEIZ/TY7t+CtfxxJCSwsMM2mHclTiJTYoXo8ik5hfXxlLsRWFGBoc+5AT1nplye/uI8lLOu5osf7OSBxcow+041j+uuOedxzHsXqO+JNZ0txi246bW+Ys9KWtMEzCF5BGS1qT0Iel5sgRKQ9j3TjDKIIZ12yEMVzpbg9I9VFjMgfDMJkRalrvQp8HuXXg9Av7DwjngRrZ7g3zOwuinOWbLAPi46pkcscdd8QQeX61WI+AZuopXfJ+F2/c3UyMQcTf0+H+5/z6xud/LvE8PCOPtv3ij7/IYDwTmsgXlpPlqVIAfCGIbCLjAc4xInRcWM8YJpEP2TCWaBU+V4ixMNrC+AicpzK6JOEoTAFfUHkXIv9bFivRjDCC3HIRUiofueSEceUxpTh7UsaSUz7xbLZvCiRNS0zYDPaoohKNsDnwPX7OJowCAMAFcJaKfgwo4eGzPg8iE3G+8StiJS5kuD4QOtsIHT7cCACNAOrhWQUhh0lMXgVYCWr1UMiHAuOw3q+j+d6yg6e6KOYtScCqAMhWVAQleHpWTVI5hlQ7haqQRtfxEKGkMJuloSTMsHdMYbqtwF/DWy4A23SXlgi1AOhrxCfi7x0J/9eu4q1IWnKIMYz4svTk28xQ0KVyQeXQcGvV/5C7uMjHL1Jo8yL/n1WekVUjpMhuSZSdDppanaQC7g7ojrsa9U7Q7VCl/xkwGenvWPpe5Ay2oppDLnsVgf0olcY4FVhW+NfDZd9IvN+w5gmDVhwbbE+XpHlQBydQd6gyrAVU1zsOqMY4FaBW+NcD6tBIvCsybXLvVKvWoG2IqjLBiVFdljfieCCk3uA4kBrjVEBa4V8PpLb5AX6NfkJhTGEBUoA2fYe3gFa3CTiFXCz9m/X/2lXN+/K98/UG0ayVdnZUndoAtVzaKr9LD6b/sCCb1ZbsmHkZxUnzTLhd/XvYcxtnotsIE+uQl5AQrXuV0eK6ACJrtJYHr6ZNTk8R952b3KftK2b5ZBIuYgqjAGZPwBpnyBu2jqFTSWWnLPXUVHqOHv+6ToHGOFWlzv3+NZ0CzaLKZMaQUjIVxGLESRi1gNnuVh24BWfBU3Vlpyz1lFf62/8HqIlZY5wKZiv8a2LWrK9M8IH/gnSKhPmNw9q32garGuwEqy5LPWWWoXUcWI1xKmCt8K8HVscss0xo6LdgTx14x8NUNItfCuXSFj+4csf/AA== \ No newline at end of file diff --git a/components.md b/components.md index 821705d..6f3c8f7 100644 --- a/components.md +++ b/components.md @@ -124,4 +124,20 @@ Inherits from Node. Height of Element depends on width and is automatically set. | borderRadius | float | border radius (also effects keys)| | borderWidth | float | border width (also effects keys)| | margin | float | space between border and keys| -| padding | float | space between keys| \ No newline at end of file +| padding | float | space between keys| + + +### TextureNode + +A simple Slider. + +Inherits from Node. + +| property | type | description | +| ------------- |---------------| -----| +| direction | string | "horizontal", "vertical" | +| colorActive | ofColor | key background color when enabled| +| colorInactive | ofColor | key background color when disabled| +| colorSelected | ofColor | key background color when selected| +| colorSelected | ofColor | key background color when selected| +| lineWidth | int | thickness of the bar| \ No newline at end of file diff --git a/components.png b/components.png index af5902dd2d241fbe33941e6b4ae6041e716060ed..baa8657533b2a6d10d72ec361355790a7f03c6a1 100644 GIT binary patch literal 10449 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 diff --git a/src/AnimatableNode.cpp b/src/AnimatableNode.cpp index dad683c..721d4c0 100644 --- a/src/AnimatableNode.cpp +++ b/src/AnimatableNode.cpp @@ -66,8 +66,7 @@ void AnimatableNode::update(float dt) setPosition(nodePositionAnimation.source.getInterpolated(nodePositionAnimation.target, prog)); if (nodePositionAnimation.progress >= nodePositionAnimation.delay+nodePositionAnimation.duration) { nodePositionAnimation.bActive = false; - function f = nodePositionAnimation.onEnd; - f(); + nodePositionAnimation.onEnd(); } } @@ -80,8 +79,7 @@ void AnimatableNode::update(float dt) *anim.second.color = anim.second.source.getLerped(anim.second.target, prog); if (anim.second.progress >= anim.second.delay+anim.second.duration) { rmcolor.push_back(anim.first); - function f = anim.second.onEnd; - f(); + anim.second.onEnd(); } } // go over again and remove completed animations @@ -100,8 +98,7 @@ void AnimatableNode::update(float dt) *anim.second.value = ofMap(prog, 0, 1, anim.second.source, anim.second.target, true); if (anim.second.progress >= anim.second.delay+anim.second.duration) { rmfloat.push_back(anim.first); - function f = anim.second.onEnd; - f(); + anim.second.onEnd(); } } // go over again and remove completed animations diff --git a/src/GuiFactory.cpp b/src/GuiFactory.cpp index 3d6cf60..0482801 100644 --- a/src/GuiFactory.cpp +++ b/src/GuiFactory.cpp @@ -22,13 +22,18 @@ namespace ofxInterface } // init font styles + float fontScale = 1.5; + if (!config["fontScale"].is_null()) { + fontScale = config["fontScale"].get(); + } if (!config["fontStyles"].is_null()) { for (auto& font : config["fontStyles"]) { ofxFontStash2::Style style; style.fontID = font["fontId"].get(); - style.fontSize = font["fontSize"].get() * 1.5; + style.fontSize = font["fontSize"].get()*fontScale; style.color = colors[font["color"].get()]; if (!font["lineHeight"].is_null()) style.lineHeightMult = font["lineHeight"].get(); + if (!font["spacing"].is_null()) style.spacing = font["spacing"].get(); assets->getFonts()->addStyle(font["name"].get(), style); } @@ -55,6 +60,7 @@ namespace ofxInterface registerCreationFunction("simpleChecker", [this](ofJson config, ofJson style) {return this->getSimpleChecker(config, style); }); registerCreationFunction("softKeyboard", [this](ofJson config, ofJson style) {return this->getSoftKeyboard(config, style); }); registerCreationFunction("textInput", [this](ofJson config, ofJson style) {return this->getTextInput(config, style); }); + registerCreationFunction("slider", [this](ofJson config, ofJson style) {return this->getSlider(config, style); }); } ///\brief create all GUI elements from json and add them to parent node @@ -72,7 +78,16 @@ namespace ofxInterface } Node * GuiFactory::getElement(ofJson config) { - ofJson styleConfig = getStyle(config["class"].get()); + + // usinf "node" if no class specified + string className; + if (config["class"].is_null()) { + className = "node"; + } + else { + className = config["class"].get(); + } + ofJson styleConfig = getStyle(className); if (styleConfig["id"] != "#error") { string elemClass = styleConfig["class"].get(); @@ -195,36 +210,8 @@ namespace ofxInterface Node * GuiFactory::getTextureNode(ofJson config, ofJson style) { TextureNodeSettings s; - readNodeSettings(s,config,style); + readTextureSettings(s,config,style); TextureNode* tex = new TextureNode(); - - if (hasValue("texture", config, style)) { - s.texture = assets->getTexture(getValue("texture", config, style)); - if (!hasValue("size", config, style)) { - s.size = ofVec2f(assets->getTexture(getValue("texture", config, style)).getWidth(), - assets->getTexture(getValue("texture", config, style)).getHeight()); - } - } - if (hasValue("tint", config, style)) { - s.tinting = colors[getValue("tint", config, style)]; - } - - if (hasValue("blendmode", config, style)) { - string al = getValue("blendmode", config, style); - if (al == "alpha") { - s.blendmode = OF_BLENDMODE_ALPHA; - } else if (al == "none") { - s.blendmode = OF_BLENDMODE_DISABLED; - } else if (al == "add") { - s.blendmode = OF_BLENDMODE_ADD; - } else if (al == "multiply") { - s.blendmode = OF_BLENDMODE_MULTIPLY; - } else if (al == "screen") { - s.blendmode = OF_BLENDMODE_SCREEN; - } else if (al == "subtract") { - s.blendmode = OF_BLENDMODE_SUBTRACT; - } - } tex->setup(s); return tex; } @@ -282,6 +269,9 @@ namespace ofxInterface if (hasValue("padding", config, style)) { settings.padding = getValue("padding", config, style); } + if (hasValue("layout", config, style)) { + settings.layout = getValue("layout", config, style); + } ret->setup(settings); return ret; @@ -303,12 +293,71 @@ namespace ofxInterface if (hasValue("description", config, style)) { settings.descriptionText = getValue("description", config, style); } + if (hasValue("enableNewline", config, style)) { + settings.enableNewline = getValue("enableNewline", config, style); + } + + if (hasValue("alignment", config, style)) { + if (getValue("alignment", config, style) == "center") { + settings.alignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; + } + else if (getValue("alignment", config, style) == "right") { + settings.alignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; + } + } + + if (hasValue("autoResize", config, style)) { + settings.autoResize = getValue("autoResize", config, style); + } TextInput* t = new TextInput(); t->setup(settings); return t; } + Node * GuiFactory::getSlider(ofJson config, ofJson style) + { + SliderSettings settings; + readNodeSettings(settings, config, style); + + if (hasValue("direction", config, style)) { + string val = getValue("direction", config, style); + if (val == "HORIZONTAL") { + settings.direction = HORIZONTAL; + } + else if (val == "VERTICAL") { + settings.direction = VERTICAL; + } + } + if (hasValue("colorActive", config, style)) { + settings.colorActive = colors[getValue("colorActive", config, style)]; + } + if (hasValue("colorInactive", config, style)) { + settings.colorInactive = colors[getValue("colorInactive", config, style)]; + } + if (hasValue("colorSelected", config, style)) { + settings.colorSelected = colors[getValue("colorSelected", config, style)]; + } + + if (hasValue("lineWidth", config, style)) { + settings.lineWidth = getValue("lineWidth", config, style); + } + + Slider* ret = new Slider(); + ret->setup(settings); + return ret; + } + + ofJson GuiFactory::getTemplate(string templateId) + { + for (auto& elem:styles){ + if (elem["id"].get() == templateId) { + return elem; + } + } + return ofJson{ {"error","style not found"} }; + } + ofJson GuiFactory::getStyle(string id) { for (auto& s : styles) { if (s["id"] == id) { @@ -401,6 +450,59 @@ namespace ofxInterface } } + void GuiFactory::readTextureSettings(TextureNodeSettings & settings, ofJson config, ofJson style) + { + readNodeSettings(settings, config, style); + + if (hasValue("texture", config, style)) { + settings.texture = assets->getTexture(getValue("texture", config, style)); + if (!hasValue("size", config, style)) { + settings.size = ofVec2f(assets->getTexture(getValue("texture", config, style)).getWidth(), + assets->getTexture(getValue("texture", config, style)).getHeight()); + } + } + if (hasValue("tint", config, style)) { + settings.tinting = colors[getValue("tint", config, style)]; + } + if (hasValue("scaleMode", config, style)) { + string al = getValue("scaleMode", config, style); + if (al == "fill") { + settings.scaleMode = OF_SCALEMODE_FILL; + } + else if (al == "fit") { + settings.scaleMode = OF_SCALEMODE_FIT; + } + else if (al == "center") { + settings.scaleMode = OF_SCALEMODE_CENTER; + } + else if (al == "stretch") { + settings.scaleMode = OF_SCALEMODE_STRETCH_TO_FILL; + } + } + + if (hasValue("blendmode", config, style)) { + string al = getValue("blendmode", config, style); + if (al == "alpha") { + settings.blendmode = OF_BLENDMODE_ALPHA; + } + else if (al == "none") { + settings.blendmode = OF_BLENDMODE_DISABLED; + } + else if (al == "add") { + settings.blendmode = OF_BLENDMODE_ADD; + } + else if (al == "multiply") { + settings.blendmode = OF_BLENDMODE_MULTIPLY; + } + else if (al == "screen") { + settings.blendmode = OF_BLENDMODE_SCREEN; + } + else if (al == "subtract") { + settings.blendmode = OF_BLENDMODE_SUBTRACT; + } + } + } + ofColor GuiFactory::colorFromJson(ofJson val) { switch (val.size()) { case 1: diff --git a/src/GuiFactory.h b/src/GuiFactory.h index fd7a11e..1d3b702 100644 --- a/src/GuiFactory.h +++ b/src/GuiFactory.h @@ -10,6 +10,7 @@ #include "SimpleChecker.h" #include "SoftKeyboard.h" #include "TextInput.h" +#include "Slider.h" #define DEBUG(X) if(isDebug) ofLogNotice() << X @@ -52,9 +53,10 @@ namespace ofxInterface Node* getSimpleChecker(ofJson config, ofJson style); Node* getSoftKeyboard(ofJson config, ofJson style); Node* getTextInput(ofJson config, ofJson style); - + Node* getSlider(ofJson config, ofJson style); + + ofJson getTemplate(string templateId); - protected: // -- Helper functions -- // ofJson getStyle(string id); @@ -76,11 +78,12 @@ namespace ofxInterface void readModalElementSettings(ModalElementSettings& settings, ofJson config, ofJson style); void readScrollableContainerSettings(ScrollableContainerSettings& settings, ofJson config, ofJson style); void readColorpanelSettings(ColorPanelSettings& settings, ofJson config, ofJson style); + void readTextureSettings(TextureNodeSettings& settings, ofJson config, ofJson style); // -- variables -- // shared_ptr assets; map colors; - bool isDebug = true; + bool isDebug = false; diff --git a/src/Node.cpp b/src/Node.cpp index 73e965f..442e7bb 100644 --- a/src/Node.cpp +++ b/src/Node.cpp @@ -525,8 +525,8 @@ void Node::touchMove(int id, TouchEvent* event) if (bNodeAllowOneTouch && id != nodeCurrentTouchId) { return; } - - if (event->velocitySmoothed.length() > 20) { + + if (event->velocitySmoothed.length() > 200) { isClickAllowed = false; } diff --git a/src/Node.h b/src/Node.h index 2aabbc2..7d70969 100644 --- a/src/Node.h +++ b/src/Node.h @@ -22,7 +22,6 @@ namespace ofxInterface { - struct NodeSettings { string name; ofVec2f position; diff --git a/src/components/Slider.cpp b/src/components/Slider.cpp new file mode 100644 index 0000000..da63750 --- /dev/null +++ b/src/components/Slider.cpp @@ -0,0 +1,110 @@ +#include "Slider.h" + + +namespace ofxInterface { + Slider::Slider() + { + ofAddListener(eventTouchMove, this, &Slider::onTouchMove, 100); + ofAddListener(eventTouchDown, this, &Slider::onTouchDown, 100); + //ofAddListener(eventTouchUp, this, &Slider::onTouchUp, 100); + value.set("value", 0, 0, 1); + } + + Slider::Slider(const Slider & mom) : Node(mom) + { + colorActive = mom.colorActive; + colorSelected = mom.colorSelected; + lineWidth = mom.lineWidth; + colorInactive = mom.colorInactive; + direction = mom.direction; + value = mom.value; + ofAddListener(eventTouchMove, this, &Slider::onTouchMove, 100); + ofAddListener(eventTouchDown, this, &Slider::onTouchDown, 100); + } + + + Slider::~Slider() + { + } + + Node * Slider::clone() + { + return new Slider(*this); + } + + void Slider::setup(SliderSettings s) + { + Node::setup(s); + colorActive = s.colorActive; + colorSelected = s.colorSelected; + lineWidth = s.lineWidth; + colorInactive = s.colorInactive; + direction = s.direction; + } + + void Slider::draw() + { + float lActive; + float lInactive; + + ofRectangle rActive; + ofRectangle rInactive; + + if (direction == HORIZONTAL) { + lActive = ofMap(value, value.getMin(), value.getMax(), 0, getWidth(), true); + lInactive = getWidth() - lActive; + rActive = ofRectangle(0, 0.5*(getHeight() - lineWidth), lActive, lineWidth); + rInactive = ofRectangle(lActive, 0.5*(getHeight() - lineWidth), lInactive, lineWidth); + }else { + lActive = ofMap(value, value.getMin(), value.getMax(), 0, getHeight(), true); + lInactive = getHeight() - lActive; + rActive = ofRectangle(0.5*(getWidth() - lineWidth),0, lineWidth, lActive ); + rInactive = ofRectangle(0.5*(getWidth() - lineWidth),lActive, lineWidth,lInactive); + } + + ofSetColor(colorSelected); + ofDrawRectangle(rActive); + ofSetColor(colorInactive); + ofDrawRectangle(rInactive); + ofSetColor(colorActive); + ofDrawCircle(rInactive.x, rInactive.y, 0.5*getHeight()); + } + + void Slider::onTouchDown(TouchEvent & e) { + if (direction == HORIZONTAL) { + value = ofMap(toLocal(e.position).x, 0, getWidth(), value.getMin(), value.getMax(), true); + } + else { + value = ofMap(toLocal(e.position).y, 0, getHeight(), value.getMin(), value.getMax(), true); + } + + } + + void Slider::onTouchMove(TouchEvent & e) + { + if (direction == HORIZONTAL) { + value = ofMap(toLocal(e.position).x, 0, getWidth(), value.getMin(), value.getMax(), true); + } + else { + value = ofMap(toLocal(e.position).y, 0, getHeight(), value.getMin(), value.getMax(), true); + } + } + + void Slider::setDirection(Direction type) + { + direction = type; + } + + Direction Slider::getDirection() + { + return direction; + } + + /*void Slider::onTouchUp(TouchEvent & e) { + if (type == BUTTON) { + isSelected = false; + } + }*/ + + +} \ No newline at end of file diff --git a/src/components/Slider.h b/src/components/Slider.h new file mode 100644 index 0000000..aba5e59 --- /dev/null +++ b/src/components/Slider.h @@ -0,0 +1,47 @@ +#pragma once +#include "Node.h" + +namespace ofxInterface { + enum Direction { + HORIZONTAL, + VERTICAL + }; + + struct SliderSettings : NodeSettings{ + Direction direction = HORIZONTAL; + ofColor colorActive = ofColor(200); + ofColor colorSelected = ofColor(100); + ofColor colorInactive = ofColor(50); + int lineWidth = 6; + }; + + class Slider : public Node + { + public: + Slider(); + Slider(const Slider& mom); + ~Slider(); + + virtual Node* clone() override; + + void setup(SliderSettings s); + virtual void draw(); + + void onTouchDown(TouchEvent& e); + //void onTouchUp(TouchEvent& e); + void onTouchMove(TouchEvent& e); + + void setDirection(Direction type); + Direction getDirection(); + + ofColor colorActive; + ofColor colorSelected; + ofColor colorInactive; + + ofParameter value; + + private: + Direction direction; + int lineWidth; + }; +} From 5069c488a3de34db673762185537c1cf371ae2ec Mon Sep 17 00:00:00 2001 From: brino aus rino Date: Thu, 20 Apr 2023 15:10:46 +0200 Subject: [PATCH 9/9] basically updated all components + json export --- src/GuiFactory.cpp | 270 ++++++++++++++++++------- src/GuiFactory.h | 9 +- src/Node.cpp | 173 +++++++++++++--- src/Node.h | 47 ++++- src/NodeToJsonHelper.cpp | 84 ++++++++ src/NodeToJsonHelper.h | 11 + src/components/ColorPanel.cpp | 182 ++++++++++++++--- src/components/ColorPanel.h | 26 ++- src/components/Label.cpp | 32 ++- src/components/Label.h | 8 +- src/components/ModalElement.cpp | 24 +++ src/components/ModalElement.h | 2 + src/components/ScrollableContainer.cpp | 198 ++++++++++++++---- src/components/ScrollableContainer.h | 16 +- src/components/SoftKeyboard.cpp | 68 +++++-- src/components/SoftKeyboard.h | 4 + src/components/SoftKeyboardKey.cpp | 64 +++--- src/components/SoftKeyboardKey.h | 6 + src/components/TextField.cpp | 32 ++- src/components/TextField.h | 8 +- src/components/TextInput.cpp | 67 ++++-- src/components/TextInput.h | 25 ++- src/components/TextureNode.cpp | 47 +++-- src/components/TextureNode.h | 16 +- src/effects/EffectDropShadow.cpp | 99 +++++++++ src/effects/EffectDropShadow.h | 39 ++++ src/effects/EffectDropShadowShader.h | 78 +++++++ src/effects/GradientShader.cpp | 250 +++++++++++++++++++++++ src/effects/GradientShader.h | 12 ++ 29 files changed, 1626 insertions(+), 271 deletions(-) create mode 100644 src/NodeToJsonHelper.cpp create mode 100644 src/NodeToJsonHelper.h create mode 100644 src/effects/EffectDropShadow.cpp create mode 100644 src/effects/EffectDropShadow.h create mode 100644 src/effects/EffectDropShadowShader.h create mode 100644 src/effects/GradientShader.cpp create mode 100644 src/effects/GradientShader.h diff --git a/src/GuiFactory.cpp b/src/GuiFactory.cpp index 0482801..61d2631 100644 --- a/src/GuiFactory.cpp +++ b/src/GuiFactory.cpp @@ -15,13 +15,20 @@ namespace ofxInterface // init colors if (!config["colors"].is_null()) { for (auto& color : config["colors"]) { - colors.insert(pair(color["id"].get(), colorFromJson(color["color"]))); + colors.insert(pair(color["id"].get(), colorFromJson(color["color"],colors))); + + } }else { ofLogError("GuiFactory::setup", "no font colors defined, gui elements will use predefined ones"); } // init font styles + + // disable logging each font that is loaded + auto currentLogLevel = ofGetLogLevel(); + ofSetLogLevel(OF_LOG_ERROR); + float fontScale = 1.5; if (!config["fontScale"].is_null()) { fontScale = config["fontScale"].get(); @@ -40,6 +47,7 @@ namespace ofxInterface } else { ofLogError("GuiFactory::setup", "no font styles defined, gui elements using fonts won't be available" ); } + ofSetLogLevel(currentLogLevel); // init elements if (!config["elements"].is_null()) { @@ -51,6 +59,7 @@ namespace ofxInterface // register creation functions registerCreationFunction("node", [this](ofJson config, ofJson style) {return this->getNode(config, style); }); + registerCreationFunction("canvas", [this](ofJson config, ofJson style) {return this->getNode(config, style); }); registerCreationFunction("label", [this](ofJson config, ofJson style) {return this->getLabel(config, style); }); registerCreationFunction("textField", [this](ofJson config, ofJson style) {return this->getTextField(config, style); }); registerCreationFunction("colorPanel", [this](ofJson config, ofJson style) {return this->getColorPanel(config, style); }); @@ -91,7 +100,7 @@ namespace ofxInterface if (styleConfig["id"] != "#error") { string elemClass = styleConfig["class"].get(); - DEBUG("create element : " << config["id"].get() << " ( " << elemClass << " -> " << styleConfig["id"].get() << " )"); + ofLogVerbose() <<"create element : " << config["id"].get() << " ( " << elemClass << " -> " << styleConfig["id"].get() << " )"; Node* ret = nullptr; if (creationTable.find(elemClass) != creationTable.end()) { ret = (this->creationTable[elemClass])(config, styleConfig); @@ -127,9 +136,9 @@ namespace ofxInterface if (hasValue("alignment", config, style)) { if (getValue("alignment", config, style) == "center") { - s.alignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; + s.horzAlignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; } else if (getValue("alignment", config, style) == "right") { - s.alignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; + s.horzAlignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; } } @@ -174,11 +183,11 @@ namespace ofxInterface if (hasValue("alignment", config, style)) { string al = getValue("alignment", config, style); if (al == "left") { - s.alignment = ofAlignHorz::OF_ALIGN_HORZ_LEFT; + s.horzAlignment = ofAlignHorz::OF_ALIGN_HORZ_LEFT; } else if (al == "right") { - s.alignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; + s.horzAlignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; } else if (al == "center") { - s.alignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; + s.horzAlignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; } } @@ -272,6 +281,20 @@ namespace ofxInterface if (hasValue("layout", config, style)) { settings.layout = getValue("layout", config, style); } + if (hasValue("textureKeys", config, style)) { + ofJson mapping; + if (config["textureKeys"] != nullptr) { + mapping = config["textureKeys"]; + } + else if (style["textureKeys"] != nullptr) { + mapping = style["textureKeys"]; + } + + for (auto& entry:mapping.items()) + { + settings.textureKeys.insert(make_pair(ofToInt(entry.key()), assets->getTexture(entry.value().get()))); + } + } ret->setup(settings); return ret; @@ -280,35 +303,8 @@ namespace ofxInterface Node * GuiFactory::getTextInput(ofJson config, ofJson style) { TextInputSettings settings; - readModalElementSettings(settings,config,style); - - settings.font = assets->getFonts(); - if (hasValue("font", config, style)) { - settings.style = assets->getFonts()->getStyle(getValue("font", config, style)); - } - - if (hasValue("maxChars", config, style)) { - settings.maxChars = getValue("maxChars", config, style); - } - if (hasValue("description", config, style)) { - settings.descriptionText = getValue("description", config, style); - } - if (hasValue("enableNewline", config, style)) { - settings.enableNewline = getValue("enableNewline", config, style); - } - - if (hasValue("alignment", config, style)) { - if (getValue("alignment", config, style) == "center") { - settings.alignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; - } - else if (getValue("alignment", config, style) == "right") { - settings.alignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; - } - } - - if (hasValue("autoResize", config, style)) { - settings.autoResize = getValue("autoResize", config, style); - } + readTextInputSettings(settings, config, style); + TextInput* t = new TextInput(); t->setup(settings); @@ -321,7 +317,7 @@ namespace ofxInterface readNodeSettings(settings, config, style); if (hasValue("direction", config, style)) { - string val = getValue("direction", config, style); + string val = ofToUpper(getValue("direction", config, style)); if (val == "HORIZONTAL") { settings.direction = HORIZONTAL; } @@ -371,6 +367,7 @@ namespace ofxInterface return ofJson({ {"id","#error"} }); } void GuiFactory::readNodeSettings(NodeSettings & settings, ofJson config, ofJson style) { + readEffectSettings(settings, config, style); settings.name = config["id"].get(); if (hasValue("position", config, style)) { settings.position = vec2fFromJson(getValue("position", config, style)); @@ -443,11 +440,33 @@ namespace ofxInterface settings.borderRadius = getValue("borderRadius", config, style); } if (hasValue("color", config, style)) { - settings.bgColor = colors[getValue("color", config, style)]; + if (getValueType("color", config, style) == "array") { + auto cs = config["color"] == nullptr ? style["color"] : config["color"]; + settings.colors.clear(); + for (auto& c : cs) { + settings.colors.push_back(colors[c.get()]); + } + } + else { + settings.colors.front() = colors[getValue("color", config, style)]; + } } if (hasValue("strokeColor", config, style)) { settings.strokeColor = colors[getValue("strokeColor", config, style)]; } + if (hasValue("gradientDirection", config, style)) { + settings.gradientDirection = getValue("gradientDirection", config, style); + } + if (hasValue("gradientColorPositions", config, style)) { + auto gs = config["gradientColorPositions"] == nullptr ? style["gradientColorPositions"] : config["gradientColorPositions"]; + settings.gradientColorPositions.clear(); + for (auto& g : gs) { + settings.colors.push_back(g.get()); + } + } + + + vector gradientColorPositions; } void GuiFactory::readTextureSettings(TextureNodeSettings & settings, ofJson config, ofJson style) @@ -480,6 +499,32 @@ namespace ofxInterface } } + if (hasValue("verticalAlign", config, style)) { + string al = getValue("verticalAlign", config, style); + if (al == "top") { + settings.verticalAlign = OF_ALIGN_VERT_TOP; + } + else if (al == "bottom") { + settings.verticalAlign = OF_ALIGN_VERT_BOTTOM; + } + else if (al == "center") { + settings.verticalAlign = OF_ALIGN_VERT_CENTER; + } + } + + if (hasValue("horizontalAlign", config, style)) { + string al = getValue("horizontalAlign", config, style); + if (al == "left") { + settings.horizontalAlign = OF_ALIGN_HORZ_LEFT; + } + else if (al == "right") { + settings.horizontalAlign = OF_ALIGN_HORZ_RIGHT; + } + else if (al == "center") { + settings.horizontalAlign = OF_ALIGN_HORZ_CENTER; + } + } + if (hasValue("blendmode", config, style)) { string al = getValue("blendmode", config, style); if (al == "alpha") { @@ -503,40 +548,118 @@ namespace ofxInterface } } - ofColor GuiFactory::colorFromJson(ofJson val) { - switch (val.size()) { - case 1: - // interprete string - if (val.is_string()) { + void GuiFactory::readTextInputSettings(TextInputSettings& settings, ofJson config, ofJson style) + { + readModalElementSettings(settings, config, style); - if (ofIsStringInString(val.get(), ".")) { - ofParameter pTemp; - pTemp.fromString(val); - return pTemp.get(); - } else { - ofParameter pTemp; - pTemp.fromString(val); - return pTemp.get(); + settings.font = assets->getFonts(); + if (hasValue("font", config, style)) { + settings.style = assets->getFonts()->getStyle(getValue("font", config, style)); + } + + if (hasValue("maxChars", config, style)) { + settings.maxChars = getValue("maxChars", config, style); + } + if (hasValue("description", config, style)) { + settings.descriptionText = getValue("description", config, style); + } + if (hasValue("enableNewline", config, style)) { + settings.enableNewline = getValue("enableNewline", config, style); + } + + if (hasValue("alignment", config, style)) { + if (getValue("alignment", config, style) == "center") { + settings.horzAlignment = ofAlignHorz::OF_ALIGN_HORZ_CENTER; + } + else if (getValue("alignment", config, style) == "right") { + settings.horzAlignment = ofAlignHorz::OF_ALIGN_HORZ_RIGHT; + } + } + + if (hasValue("autoResize", config, style)) { + settings.autoResize = getValue("autoResize", config, style); + } + } + + void GuiFactory::readEffectSettings(NodeSettings& settings, ofJson config, ofJson style) + { + if (hasValue("nodeEffects", config, style)) { + if (hasValue("shadow", config["nodeEffects"], style["nodeEffects"])) { + if (hasValue("color", config["nodeEffects"]["shadow"], style["nodeEffects"]["shadow"])) { + settings.effects.dropShadow.color = colors[getValue("color", config["nodeEffects"]["shadow"], style["nodeEffects"]["shadow"])]; + } + if (hasValue("size", config["nodeEffects"]["shadow"], style["nodeEffects"]["shadow"])) { + settings.effects.dropShadow.size = getValue("size", config["nodeEffects"]["shadow"], style["nodeEffects"]["shadow"]); + } + if (hasValue("position", config["nodeEffects"]["shadow"], style["nodeEffects"]["shadow"])) { + settings.effects.dropShadow.position = vec2fFromJson(getValue("position", config["nodeEffects"]["shadow"], style["nodeEffects"]["shadow"])); } - }// interprete array - else - return ofColor(val[0].get()); + } + } - break; - case 2: - return ofColor(val[0], val[0], val[0], val[1]); - break; - case 3: - return ofColor(val[0], val[1], val[2]); - break; - case 4: - return ofColor(val[0], val[1], val[2], val[3]); - break; - default: - return ofColor(); - break; + } + + ofColor GuiFactory::colorFromJson(ofJson val, map colors) { + if (val.is_string()) { // read ofParam + if (ofIsStringInString(val.get(), ".")) { + ofParameter pTemp; + pTemp.fromString(val); + return pTemp.get(); + } + else { + ofParameter pTemp; + pTemp.fromString(val); + return pTemp.get(); + } } + else if (val.is_array()) { // read as rgba array + switch (val.size()) { + case 1: + return ofColor(val[0].get()); + break; + case 2: + return ofColor(val[0], val[0], val[0], val[1]); + break; + case 3: + return ofColor(val[0], val[1], val[2]); + break; + case 4: + return ofColor(val[0], val[1], val[2], val[3]); + break; + default: + return ofColor(); + break; + } + } + else if(val.is_object()) + { + ofColor base; + if (val["base"].is_null()) { + ofLogError("no base Color defined"); + } + else { + if (colors.find(val["base"].get()) != colors.end()) { + base = colors[val["base"].get()]; + } + if (!val["r"].is_null()) { + base.r = val["r"].get(); + } + if (!val["g"].is_null()) { + base.g = val["g"].get(); + } + if (!val["b"].is_null()) { + base.b = val["b"].get(); + } + if (!val["a"].is_null()) { + base.a = val["a"].get(); + } + + } + + return base; + } + return ofColor(); } ofVec2f GuiFactory::vec2fFromJson(ofJson val) { @@ -617,6 +740,17 @@ namespace ofxInterface } return false; } + string GuiFactory::getValueType(string valueName, ofJson config, ofJson style) + { + string ret = "null"; + if (config[valueName] != nullptr) { + ret = config[valueName].type_name(); + } + else if (style[valueName] != nullptr) { + ret = style[valueName].type_name(); + } + return ret; + } ///\brief register a creation function /// /// since it is not self-explanatory, here you have an example (using a lamda function) @@ -632,4 +766,4 @@ namespace ofxInterface } -} \ No newline at end of file +} diff --git a/src/GuiFactory.h b/src/GuiFactory.h index 1d3b702..5f9f2be 100644 --- a/src/GuiFactory.h +++ b/src/GuiFactory.h @@ -13,9 +13,6 @@ #include "Slider.h" -#define DEBUG(X) if(isDebug) ofLogNotice() << X - - ///\brief defines a function for creating gui elements /// /// since it looks a little overcomplicated (maybe it is) i try to explain it @@ -61,7 +58,7 @@ namespace ofxInterface ofJson getStyle(string id); bool hasValue(string valueName, ofJson config, ofJson style); - static ofColor colorFromJson(ofJson val); + static ofColor colorFromJson(ofJson val, map colors = map()); static ofVec2f vec2fFromJson(ofJson val); static ofVec3f vec3fFromJson(ofJson val); @@ -69,6 +66,7 @@ namespace ofxInterface template ValueType getValue(string valueName, ofJson config, ofJson style); + string getValueType(string valueName, ofJson config, ofJson style); // -- function registration -- // void registerCreationFunction(string name, creationFunction fct); @@ -79,6 +77,9 @@ namespace ofxInterface void readScrollableContainerSettings(ScrollableContainerSettings& settings, ofJson config, ofJson style); void readColorpanelSettings(ColorPanelSettings& settings, ofJson config, ofJson style); void readTextureSettings(TextureNodeSettings& settings, ofJson config, ofJson style); + void readTextInputSettings(TextInputSettings& settings, ofJson config, ofJson style); + + void readEffectSettings(NodeSettings& settings, ofJson config, ofJson style); // -- variables -- // shared_ptr assets; diff --git a/src/Node.cpp b/src/Node.cpp index 442e7bb..ad32414 100644 --- a/src/Node.cpp +++ b/src/Node.cpp @@ -20,11 +20,10 @@ ofColor Node::touchEnterNodeColor = ofColor(255, 0, 128); static int numInterfaceNodes = 0; - Node::~Node() { numInterfaceNodes--; - if (parent != NULL) { + if (parent != nullptr) { ((Node*)parent)->removeChild(this); } @@ -48,13 +47,15 @@ Node::Node() bClipTouch = false; bClipRender = false; bReceivingTouch = true; - data = NULL; + data = nullptr; bSendDestroy = true; bNodeAllowOneTouch = false; bNodeUpdateWhenHidden = false; bNodeTouched = false; nodeCurrentTouchId = -1; // not relevant + data = shared_ptr(new ofJson()); + dataIsJson = true; #ifdef OLDSORT sameDepthOffset = ofRandom(0, 1); #endif @@ -64,7 +65,7 @@ Node::Node() #endif #ifdef USE_OFX_HISTORY_PLOT - historyPlot = NULL; + historyPlot = nullptr; #endif ofAddListener(eventTouchDown, this, &Node::onTouchDown); @@ -89,6 +90,8 @@ Node::Node() bNodeUpdateWhenHidden = mom.bNodeUpdateWhenHidden; bNodeTouched = mom.bNodeTouched; nodeCurrentTouchId = -1; + data = mom.data; + dataIsJson = mom.dataIsJson; #ifdef OLDSORT sameDepthOffset = ofRandom(0, 1); #endif @@ -98,7 +101,7 @@ Node::Node() #endif #ifdef USE_OFX_HISTORY_PLOT - historyPlot = NULL; + historyPlot = nullptr; #endif // copy children @@ -112,7 +115,13 @@ Node::Node() Node* Node::clone() { - return new Node(*this); + auto ret = new Node(*this); + + /*for (auto& child : getChildren()) + { + ret->addChild(child->clone()); + }*/ + return ret; } void Node::setup(NodeSettings settings) { @@ -127,8 +136,13 @@ void Node::setup(NodeSettings settings) { else { deactivate(); } + + if (settings.effects.dropShadow.size > 0) { + effectDropShadow.setup(settings.effects.dropShadow); + } + effectSettings = settings.effects; } - + int Node::getNumNodesAlive(){ return numInterfaceNodes; } @@ -140,18 +154,41 @@ Node* Node::getChildWithName(const std::string &searchName, int searchDepth) con } if (searchDepth==0) { - return NULL; + return nullptr; } for (int i=0; igetChildWithName(searchName, searchDepth-1); - if (node != NULL) { + if (node != nullptr) { return node; } } - return NULL; + return nullptr; +} + +vector Node::getChildrenWithName(const std::string& searchName, int searchDepth) const +{ + vector ret; + + if (searchName == name) { + ret.push_back((Node*)this); + } + + if (searchDepth == 0) { + return ret; + } + + for (int i = 0; i < childNodes.size(); i++) + { + vector retC = childNodes[i]->getChildrenWithName(searchName, searchDepth - 1); + if (retC.size() > 0) { + ret.insert(ret.end(), retC.begin(), retC.end()); + } + } + + return ret; } Node* Node::getParentWithName(const std::string &searchName, int searchDepth) const @@ -161,11 +198,11 @@ Node* Node::getParentWithName(const std::string &searchName, int searchDepth) co } if (searchDepth==0) { - return NULL; + return nullptr; } - if (parent == NULL) { - return NULL; + if (parent == nullptr) { + return nullptr; } return ((Node*)parent)->getParentWithName(searchName, searchDepth-1); @@ -188,7 +225,7 @@ void Node::drawDebug() ofDrawBitmapString(ss.str(), 0, -3); #ifdef USE_OFX_HISTORY_PLOT - if (historyPlot != NULL) { + if (historyPlot != nullptr) { ofFill(); historyPlot->draw(0, getHeight(), 100, 50); } @@ -306,6 +343,8 @@ void Node::renderDynamic(bool forceAll) (*it)->renderGroups(); } else { + + (*it)->drawDropShadow(); (*it)->draw(); } @@ -388,7 +427,7 @@ void Node::updateSubtreePostOrder(float dt, bool forceAll) bool Node::getGlobalRenderClip() { - if (getParent() != NULL) { + if (getParent() != nullptr) { return bClipRender || ((Node*)getParent())->getGlobalRenderClip(); } else { @@ -399,7 +438,7 @@ bool Node::getGlobalRenderClip() ofRectangle Node::getRenderClipRect() { ofRectangle parentRect; - if (getParent() != NULL) { + if (getParent() != nullptr) { parentRect = ((Node*)getParent())->getRenderClipRect(); } ofRectangle rect; @@ -446,7 +485,7 @@ void Node::disableScissor() void Node::setCenteredH() { - if (parent == NULL) { + if (parent == nullptr) { return; } @@ -455,7 +494,7 @@ void Node::setCenteredH() void Node::setCenteredV() { - if (parent == NULL) { + if (parent == nullptr) { return; } @@ -464,7 +503,7 @@ void Node::setCenteredV() void Node::setCentered() { - if (parent == NULL) { + if (parent == nullptr) { return; } @@ -472,6 +511,38 @@ void Node::setCentered() (((Node*)parent)->getLocalHeight() - getLocalHeight())/2); } +void Node::drawDropShadow() +{ + if (effectSettings.dropShadow.size > 0) { + ofRectangle drawingRect = ofRectangle( + -effectSettings.dropShadow.size + effectSettings.dropShadow.position.x, + -effectSettings.dropShadow.size + effectSettings.dropShadow.position.y, + getWidth() + effectSettings.dropShadow.size * 2, + getHeight() + effectSettings.dropShadow.size * 2 + ); + + if (!fboDropShadow.isAllocated()) { + fboDropShadow.allocate( + getWidth() ,//+ effectSettings.dropShadow.size * 2, + getHeight() //+ effectSettings.dropShadow.size * 2 + ); + + fboDropShadow.begin(); + ofClear(0, 0); + + draw(); + fboDropShadow.end(); + effectDropShadow.update(fboDropShadow); + + } + + //ofEnableBlendMode(ofBlendMode::OF_BLENDMODE_MULTIPLY); + effectDropShadow.update(fboDropShadow); + effectDropShadow.getShadow().draw(drawingRect); + ofEnableAlphaBlending(); + } +} + void Node::onTouchDown(TouchEvent & event) { if (touchDownFunc) { touchDownFunc(event); @@ -550,7 +621,7 @@ void Node::touchUp(int id, TouchEvent* event) #ifdef USE_OFX_HISTORY_PLOT if (historyPlot) { delete historyPlot; - historyPlot = NULL; + historyPlot = nullptr; } #endif @@ -619,7 +690,8 @@ ofVec3f Node::toLocal(const ofVec3f &screenPoint) #ifdef GLM_SWIZZLE //this version of OF is using GLM for math ops return (ofVec3f)screenPoint * glm::inverse(ofNode::getGlobalTransformMatrix()); #else - return (ofVec3f)screenPoint*ofNode::getGlobalTransformMatrix().getInverse(); + //return (ofVec3f)screenPoint*ofNode::getGlobalTransformMatrix().getInverse(); + return (ofVec3f)screenPoint * glm::inverse(ofNode::getGlobalTransformMatrix()); #endif } @@ -661,7 +733,7 @@ void Node::setVisible(bool visible) bool Node::getVisibleGlobally() const { - if (parent == NULL) { + if (parent == nullptr) { return bVisible; } else { @@ -702,7 +774,7 @@ void Node::setEnabled(bool enable) bool Node::getEnabledGlobally() const { - if (parent == NULL) { + if (parent == nullptr) { return bEnabled; } else { @@ -765,14 +837,14 @@ Node* Node::removeChild(Node *child, bool bMaintainChildGlobalTransform) } ofLogWarning("ofxInterface::Node::removeChild", "are you trying to remove a child that does not exist?"); - return NULL; + return nullptr; } Node* Node::removeChild(int index, bool bMaintainChildGlobalTransform) { if (index >= childNodes.size()) { ofLogWarning("ofxInterface::Node::removeChild", "are you trying to remove a child that does not exist?"); - return NULL; + return nullptr; } Node *child = childNodes[index]; @@ -863,7 +935,7 @@ void Node::placeNextTo(Node &comp, Node::Side side, float margin) } } -string Node::print(int depth) const +string Node::printItem(int depth) const { stringstream ss; @@ -873,7 +945,7 @@ string Node::print(int depth) const ss << depth<<"- "<print(depth+1); + ss << node->printItem(depth+1); } return ss.str(); @@ -920,9 +992,26 @@ ofJson Node::getNodeJson() ret["isEnabled"] = getEnabled(); ret["isReceivingTouch"] = getReceivingTouch(); ret["plane"] = getPlane(); + if (dataIsJson) { + auto t = static_pointer_cast(data); + ret["customData"] = *t; + } + if (childNodes.size() > 0) { + ret["children"] = ofJson::array(); + for (auto& child : childNodes) { + ret["children"].push_back(child->getNodeJson()); + } + } + return ret; } +ofJson Node::getNodeJsonFiltered(set keys) +{ + return filterJsonDescription(getNodeJson(),keys); +} + + string Node::listActiveNodes(int depth) { string ret; @@ -938,6 +1027,11 @@ string Node::listActiveNodes(int depth) return ret; } +EffectSettings Node::getEffectSettings() +{ + return effectSettings; +} + ofJson Node::filterSceneDescription(ofJson desc, vector attributes, bool onlyActiveNodes) { ofJson ret; @@ -955,5 +1049,30 @@ ofJson Node::filterSceneDescription(ofJson desc, vector attributes, bool return ret; } +ofJson Node::filterJsonDescription(ofJson desc, set keys) +{ + ofJson ret = ofJson(); + bool hasChild = false; + for (ofJson::iterator it = desc.begin(); it != desc.end(); ++it) { + if (keys.find(it.key()) != keys.end()) { + if (it.key() == "children") { + hasChild = true; + } + else { + ret[it.key()] = it.value(); + } + } + } + + if (hasChild) { + ret["children"] = ofJson::array(); + for (auto& child : desc["children"]) { + ret["children"].push_back(filterJsonDescription(child, keys)); + } + } + + return ret; +} + } // namespace diff --git a/src/Node.h b/src/Node.h index 7d70969..9bb19c6 100644 --- a/src/Node.h +++ b/src/Node.h @@ -12,6 +12,7 @@ #include #include "ofMain.h" #include "TouchEvent.h" +#include "EffectDropShadow.h" // you can comment this to save a little (very little) #define OFXUINODE_DEBUG @@ -22,6 +23,12 @@ namespace ofxInterface { + + + struct EffectSettings { + EffectDropShadowSettings dropShadow; + }; + struct NodeSettings { string name; ofVec2f position; @@ -29,6 +36,7 @@ namespace ofxInterface bool renderClip = false; bool isActive = true; float plane = 10; + EffectSettings effects; }; class Node : public ofNode @@ -53,6 +61,7 @@ class Node : public ofNode const std::string& getName() const { return name; } // search the tree for a node with a specific name, searchDepth of -1 means search all the way down Node* getChildWithName(const std::string& searchName, int searchDepth = -1) const; + vector getChildrenWithName(const std::string& searchName, int searchDepth = -1) const; Node* getParentWithName(const std::string& searchName, int searchDepth = -1) const; /****** @@ -76,7 +85,7 @@ class Node : public ofNode // functions to override // virtual void update(float dt) {}; // please override with update code - virtual void draw() {}; // please override! draw your object in local space + virtual void draw() {} ; // please override! draw your object in local space virtual void preDraw() {}; // affects group rendering, executed before the draw function virtual void postDraw() {}; // affects group rendering, executed after the draw function @@ -366,7 +375,8 @@ class Node : public ofNode // use this to hold any data - void setData(shared_ptr _data) { data = _data; } + template + void setData(shared_ptr _data); shared_ptr getData() { return data; } //check for leaks @@ -384,7 +394,7 @@ class Node : public ofNode ofEvent eventDestroy; // send this event in the destructor - string print(int depth=0) const; + string printItem(int depth=0) const; template void addEventListener(const string& eventName, ListenerClass * listener, void (ListenerClass::*listenerMethod)(ArgType&), bool recursive=false) @@ -445,10 +455,15 @@ class Node : public ofNode ofJson getSceneDescription(); ofJson getSceneDescription(vector attributes, bool onlyActiveNodes = false); virtual ofJson getNodeJson(); + virtual ofJson getNodeJsonFiltered(set keys); string listActiveNodes(int depth = 0); + // effect settings + EffectSettings getEffectSettings(); + protected: ofJson filterSceneDescription(ofJson desc, vector attributes,bool onlyActiveNodes); + ofJson filterJsonDescription(ofJson desc, set keys); std::string name; ofVec2f size; @@ -468,6 +483,7 @@ class Node : public ofNode // hold custom data shared_ptr data; + bool dataIsJson = false; // debug stuff @@ -484,6 +500,16 @@ class Node : public ofNode static ofColor touchEnterNodeColor; #endif + + + // effects + EffectSettings effectSettings; + + // drop shadow + ofFbo fboDropShadow; + EffectDropShadow effectDropShadow; + void drawDropShadow(); + private: template ofEvent* getEventForName(const string& eventName) @@ -521,6 +547,8 @@ class Node : public ofNode bool isClickAllowed = true; + + #ifdef OLD_SORT /****** * sameDepthOffset: @@ -547,6 +575,19 @@ class Node : public ofNode const ofJson toJson(glm::quat val); }; +template +inline void Node::setData(shared_ptr _data) +{ + if (ofIsStringInString(typeid(_data).name(), "class std::shared_ptr{ style.color.r,style.color.g,style.color.b,style.color.a }; + ret["fontId"] = style.fontID; + ret["fontSize"] = style.fontSize; + ret["lineHeightMult"] = style.lineHeightMult; + ret["spacing"] = style.spacing; + return ret; + } + ofJson compositionToLog(ofJson sceneDescription, ofJson metaData) + { + ofJson ret = ofJson(); + if (!metaData["background"].is_null()) { + auto path = ofSplitString(metaData["background"].get(), "../").back(); + ret["background"] = path; + } + if (!metaData["overlay"].is_null()) { + auto path = ofSplitString(metaData["overlay"].get(), "../").back(); + ret["overlay"] = path; + } + if (!metaData["isPrint"].is_null()) { + ret["isPrint"] = metaData["isPrint"].get(); + } + if (!metaData["sharing"].is_null()) { + ret["sharing"] = metaData["sharing"].get(); + } + if (!metaData["itemId"].is_null()) { + ret["itemId"] = metaData["itemId"].get(); + } + if (!metaData["furtherUse"].is_null()) { + ret["furtherUse"] = metaData["furtherUse"].get(); + } + + ofJson icons = ofJson(); + ofJson texts = ofJson(); + + for (auto& objects : sceneDescription["children"][0]["children"]) { + if (objects["name"] == "objects" && !objects["children"].is_null()) { + for (auto& elem : objects["children"]) { + if (elem["nodeType"] == "TextureNode") { + auto path = ofSplitString(elem["customData"]["file"].get(), "../").back(); + icons.push_back(path); + } + else if (elem["nodeType"] == "TextInputOfTTF") { + ofJson text = ofJson(); + text["fontId"] = ofSplitString(elem["style"].get(), "/").back(); + text["text"] = elem["text"]; + texts.push_back(text); + } + + } + } + } + if (!icons.is_null()) + { + ret["icons"] = icons; + } + if (!texts.is_null()) { + ret["texts"] = texts; + } + return ret; + } + } +} \ No newline at end of file diff --git a/src/NodeToJsonHelper.h b/src/NodeToJsonHelper.h new file mode 100644 index 0000000..a6e3ae0 --- /dev/null +++ b/src/NodeToJsonHelper.h @@ -0,0 +1,11 @@ +#pragma once +#include "ofMain.h" +#include "ofxFontStash2.h" + +namespace reddo{ + namespace NodeToJson { + ofJson styleToJson(ofxFontStash2::Style style); + ofJson compositionToLog(ofJson sceneDescription, ofJson metaData); + } +} + diff --git a/src/components/ColorPanel.cpp b/src/components/ColorPanel.cpp index 9e95c1f..47c6fa4 100644 --- a/src/components/ColorPanel.cpp +++ b/src/components/ColorPanel.cpp @@ -5,22 +5,58 @@ namespace ofxInterface { void ColorPanel::setup(ofColor color, float w, float h) { - setSize(w, h); - setColor(color); - bDrawBackground = true; + ColorPanelSettings s; + s.size = ofVec2f(w, h); + s.colors.front() = color; + s.bDrawBackground = true; + setup(s); } void ColorPanel::setup(ColorPanelSettings settings) { Node::setup(settings); borderWidth = settings.strokeWidth; bDrawBackground = settings.bDrawBackground; - roundAngle = settings.borderRadius; - bgColor = settings.bgColor; + borderRadius = settings.borderRadius; strokeColor = settings.strokeColor; + + if (settings.colors.size() > 0) { + colors.clear(); + } + for (size_t i = 0; i < settings.colors.size();++i) { + colors.push_back(settings.colors[i]); + if (i < settings.gradientColorPositions.size()) { + gradientColorPositions.push_back(settings.gradientColorPositions[i]); + } + else { + if (i == 0) { + gradientColorPositions.push_back(0.0); + } + else if (i == 1) { + gradientColorPositions.push_back(1.0); + } + + } + } + gradientDirection = settings.gradientDirection; + + shader.push_back(getGradientShader2Colors()); + shader.push_back(getGradientShader3Colors()); + + + initShape(); + + ofAddListener(eventNodeSizeChanged,this, &ColorPanel::onNodeSizeChanged); + +} + +Node* ColorPanel::clone() +{ + auto ret = new ColorPanel(*this); + return ret; } ofColor ColorPanel::getColor() { - return bgColor; + return colors.front(); } ofColor ColorPanel::getStrokeColor() { @@ -48,38 +84,136 @@ void ColorPanel::setBorderWidth(float set) { } float ColorPanel::getRoundedEdge() { - return roundAngle; + return borderRadius; } void ColorPanel::setRoundedEdge(float ang) { - roundAngle = ang; + borderRadius = ang; } -void ColorPanel::draw() +void ColorPanel::onNodeSizeChanged(Node& n) { + initShape(); +} - if (bDrawBackground) { - ofFill(); - ofSetColor(bgColor); +void ColorPanel::initShape() +{ + shape.clear(); + outline.clear(); + shape.setFilled(colors.front().a > 0); + outline.setStrokeWidth(borderWidth); + shape.setFillColor(colors.front()); + outline.setStrokeColor(strokeColor); + shape.setUseShapeColor(true); + outline.setUseShapeColor(true); + + if (borderRadius > 0) { + shape.rectRounded(borderWidth, borderWidth, getWidth() - getWidth() * borderWidth, getHeight() - 2 * borderWidth, borderRadius); + outline.rectRounded(0, 0, getWidth(), getHeight(), borderRadius); + outline.rectRounded(borderWidth, borderWidth, getWidth() - getWidth() * borderWidth, getHeight() - 2 * borderWidth, borderRadius); + } + else { + shape.rectangle(borderWidth, borderWidth, getWidth() - 2 * borderWidth, getHeight() - 2 * borderWidth); + outline.rectangle(0, 0, getWidth(), getHeight()); + outline.rectangle(borderWidth, borderWidth, getWidth() - 2 * borderWidth, getHeight() - 2 * borderWidth); + } - if (roundAngle > 0) { - ofDrawRectRounded(0, 0, getWidth(), getHeight(), roundAngle); + // shader + if (colors.size() > 1) { + fbo.allocate(getWidth(), getHeight()); + + ofEnableBlendMode(OF_BLENDMODE_DISABLED); + fbo.begin(); + + ofClear(0, 0); + int nShader = 0; + if (colors.size() == 3) { + nShader = 1; } - else { - ofDrawRectangle(0, 0, getWidth(), getHeight()); + shader[nShader].begin(); + + + + ofVec2f pEnd = angleToBorderPoint(gradientDirection); + ofVec2f pStart = angleToBorderPoint(fmod(gradientDirection+180,360)); + ofVec2f dir = pEnd - pStart; + pStart += dir * gradientColorPositions.front(); + pEnd = pStart + dir * gradientColorPositions.back(); + + + + + shader[nShader].setUniform2f("begin", pStart); + shader[nShader].setUniform2f("end", pEnd); + + + + shader[nShader].setUniform2f("size", getSize()); + shader[nShader].setUniform4f("color1", colorToVec4(colors[0])); + shader[nShader].setUniform4f("color2", colorToVec4(colors[1])); + if (nShader == 2) { + shader[nShader].setUniform1f("mid", 0.66f); + shader[nShader].setUniform4f("color3", colorToVec4(colors[2])); } - } + - if (borderWidth > 0) { - ofNoFill(); - ofSetLineWidth(borderWidth); - ofSetColor(strokeColor); - if (roundAngle > 0) { + /*if (roundAngle > 0) { ofDrawRectRounded(0, 0, getWidth(), getHeight(), roundAngle); - } else { - ofDrawRectangle(0, 0, getWidth(), getHeight()); } + else {*/ + ofDrawRectangle(0, 0, getWidth(), getHeight()); + //} + + shader[nShader].end(); + + fbo.end(); + ofEnableBlendMode(OF_BLENDMODE_ALPHA); + ofSetColor(255); + fbo.draw(0, 0); + } + +} + +ofVec2f ColorPanel::angleToBorderPoint(float angle) +{ + ofVec2f d = angleToDirVector(angle); + ofVec2f p = ofVec2f(0.5, 0.5); + + if (angle < 45 || angle >315) { + float r = (1.0 - p.x) / d.x; + return ofVec2f(1.0, p.y + r * d.y); + } + else if (angle < 135) { + float r = (1.0 - p.y) / d.y; + return ofVec2f(p.x + r * d.x,1.0); + } + else if (angle < 225) { + float r = (0 - p.x) / d.x; + return ofVec2f(0, p.y + r * d.y); + } + else { + float r = (0 - p.y) / d.y; + return ofVec2f(p.x + r * d.x, 0); + } +} + +ofVec2f ColorPanel::angleToDirVector(float angle) +{ + ofVec2f vDirE = ofVec2f(1, 0); + vDirE.rotate(angle); + return vDirE; +} + +void ColorPanel::draw() +{ + outline.draw(); + if (colors.size() == 1) { + shape.draw(); + } + else { + fbo.draw(borderWidth, borderWidth, getWidth() - getWidth() * borderWidth, getHeight() - 2 * borderWidth); } + } diff --git a/src/components/ColorPanel.h b/src/components/ColorPanel.h index 1d36913..3bf39e8 100644 --- a/src/components/ColorPanel.h +++ b/src/components/ColorPanel.h @@ -3,6 +3,7 @@ #include "ofMain.h" #include "Node.h" +#include "GradientShader.h" namespace ofxInterface { struct ColorPanelSettings : NodeSettings{ @@ -10,8 +11,10 @@ namespace ofxInterface { bool bDrawBackground = true; float borderRadius = 0; - ofColor bgColor = ofColor(0); + vector colors = {ofColor(0)}; ofColor strokeColor = ofColor(0); + float gradientDirection = 0; + vector gradientColorPositions; }; class ColorPanel : public ofxInterface::Node @@ -19,11 +22,12 @@ namespace ofxInterface { public: void setup(ofColor color, float w, float h); void setup(ColorPanelSettings settings); + virtual Node* clone() override; void draw(); ofColor getColor(); - void setColor(const ofColor& c) { bgColor = c; } + void setColor(const ofColor& c) { colors[0] = c; shape.setFillColor(c); } ofColor getStrokeColor(); void setStrokeColor(const ofColor& c); @@ -37,13 +41,27 @@ namespace ofxInterface { float getRoundedEdge(); void setRoundedEdge(float ang); + void onNodeSizeChanged(Node& n); + protected: + void initShape(); + ofVec2f angleToBorderPoint(float angle); + ofVec2f angleToDirVector(float angle); + float borderWidth; bool bDrawBackground = true; - float roundAngle; + float borderRadius; - ofColor bgColor; + vector colors; ofColor strokeColor; + float gradientDirection; + vector gradientColorPositions; + + ofPath shape; + ofPath outline; + + vector shader; + ofFbo fbo; }; } diff --git a/src/components/Label.cpp b/src/components/Label.cpp index 4bcb24e..038d8cc 100644 --- a/src/components/Label.cpp +++ b/src/components/Label.cpp @@ -12,7 +12,7 @@ namespace ofxInterface { font = mom.font; style = mom.style; text = mom.text; - alignment = mom.alignment; + horzAlignment = mom.horzAlignment; isDropshadow = mom.isDropshadow; shadow = mom.shadow; shadowPos = mom.shadowPos; @@ -38,15 +38,19 @@ namespace ofxInterface { // since fontstash uses its own clip functions, we need to manually disable the draw // masks out the text completely, when out of clip // need to find a more appropriate function - ofRectangle boundsGlobal( toGlobal(ofVec3f(bounds.x,bounds.y)),toGlobal(ofVec3f(bounds.width,bounds.height)) ); - boundsGlobal.width -= boundsGlobal.x; - boundsGlobal.height -= boundsGlobal.y; - + //ofRectangle boundsGlobal( toGlobal(ofVec3f(bounds.x,bounds.y)),toGlobal(ofVec3f(bounds.width,bounds.height)) ); + ofRectangle boundsGlobal( toGlobal(ofVec3f(bounds.x,bounds.y)),bounds.width,bounds.height ); + boundsGlobal.y -= getHeight() * 0.5; + //boundsGlobal.width -= boundsGlobal.x; + //boundsGlobal.height -= boundsGlobal.y; + + auto cl = getGlobalRenderClip(); + auto in = getRenderClipRect().intersects(boundsGlobal); if (!getGlobalRenderClip() || getRenderClipRect().intersects(boundsGlobal)) { if (isDropshadow) { - font->drawColumn(text, shadow, shadowPos.x, shadowPos.y + dy, getWidth(), alignment); + font->drawColumn(text, shadow, shadowPos.x, shadowPos.y + dy, getWidth(), horzAlignment); } - font->drawColumn(text, style, 0, dy, getWidth(), alignment); + font->drawColumn(text, style, 0, dy, getWidth(), horzAlignment); } @@ -58,7 +62,7 @@ namespace ofxInterface { font = s.font; style = s.style; text = s.text; - alignment = s.alignment; + horzAlignment = s.horzAlignment; setShadow(s.isDropshadow, s.shadowSize, s.shadowPos.x, s.shadowPos.y, s.shadowColor); } @@ -68,9 +72,14 @@ namespace ofxInterface { text = text_; } + string Label::getText() + { + return text; + } + void Label::setAlignment(ofAlignHorz alignment_) { - alignment = alignment_; + horzAlignment = alignment_; } void Label::setShadowEnabled(bool isEnabled) { @@ -90,6 +99,11 @@ namespace ofxInterface { float Label::getFontSize() { return style.fontSize; } + ofxFontStash2::Style Label::getFontStyle() + { + return style; + } + void Label::setColor(ofColor color) { style.color = color; diff --git a/src/components/Label.h b/src/components/Label.h index dfcaee8..dfd12f9 100644 --- a/src/components/Label.h +++ b/src/components/Label.h @@ -7,7 +7,7 @@ namespace ofxInterface { shared_ptr font; ofxFontStash2::Style style; string text; - ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + ofAlignHorz horzAlignment = OF_ALIGN_HORZ_LEFT; bool isDropshadow = false; ofxFontStash2::Style shadow; @@ -29,11 +29,13 @@ namespace ofxInterface { virtual void draw(); virtual void setup(LabelSettings s); void setText(string text); - void setAlignment(ofAlignHorz alignment); + string getText(); + void setAlignment(ofAlignHorz horzAlignment); void setShadowEnabled(bool isEnabled); void setShadow(bool isEnabled, float w = 0, float x= 0, float y = 0, ofColor color = ofColor(0)); void setFontSize(float size); float getFontSize(); + ofxFontStash2::Style getFontStyle(); void setColor(ofColor color); ofColor getColor(); @@ -42,7 +44,7 @@ namespace ofxInterface { shared_ptr font; ofxFontStash2::Style style; string text; - ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + ofAlignHorz horzAlignment = OF_ALIGN_HORZ_LEFT; bool isDropshadow = false; ofxFontStash2::Style shadow; diff --git a/src/components/ModalElement.cpp b/src/components/ModalElement.cpp index 555ba9f..9e81d1e 100644 --- a/src/components/ModalElement.cpp +++ b/src/components/ModalElement.cpp @@ -14,6 +14,7 @@ namespace ofxInterface { { colorActive = mom.colorActive; colorSelected = mom.colorSelected; + colorInactive = mom.colorInactive; type = mom.type; isSelected = mom.isSelected.get(); isSelected.addListener(this, &ModalElement::onStateChanged); @@ -102,4 +103,27 @@ namespace ofxInterface { return type; } + ofJson ModalElement::getNodeJson() + { + auto ret = Node::getNodeJson(); + ret["nodeType"] = "ModalElement"; + + switch (type) { + case BUTTON: + ret["modalType"] = "Button"; + break; + case CHECKER: + ret["modalType"] = "Checker"; + break; + case RADIO: + ret["modalType"] = "Radio"; + break; + } + ret["colorActive"] = vector{ colorActive.r,colorActive.g,colorActive.b,colorActive.a }; + ret["colorSelected"] = vector{ colorSelected.r,colorSelected.g,colorSelected.b,colorSelected.a }; + ret["colorInactive"] = vector{ colorInactive.r,colorInactive.g,colorInactive.b,colorInactive.a }; + + return ret; + } + } \ No newline at end of file diff --git a/src/components/ModalElement.h b/src/components/ModalElement.h index 774c0d3..8279588 100644 --- a/src/components/ModalElement.h +++ b/src/components/ModalElement.h @@ -39,6 +39,8 @@ namespace ofxInterface { ofColor colorActive; ofColor colorSelected; ofColor colorInactive; + + ofJson getNodeJson() override; private: ModalType type; diff --git a/src/components/ScrollableContainer.cpp b/src/components/ScrollableContainer.cpp index f597cc0..abb5859 100644 --- a/src/components/ScrollableContainer.cpp +++ b/src/components/ScrollableContainer.cpp @@ -25,7 +25,33 @@ namespace ofxInterface { scrollActiveColor = s.scrollActiveColor; scrollInactiveColor = s.scrollInactiveColor; + ColorPanelSettings cs; + cs.colors.front() = s.scrollActiveColor; + cs.plane = 10; + + slider.insert(make_pair("w", new ColorPanel())); + slider["w"]->setup(cs); + slider.insert(make_pair("h", new ColorPanel())); + slider["h"]->setup(cs); + + cs.colors.front() = s.scrollInactiveColor; + slider.insert(make_pair("wInactive", new ColorPanel())); + slider["wInactive"]->setup(cs); + slider.insert(make_pair("hInactive", new ColorPanel())); + slider["hInactive"]->setup(cs); + + baseSize = getSize(); + + addChild(slider["wInactive"]); + addChild(slider["hInactive"]); + addChild(slider["w"]); + addChild(slider["h"]); + for (auto& s : slider) { + s.second->setEnabled(false); + } + ofAddListener(eventChildAdded, this, &ScrollableContainer::onChildAdded); + ofAddListener(scrollableArea->eventChildRemoved, this, &ScrollableContainer::onChildRemoved); ofAddListener(scrollableArea->eventTouchMove, this, &ScrollableContainer::onTouchMove); ofAddListener(scrollableArea->eventTouchUp, this, &ScrollableContainer::onTouchUp); ofAddListener(scrollableArea->eventTouchDown, this, &ScrollableContainer::onTouchDown); @@ -37,15 +63,20 @@ namespace ofxInterface { animationReady = false; } }); + + + } void ScrollableContainer::draw() { + // animate elements if scrolled on edge if (edgeAnimation.isAnimating()) { edgeAnimation.update(ofGetLastFrameTime()); scrollableArea->setPosition(edgeAnimation.getCurrentPosition()); + // animate elements right after touchUp } @@ -78,8 +109,11 @@ namespace ofxInterface { if (getHeight() == scrollableArea->getHeight()) { d.y = 0; } + ofVec2f pos = ofVec2f(scrollableArea->getPosition()) + d; + pos.x = ofClamp(pos.x,-1*(scrollableArea->getWidth() - getWidth()), 0); + pos.y = ofClamp(pos.y,-1*(scrollableArea->getHeight() - getHeight()), 0); - edgeAnimation.animateTo(ofVec2f(scrollableArea->getPosition()) + d); + edgeAnimation.animateTo(pos); finalPoint = scrollableArea->getPosition(); animationReady = false; } @@ -88,40 +122,8 @@ namespace ofxInterface { ofSetColor(bgColor); ofDrawRectangle(0, 0, getWidth(), getHeight()); - // draw slider - float wSlider = 6; - float marginSlider = 20; - - if (scrollableArea->getWidth() > getWidth()) { - ofVec2f d0 = ofVec2f(marginSlider, getHeight() - marginSlider - wSlider); - ofSetColor(scrollInactiveColor); - float width = getWidth() - 3 * marginSlider; - ofDrawRectangle(d0, width, wSlider); - - ofSetColor(scrollActiveColor); - float wActive = width * getWidth() / scrollableArea->getWidth(); - if (edgeAnimation.isAnimating()) { - wActive -= (1.0 - edgeAnimation.getPercentDone()) * 25; - } - float pos = (width - wActive) - ofMap(scrollableArea->getPosition().x, getWidth() - scrollableArea->getWidth(), 0, 0, width - wActive, true); - ofDrawRectangle(d0 + ofVec2f(pos,0), wActive, wSlider); - } - - if (scrollableArea->getHeight() > getHeight()) { - ofVec2f d0 = ofVec2f(getWidth() - marginSlider - wSlider, marginSlider); - ofSetColor(scrollInactiveColor); - float height = getHeight() - 2 * marginSlider; - ofDrawRectangle(d0, wSlider, height); - - ofSetColor(scrollActiveColor); - float hActive = height * getHeight() / scrollableArea->getHeight(); - if (edgeAnimation.isAnimating()) { - hActive -= (1.0 - edgeAnimation.getPercentDone()) * 25; - } - float pos = (height - hActive) - ofMap(scrollableArea->getPosition().y, getHeight() - scrollableArea->getHeight(),0, 0, height-hActive,true); - ofDrawRectangle(d0 +ofVec2f(0,pos), wSlider, hActive); - } - + updateSlider(); + } @@ -129,12 +131,6 @@ namespace ofxInterface { return scrollableArea; } - void ScrollableContainer::addChildToScrollableArea(Node * child) { - // enable clipping for children - child->setRenderClip(true); - scrollableArea->addChild(child); - } - void ScrollableContainer::onTouchDown(TouchEvent & event) { edgeAnimation.reset(); } @@ -182,11 +178,38 @@ namespace ofxInterface { ///\brief moves child to scrollable Area void ScrollableContainer::onChildAdded(ofxInterface::Node & n) { + + + // move child to scroll and resize continer containerRemoveChild(&n); scrollableArea->addChild(&n); - ofAddListener(n.eventTouchMove, this, &ScrollableContainer::onTouchMove); - ofAddListener(n.eventTouchUp, this, &ScrollableContainer::onTouchUp); - ofAddListener(n.eventTouchDown, this, &ScrollableContainer::onTouchDown); + fitSizeToItems(); + + // clip render + n.setRenderClip(true); + + // add listeners + updateChildListeners(&n); + + + } + + void ScrollableContainer::onChildRemoved(ofxInterface::Node& n) + { + fitSizeToItems(); + } + + void ScrollableContainer::fitSizeToItems() + { + int w = baseSize.x; + int h = baseSize.y; + + for (auto& c : getChildWithName("scrollableArea")->getChildren()) + { + updateChildItemSize(c, w, h); + } + getChildWithName("scrollableArea")->setSize(w, h); + } Node * ScrollableContainer::containerRemoveChild(Node * child, bool bMaintainChildGlobalTransform) @@ -216,5 +239,92 @@ namespace ofxInterface { return child; } + void ScrollableContainer::updateChildItemSize(Node* child, int& w, int& h) + { + for (auto& c : child->getChildren()) + { + updateChildItemSize(c, w, h); + } + + if (child->getPosition().x + child->getWidth() > w) { + w = child->getPosition().x + child->getWidth(); + } + if (child->getPosition().y + child->getHeight() > h) { + h = child->getPosition().y + child->getHeight(); + } + } + + void ScrollableContainer::updateChildListeners(Node* child) + { + for (auto& c : child->getChildren()) { + updateChildListeners(c); + } + + ofAddListener(child->eventTouchMove, this, &ScrollableContainer::onTouchMove); + ofAddListener(child->eventTouchUp, this, &ScrollableContainer::onTouchUp); + ofAddListener(child->eventTouchDown, this, &ScrollableContainer::onTouchDown); + } + + void ScrollableContainer::updateSlider() + { + // draw slider + float wSlider = 6; + float marginSlider = 20; + + if (scrollableArea->getWidth() > getWidth()) { + slider["wInactive"]->setVisible(true); + slider["w"]->setVisible(true); + + ofVec2f d0 = ofVec2f(marginSlider, getHeight() - marginSlider - wSlider); + //ofSetColor(scrollInactiveColor); + float width = getWidth() - 3 * marginSlider; + + slider["wInactive"]->setPosition(d0); + slider["wInactive"]->setSize(width, wSlider); + //ofDrawRectangle(d0, width, wSlider); + + //ofSetColor(scrollActiveColor); + float wActive = width * getWidth() / scrollableArea->getWidth(); + if (edgeAnimation.isAnimating()) { + wActive -= (1.0 - edgeAnimation.getPercentDone()) * 25; + } + float pos = (width - wActive) - ofMap(scrollableArea->getPosition().x, getWidth() - scrollableArea->getWidth(), 0, 0, width - wActive, true); + //ofDrawRectangle(d0 + ofVec2f(pos,0), wActive, wSlider); + slider["w"]->setPosition(d0 + ofVec2f(pos, 0)); + slider["w"]->setSize(wActive, wSlider); + } + else { + slider["wInactive"]->setVisible(false); + slider["w"]->setVisible(false); + } + + + if (scrollableArea->getHeight() > getHeight()) { + slider["hInactive"]->setVisible(true); + slider["h"]->setVisible(true); + + ofVec2f d0 = ofVec2f(getWidth() - marginSlider - wSlider, marginSlider); + //ofSetColor(scrollInactiveColor); + float height = getHeight() - 2 * marginSlider; + //ofDrawRectangle(d0, wSlider, height); + slider["hInactive"]->setPosition(d0); + slider["hInactive"]->setSize(wSlider, height); + + //ofSetColor(scrollActiveColor); + float hActive = height * getHeight() / scrollableArea->getHeight(); + if (edgeAnimation.isAnimating()) { + hActive -= (1.0 - edgeAnimation.getPercentDone()) * 25; + } + float pos = (height - hActive) - ofMap(scrollableArea->getPosition().y, getHeight() - scrollableArea->getHeight(), 0, 0, height - hActive, true); + //ofDrawRectangle(d0 +ofVec2f(0,pos), wSlider, hActive); + slider["h"]->setPosition(d0 + ofVec2f(0, pos)); + slider["h"]->setSize(wSlider, hActive); + } + else { + slider["hInactive"]->setVisible(false); + slider["h"]->setVisible(false); + } + } + } \ No newline at end of file diff --git a/src/components/ScrollableContainer.h b/src/components/ScrollableContainer.h index b2503bd..45e36ac 100644 --- a/src/components/ScrollableContainer.h +++ b/src/components/ScrollableContainer.h @@ -3,6 +3,7 @@ #include "ofxFontStash2.h" #include "ofxAnimatableOfPoint.h" #include "ofxEasing.h" +#include "ColorPanel.h" namespace ofxInterface { @@ -28,7 +29,7 @@ namespace ofxInterface { virtual void draw() override; Node* getScrollableArea(); - void addChildToScrollableArea(Node* child); + //void addChildToScrollableArea(Node* child); virtual void onTouchDown(TouchEvent & event); virtual void onTouchUp(TouchEvent & event); @@ -37,16 +38,24 @@ namespace ofxInterface { void onScrollAreaSizeChanged(ofxInterface::Node & n); void onChildAdded(ofxInterface::Node& n); - + void onChildRemoved(ofxInterface::Node& n); + void fitSizeToItems(); + protected: Node* containerRemoveChild(Node *child, bool bMaintainChildGlobalTransform = false); Node* containerRemoveChild(int index, bool bMaintainChildGlobalTransform = false); + void updateChildItemSize(Node* child, int& w, int& h); + void updateChildListeners(Node* child); + + void updateSlider(); private: Node* scrollableArea; Node* dragArea; + map slider; ofVec2f pStartDragCursor; ofVec2f pStartDrag; + ofVec2f baseSize; ofColor bgColor; ofColor scrollActiveColor; @@ -65,6 +74,9 @@ namespace ofxInterface { /// \brief in s const float maxAnimationLength = 2.3f; + + + }; } diff --git a/src/components/SoftKeyboard.cpp b/src/components/SoftKeyboard.cpp index 0138c51..58321b0 100644 --- a/src/components/SoftKeyboard.cpp +++ b/src/components/SoftKeyboard.cpp @@ -24,15 +24,25 @@ namespace ofxInterface { borderWidth = s.borderWidth; padding = s.padding; margin = s.margin; + textureKeys = s.textureKeys; // fixed ratio - setHeight(getWidth() * 19.4 / 51); - - // create keys - wKey = (getWidth() - 2 * (margin + borderWidth) - 10*padding) / 11; + if (getHeight() == 0) { + setHeight(getWidth() * 19.4 / 51); + } + + // create keys, different layout for code and language input + if (s.layout == "code") { + wKey = (getWidth() - 2 * (margin + borderWidth) - 9 * padding) / 10; + } + else { + wKey = (getWidth() - 2 * (margin + borderWidth) - 10 * padding) / 11; + } + hKey = (getHeight() - 2 * (margin + borderWidth) - 3 * padding) / 4; + auto keyLayout = getKeyLayout(s.layout); for (auto& l:keyLayout) { @@ -98,7 +108,7 @@ namespace ofxInterface { int py = borderWidth + margin; for (auto& line : keys) { addLine(keySets[keySet], line, py); - py += wKey + padding; + py += hKey + padding; } } @@ -112,10 +122,10 @@ namespace ofxInterface { float x = margin + borderWidth; int i = 0; for (auto& key : keys) { - float w = widthKeys[i]; - - addKey(keySet, key, x, y, w, wKey); - + float w = widthKeys[i]; + if (key != 10000) { + addKey(keySet, key, x, y, w, hKey); + } x += w + padding; ++i; } @@ -130,6 +140,7 @@ namespace ofxInterface { keyWidths[3680] = wKey * 2 + padding; // shift keyWidths[8] = wKey * 2 + padding; // backspace keyWidths[13] = wKey * 2 + padding; // return + keyWidths[10000] = (wKey ) * 0.5; // half key empty space vector widthKeys; @@ -160,6 +171,11 @@ namespace ofxInterface { s.key = keyValue; s.style = style; + if (textureKeys.find(keyValue) != textureKeys.end()) { + s.isTextureKey = true; + s.keyTexture = textureKeys[keyValue]; + } + key->setup(s); keySet->addChild(key); @@ -197,13 +213,13 @@ namespace ofxInterface { vector< vector> numbers = { {'1','2','3','4','5','6','7','8','9','0','='}, {'!','#','$','%','&','\'','*','+','-','/','?'}, - {'^','_','`','{','|','}','~','(',')',',',':' }, + {'_',223,'|','{','}','[',']','(',')',',',':'}, { 9996,'@',' ',';',13} }; ret.insert(make_pair("numbers", numbers)); } - else { // use "en" + else if(layout == "en") { vector< vector> alphaKeys = { {'q','w','e','r','t','y','u','i','o','p',252}, {'a','s','d','f','g','h','j','k','l',246,228}, @@ -225,12 +241,40 @@ namespace ofxInterface { vector< vector> numbers = { {'1','2','3','4','5','6','7','8','9','0','='}, {'!','#','$','%','&','\'','*','+','-','/','?'}, - {'^','_','`','{','|','}','~','(',')',',',':' }, + {'_',223,'|','{','}','[',']','(',')',',',':'}, { 9996,'@',' ',';',13} }; ret.insert(make_pair("numbers", numbers)); } + else if (layout == "code") { + vector< vector> alphaKeys = { + {'1','2','3','4','5','6','7','8','9','0'}, + {'Q','W','E','R','T','Y','U','I','O','P'}, + {10000,'A','S','D','F','G','H','J','K','L'}, + {10000,'Z','X','C','V','B','N','M',8} + }; + + ret.insert(make_pair("alpha", alphaKeys)); + + vector> alphaBigKeys = { + {'1','2','3','4','5','6','7','8','9','0'}, + {'Q','W','E','R','T','Y','U','I','O','P'}, + {10000,'A','S','D','F','G','H','J','K','L'}, + {10000,'Z','X','C','V','B','N','M',8} + }; + + ret.insert(make_pair("alphaBig", alphaBigKeys)); + + vector< vector> numbers = { + {'1','2','3','4','5','6','7','8','9','0'}, + {'Q','W','E','R','T','Y','U','I','O','P'}, + {10000,'A','S','D','F','G','H','J','K','L'}, + {10000,'Z','X','C','V','B','N','M',8} + }; + + ret.insert(make_pair("numbers", numbers)); + } return ret; diff --git a/src/components/SoftKeyboard.h b/src/components/SoftKeyboard.h index 96a4619..da323e7 100644 --- a/src/components/SoftKeyboard.h +++ b/src/components/SoftKeyboard.h @@ -30,6 +30,8 @@ namespace ofxInterface { string layout = "de"; + map textureKeys; + }; @@ -68,11 +70,13 @@ class SoftKeyboard : public Node{ int borderRadius; int wKey; + int hKey; int margin; int padding; int borderWidth; ofPath borderPath; + map textureKeys; private: diff --git a/src/components/SoftKeyboardKey.cpp b/src/components/SoftKeyboardKey.cpp index 9225e7e..7b6ec25 100644 --- a/src/components/SoftKeyboardKey.cpp +++ b/src/components/SoftKeyboardKey.cpp @@ -19,6 +19,8 @@ namespace ofxInterface { key = s.key; borderRadius = s.borderRadius; borderWidth = s.borderWidth; + isTextureKey = s.isTextureKey; + keyTexture = s.keyTexture; // draw paths @@ -92,15 +94,21 @@ namespace ofxInterface { fillPath.draw(); - - //center text - ofRectangle r = font->getTextBounds(text, style,0,0); - // hack to reduce line height to glyph height - r.y += r.height*0.25; - r.height *= 0.6; + if (!isTextureKey) { + //center text + ofRectangle r = font->getTextBounds(text, style, 0, 0); + // hack to reduce line height to glyph height + r.y += r.height * 0.25; + r.height *= 0.6; - font->draw(text,style, (getWidth()-r.width)/2, 0.5*(getHeight() - r.height) - r.y); - specialKeyPath.draw(specialKeyPos.x, specialKeyPos.y); + font->draw(text, style, (getWidth() - r.width) / 2, 0.5 * (getHeight() - r.height) - r.y); + specialKeyPath.draw(specialKeyPos.x, specialKeyPos.y); + } + else { + ofSetColor(style.color); + keyTexture.draw(0, 0, getWidth(), getHeight()); + } + } @@ -129,7 +137,7 @@ namespace ofxInterface { float glyphHeight = font->getTextBounds("X", style, 0, 0).height*0.6; float glyphCurveRadius = borderRadius * 0.5; - float glyphStroke = 1.0; + float glyphStroke = borderWidth * 2; if (key == 252) { text = "ü"; @@ -162,14 +170,15 @@ namespace ofxInterface { text = "Return"; } else if (key == 8) { // backspace + text = ""; specialKeyPath.setColor(style.color); specialKeyPath.setArcResolution(50); - // other path - specialKeyPath.moveTo(glyphHeight *24.0/18.0 - glyphCurveRadius, 0); - specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 270, 0); // rightTop - specialKeyPath.lineTo(glyphHeight *24.0 / 18.0, glyphHeight - glyphCurveRadius); - specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 0, 90); // rightBottom + // outher path + specialKeyPath.moveTo(glyphHeight *24.0/18.0 - borderRadius, 0); + specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - borderRadius, borderRadius), borderRadius, borderRadius, 270, 0); // rightTop + specialKeyPath.lineTo(glyphHeight *24.0 / 18.0, glyphHeight - borderRadius); + specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - borderRadius, glyphHeight - borderRadius), borderRadius, borderRadius, 0, 90); // rightBottom specialKeyPath.lineTo(glyphHeight *9.0 / 18.0, glyphHeight); specialKeyPath.arc(ofVec2f(glyphHeight *9.0 / 18.0 - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius, glyphCurveRadius, 90, 135); // leftBottom specialKeyPath.lineTo(glyphCurveRadius * 0.5, 9.0/18.0*glyphHeight + glyphCurveRadius); @@ -181,34 +190,36 @@ namespace ofxInterface { // inner path specialKeyPath.moveTo(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphStroke); specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 270, 0); // rightTop + specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 270, 0); // rightTop specialKeyPath.lineTo(glyphHeight *24.0 / 18.0 - glyphStroke, glyphHeight - glyphCurveRadius); specialKeyPath.arc(ofVec2f(glyphHeight *24.0 / 18.0 - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 0, 90); // rightBottom specialKeyPath.lineTo(glyphHeight *9.0 / 18.0, glyphHeight - glyphStroke); specialKeyPath.arc(ofVec2f(glyphHeight *9.0 / 18.0 - glyphCurveRadius, glyphHeight - glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 90, 135); // leftBottom specialKeyPath.lineTo(glyphCurveRadius * 0.5 + glyphStroke*0.924, 9.0 / 18.0*glyphHeight + glyphCurveRadius); specialKeyPath.arc(ofVec2f(glyphCurveRadius, 9.0 / 18.0*glyphHeight), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 135, 225); // left - specialKeyPath.lineTo(9.0 / 18.0*glyphHeight - 1.924*glyphCurveRadius, glyphCurveRadius * 0.383 + glyphStroke); + specialKeyPath.lineTo(9.0 / 18.0 * glyphHeight - 1.8 * glyphCurveRadius, glyphCurveRadius * 0.383 + glyphStroke); specialKeyPath.arc(ofVec2f(9.0 / 18.0*glyphHeight - glyphCurveRadius, glyphCurveRadius), glyphCurveRadius - glyphStroke, glyphCurveRadius - glyphStroke, 225, 270); // leftTop specialKeyPath.close(); // x - float glyphStrokeD = sqrt(glyphStroke*glyphStroke * 2); + int glyphStrokeX = glyphStroke * 0.5; + float glyphStrokeD = sqrt(glyphStrokeX*glyphStrokeX * 2); specialKeyPath.moveTo(glyphHeight *15.0 / 18.0 - glyphStrokeD, glyphHeight *9.0 / 18.0); - specialKeyPath.lineTo(glyphHeight *12.0 / 18.0 - glyphStroke * 0.383, glyphHeight *12.0 / 18.0 -glyphStroke * 0.924); - specialKeyPath.arcNegative(ofVec2f(glyphHeight *12.0 / 18.0, glyphHeight *12.0 / 18.0), glyphStroke, glyphStroke, 225, 45); // leftBottom + specialKeyPath.lineTo(glyphHeight *12.0 / 18.0 - glyphStrokeX * 0.383, glyphHeight *12.0 / 18.0 -glyphStrokeX * 0.924); + specialKeyPath.arcNegative(ofVec2f(glyphHeight *12.0 / 18.0, glyphHeight *12.0 / 18.0), glyphStrokeX, glyphStrokeX, 225, 45); // leftBottom specialKeyPath.lineTo(glyphHeight *15.0 / 18.0, glyphHeight *9.0 / 18.0 + glyphStrokeD); - specialKeyPath.lineTo(glyphHeight *18.0 / 18.0 - glyphStroke * 0.383, glyphHeight *12.0 / 18.0 + glyphStroke * 0.924); - specialKeyPath.arcNegative(ofVec2f(glyphHeight *18.0 / 18.0, glyphHeight *12.0 / 18.0), glyphStroke, glyphStroke, 135, 315); // rightBottom + specialKeyPath.lineTo(glyphHeight *18.0 / 18.0 - glyphStrokeX * 0.383, glyphHeight *12.0 / 18.0 + glyphStrokeX * 0.924); + specialKeyPath.arcNegative(ofVec2f(glyphHeight *18.0 / 18.0, glyphHeight *12.0 / 18.0), glyphStrokeX, glyphStrokeX, 135, 315); // rightBottom specialKeyPath.lineTo(glyphHeight *15.0 / 18.0 + glyphStrokeD, glyphHeight *9.0 / 18.0); - specialKeyPath.lineTo(glyphHeight *18.0 / 18.0 + glyphStroke * 0.383, glyphHeight *6.0 / 18.0 +glyphStroke * 0.924); - specialKeyPath.arcNegative(ofVec2f(glyphHeight *18.0 / 18.0, glyphHeight *6.0 / 18.0), glyphStroke, glyphStroke, 45, 225); // rightTop + specialKeyPath.lineTo(glyphHeight *18.0 / 18.0 + glyphStrokeX * 0.383, glyphHeight *6.0 / 18.0 +glyphStrokeX * 0.924); + specialKeyPath.arcNegative(ofVec2f(glyphHeight *18.0 / 18.0, glyphHeight *6.0 / 18.0), glyphStrokeX, glyphStrokeX, 45, 225); // rightTop specialKeyPath.lineTo(glyphHeight *15.0 / 18.0 , glyphHeight *9.0 / 18.0 - glyphStrokeD); - specialKeyPath.lineTo(glyphHeight *12.0 / 18.0 + glyphStroke * 0.383, glyphHeight *6.0 / 18.0 - glyphStroke * 0.924); - specialKeyPath.arcNegative(ofVec2f(glyphHeight *12.0 / 18.0 , glyphHeight *6.0 / 18.0), glyphStroke, glyphStroke, 315, 135); // leftTop + specialKeyPath.lineTo(glyphHeight *12.0 / 18.0 + glyphStrokeX * 0.383, glyphHeight *6.0 / 18.0 - glyphStrokeX * 0.924); + specialKeyPath.arcNegative(ofVec2f(glyphHeight *12.0 / 18.0 , glyphHeight *6.0 / 18.0), glyphStrokeX, glyphStrokeX, 315, 135); // leftTop specialKeyPath.close(); float wGlyph = glyphHeight * 12 / 9.0; - specialKeyPos = ofVec2f(0.5*(getWidth() - wGlyph), 0.5*(getHeight() - glyphHeight)); + specialKeyPos = ofVec2f(0.48*(getWidth() - wGlyph), 0.5*(getHeight() - glyphHeight)); } else if (key == 769) { text = "strg"; @@ -261,6 +272,9 @@ namespace ofxInterface { float wGlyph = glyphHeight * 10 / 9.0; specialKeyPos = ofVec2f(0.5*(getWidth() - wGlyph), 0.5*(getHeight() - glyphHeight)); + } + else if (key == 94) { //roof + text = "^"; } else if (key == 356) { //left text = "<-"; diff --git a/src/components/SoftKeyboardKey.h b/src/components/SoftKeyboardKey.h index 231b6a4..acbb3b4 100644 --- a/src/components/SoftKeyboardKey.h +++ b/src/components/SoftKeyboardKey.h @@ -24,6 +24,9 @@ namespace ofxInterface { int borderRadius = 4; int borderWidth = 1; + bool isTextureKey = false; + ofTexture keyTexture; + }; class SoftKeyboardKey : public ModalElement { @@ -58,6 +61,9 @@ namespace ofxInterface { ofVec2f specialKeyPos; string text = ""; + + bool isTextureKey = false; + ofTexture keyTexture; }; } diff --git a/src/components/TextField.cpp b/src/components/TextField.cpp index b93e48e..0f2e432 100644 --- a/src/components/TextField.cpp +++ b/src/components/TextField.cpp @@ -16,9 +16,31 @@ namespace ofxInterface { { vector blocks; ofxFontStash2::Parser::parseText(text, font->getStyles(), "text", blocks); - int y = font->getTextBounds(blocks[0].text,blocks[0].style, 0, 0).height*0.5; + int y = font->getTextBounds(blocks[0].text, blocks[0].style, 0, 0).height * 0.5; - font->drawFormattedColumn(text, 0, y, getWidth(), alignment); + alignmentRenderFbo.begin(); + auto bounds = font->drawFormattedColumn(text, 0, y, getWidth(), horzAlignment); + alignmentRenderFbo.end(); + //float dy = bounds.height * 0.5; + + // since fontstash uses its own clip functions, we need to manually disable the draw + // masks out the text completely, when out of clip + // need to find a more appropriate function + ofRectangle boundsGlobal(toGlobal(ofVec3f(bounds.x, bounds.y)), bounds.width, bounds.height); + //boundsGlobal.y -= bounds.height; + // + //boundsGlobal.width -= boundsGlobal.x; + //boundsGlobal.height -= boundsGlobal.y; + + + auto cl = getGlobalRenderClip(); + auto in = getRenderClipRect().intersects(boundsGlobal); + if (!cl || in) { + font->drawFormattedColumn(text, 0, y, getWidth(), horzAlignment); + } + + + } void TextField::setup(TextFieldSettings s) @@ -27,7 +49,9 @@ namespace ofxInterface { font = s.font; text = s.text; - alignment = s.alignment; + horzAlignment = s.horzAlignment; + + alignmentRenderFbo.allocate(1, 1); } void TextField::setText(string text_) @@ -36,6 +60,6 @@ namespace ofxInterface { } void TextField::setAlignment(ofAlignHorz alignment_) { - alignment = alignment_; + horzAlignment = alignment_; } } \ No newline at end of file diff --git a/src/components/TextField.h b/src/components/TextField.h index 92ca903..25ab16b 100644 --- a/src/components/TextField.h +++ b/src/components/TextField.h @@ -7,7 +7,7 @@ namespace ofxInterface { struct TextFieldSettings : NodeSettings{ shared_ptr font; string text; - ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + ofAlignHorz horzAlignment = OF_ALIGN_HORZ_LEFT; }; class TextField : @@ -20,12 +20,14 @@ namespace ofxInterface { virtual void draw(); virtual void setup(TextFieldSettings s); void setText(string text); - void setAlignment(ofAlignHorz alignment); + void setAlignment(ofAlignHorz horzAlignment); private: shared_ptr font; string text; - ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + ofAlignHorz horzAlignment = OF_ALIGN_HORZ_LEFT; + + ofFbo alignmentRenderFbo; }; } diff --git a/src/components/TextInput.cpp b/src/components/TextInput.cpp index 6f5d86f..54d1051 100644 --- a/src/components/TextInput.cpp +++ b/src/components/TextInput.cpp @@ -1,4 +1,12 @@ #include "TextInput.h" +#include "NodeToJsonHelper.h" + +ofxInterface::TextInput::~TextInput() +{ + for (auto& e : keyInputs) { + ofRemoveListener(e, this, &TextInput::keyPressed); + } +} void ofxInterface::TextInput::setup(TextInputSettings settings) { @@ -12,7 +20,7 @@ void ofxInterface::TextInput::setup(TextInputSettings settings) styleInactive = style; styleInactive.color = colorInactive; enableNewline = settings.enableNewline; - alignment = settings.alignment; + horzAlignment = settings.horzAlignment; autoResize = settings.autoResize; if (autoResize) { @@ -35,11 +43,11 @@ void ofxInterface::TextInput::draw() } // draw content if (content.get().size() == 0) { - font->drawColumn(descriptionText, styleInactive, 0, dy, getWidth(), alignment); + font->drawColumn(descriptionText, styleInactive, 0, dy, getWidth(), horzAlignment); //font->draw(descriptionText, styleInactive, 0, dy); }else { //font->draw(content, style, 0, dy); - font->drawColumn(content, style, 0, dy, getWidth(), alignment); + font->drawColumn(content, style, 0, dy, getWidth(), horzAlignment); } // draw index pointer @@ -49,7 +57,7 @@ void ofxInterface::TextInput::draw() vector blocks; blocks.emplace_back(ofxFontStash2::StyledText({ content.get().substr(0, indexPointer), style })); vector lines; - font->layoutLines(blocks, getWidth(), lines, alignment, 0); + font->layoutLines(blocks, getWidth(), lines, horzAlignment, 0); int wLine = 0; if (lines.size() > 0) { @@ -57,10 +65,10 @@ void ofxInterface::TextInput::draw() if (lines.back().elements.size() > 0) { wLine += lines.back().elements.front().x; } - else if (alignment == OF_ALIGN_HORZ_CENTER) { + else if (horzAlignment == OF_ALIGN_HORZ_CENTER) { wLine = getWidth()*0.5; } - else if (alignment == OF_ALIGN_HORZ_RIGHT) { + else if (horzAlignment == OF_ALIGN_HORZ_RIGHT) { wLine = getWidth(); } } @@ -166,6 +174,7 @@ void ofxInterface::TextInput::keyPressed(ofKeyEventArgs & e) { in += "€"; } + else { in += e.key; } if (indexPointer < content->size()) { @@ -205,7 +214,8 @@ void ofxInterface::TextInput::setSize(float w, float h) { // resize font if external resizing if (autoResize) { - float newFontSize = style.fontSize * (w/getWidth()); + // scale to int to reduce jitter while scaling + int newFontSize = style.fontSize * (w/getWidth()); style.fontSize = newFontSize; styleInactive.fontSize = newFontSize; resizeField(); @@ -222,10 +232,10 @@ void ofxInterface::TextInput::setSize(const ofVec2f & s) void ofxInterface::TextInput::setAlignment(ofAlignHorz alignment_) { - alignment = alignment_; + horzAlignment = alignment_; } -void ofxInterface::TextInput::setFontId(string fontId) +void ofxInterface::TextInput::setFont(string fontId) { style.fontID = fontId; styleInactive.fontID = fontId; @@ -241,11 +251,13 @@ void ofxInterface::TextInput::setColor(ofColor main, ofColor inactive) void ofxInterface::TextInput::registerKeyInput(ofEvent& e) { ofAddListener(e, this, &TextInput::keyPressed); + keyInputs.push_back(e); } void ofxInterface::TextInput::unregisterKeyInput(ofEvent & e) { ofRemoveListener(e, this, &TextInput::keyPressed); + } void ofxInterface::TextInput::onTouchDown(TouchEvent & event) @@ -258,6 +270,37 @@ void ofxInterface::TextInput::onTouchMove(TouchEvent & event) setIndexPosition(event.position - getPosition()); } +ofxFontStash2::Style ofxInterface::TextInput::getFontStyle() +{ + return style; +} + +ofJson ofxInterface::TextInput::getNodeJson() +{ + auto ret = ModalElement::getNodeJson(); + ret["nodeType"] = "TextInput"; + ret["maxChars"] = maxChars; + ret["descriptionText"] = descriptionText; + ret["enableNewline"] = enableNewline; + ret["autoResize"] = autoResize; + + switch (horzAlignment) { + case OF_ALIGN_HORZ_LEFT: + ret["alignment"] = "left"; + break; + case OF_ALIGN_HORZ_CENTER: + ret["alignment"] = "center"; + break; + default: + ret["alignment"] = "right"; + break; + } + ret["text"] = content.get(); + ret["style"] = reddo::NodeToJson::styleToJson(style); + return ret; + +} + void ofxInterface::TextInput::sendContentChanged(string content) { string send = content; @@ -266,7 +309,7 @@ void ofxInterface::TextInput::sendContentChanged(string content) resizeField(); } - ofNotifyEvent(contentChangedEvent, send); + ofNotifyEvent(eventContentChanged, send); } void ofxInterface::TextInput::setIndexPosition(ofVec2f touch) @@ -291,12 +334,12 @@ void ofxInterface::TextInput::setIndexPosition(ofVec2f touch) void ofxInterface::TextInput::resizeField() { - string text = content.get().size() > 0 ? content : descriptionText; + string text = content.get().size() > 0 ? content.get() : descriptionText; auto baseRect = font->getTextBounds("X", style, 0, 0); float dy = -baseRect.y - baseRect.height*0.75; if (enableNewline) { - dy = -baseRect.y; + //dy = -baseRect.y; } int w = 0; diff --git a/src/components/TextInput.h b/src/components/TextInput.h index 82fc5af..9e605f4 100644 --- a/src/components/TextInput.h +++ b/src/components/TextInput.h @@ -3,7 +3,6 @@ #include "ModalElement.h" #include "ofxFontStash2.h" - namespace ofxInterface { struct TextInputSettings : public ModalElementSettings { shared_ptr font; @@ -12,7 +11,7 @@ namespace ofxInterface { int maxChars = 30; string descriptionText; bool enableNewline = false; - ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + ofAlignHorz horzAlignment = OF_ALIGN_HORZ_LEFT; bool autoResize = false; @@ -21,7 +20,7 @@ namespace ofxInterface { class TextInput : public ModalElement { public: - + ~TextInput(); void setup(TextInputSettings settings); virtual void draw() override; @@ -33,16 +32,19 @@ namespace ofxInterface { void setSize(float w, float h) override; virtual void setSize(const ofVec2f& s) override; - void setAlignment(ofAlignHorz alignment); - void setFontId(string fontId); + void setAlignment(ofAlignHorz horzAlignment); + void setFont(string fontId); void setColor(ofColor main, ofColor inactive); - ofEvent contentChangedEvent; + ofEvent eventContentChanged; ofEvent returnPressedEvent; void registerKeyInput(ofEvent & e); void unregisterKeyInput(ofEvent & e); + void onTouchDown(TouchEvent& event); + void onTouchMove(TouchEvent& event); + template void addListener(ListenerClass * listener, ListenerMethod method) { content.addListener(listener, method); @@ -53,8 +55,11 @@ namespace ofxInterface { content.removeListener(listener, method); } - void onTouchDown(TouchEvent& event); - void onTouchMove(TouchEvent& event); + + + ofxFontStash2::Style getFontStyle(); + + ofJson getNodeJson() override; protected: void sendContentChanged(string content); @@ -64,7 +69,7 @@ namespace ofxInterface { shared_ptr font; ofxFontStash2::Style style; ofxFontStash2::Style styleInactive; - ofAlignHorz alignment = OF_ALIGN_HORZ_LEFT; + ofAlignHorz horzAlignment = OF_ALIGN_HORZ_LEFT; ofParameter content; string descriptionText; @@ -75,6 +80,8 @@ namespace ofxInterface { bool enableNewline; bool autoResize; + vector< ofEvent> keyInputs; + private: }; diff --git a/src/components/TextureNode.cpp b/src/components/TextureNode.cpp index 67cb580..beca994 100644 --- a/src/components/TextureNode.cpp +++ b/src/components/TextureNode.cpp @@ -13,7 +13,7 @@ namespace ofxInterface { Node * TextureNode::clone() { - auto ret = new Node(*this); + auto ret = new TextureNode(*this); return ret; } @@ -33,14 +33,19 @@ namespace ofxInterface { scaleMode = settings.scaleMode; blendmode = settings.blendmode; tinting = settings.tinting; + horizontalAlign = settings.horizontalAlign; + verticalAlign = settings.verticalAlign; } void TextureNode::draw() { if (texture.isAllocated()) { - if (hardShadowBlend) { - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + if (blendmode == OF_BLENDMODE_ALPHA) { + glEnable(GL_BLEND); + glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); + glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + //glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } else { setBlendMode(blendmode); } @@ -57,11 +62,13 @@ namespace ofxInterface { ofRectangle texCoordst = texCoords; switch (scaleMode) { case OF_SCALEMODE_FIT: - texCoordst.scaleTo(dimensionsT, OF_SCALEMODE_FIT); + texCoordst.scaleTo(dimensionsT, OF_ASPECT_RATIO_KEEP, horizontalAlign, verticalAlign); + //texCoordst.scaleTo(dimensionsT, OF_SCALEMODE_FIT); dimensions = texCoordst; break; case OF_SCALEMODE_FILL: - dimensionsT.scaleTo(texCoords, OF_SCALEMODE_FIT); + //dimensionsT.scaleTo(texCoords, OF_SCALEMODE_FIT); + dimensionsT.scaleTo(texCoords, OF_ASPECT_RATIO_KEEP, horizontalAlign, verticalAlign); texCoords = dimensionsT; break; case OF_SCALEMODE_CENTER: @@ -103,6 +110,27 @@ namespace ofxInterface { tinting = color; } + ofAlignVert TextureNode::getVerticalAlign() + { + return verticalAlign; + } + + void TextureNode::setVerticalAlign(ofAlignVert align) + { + verticalAlign = align; + } + + ofAlignHorz TextureNode::getHorizontalAlign() + { + return horizontalAlign; + } + + void TextureNode::setHorizontalAlign(ofAlignHorz align) + { + horizontalAlign = align; + } + + ofScaleMode TextureNode::getScaleMode() { return scaleMode; } @@ -115,15 +143,6 @@ namespace ofxInterface { return tinting; } - bool TextureNode::isHardShadowblend() { - return hardShadowBlend; - } - - void TextureNode::setHardShadowBlend(bool isHardShadowBlend_) { - - hardShadowBlend = isHardShadowBlend_; - } - void TextureNode::setBlendMode(ofBlendMode blendmode_) { blendmode = blendmode_; } diff --git a/src/components/TextureNode.h b/src/components/TextureNode.h index 5b17c3e..a509761 100644 --- a/src/components/TextureNode.h +++ b/src/components/TextureNode.h @@ -8,6 +8,8 @@ namespace ofxInterface { float alpha = 255; ofScaleMode scaleMode = OF_SCALEMODE_FILL; ofBlendMode blendmode = OF_BLENDMODE_ALPHA; + ofAlignHorz horizontalAlign = OF_ALIGN_HORZ_CENTER; + ofAlignVert verticalAlign = OF_ALIGN_VERT_CENTER; }; class TextureNode : @@ -21,7 +23,7 @@ namespace ofxInterface { void setup(ofTexture& texture); void setup(TextureNodeSettings settings); - virtual void draw(); + virtual void draw() override; void setTexture(ofTexture& texture_); ofTexture getTexture(); @@ -35,8 +37,12 @@ namespace ofxInterface { ofColor getTinting(); void setTinting(ofColor color); - bool isHardShadowblend(); - void setHardShadowBlend(bool isHardShadowBlend); + ofAlignVert getVerticalAlign(); + void setVerticalAlign(ofAlignVert align); + + ofAlignHorz getHorizontalAlign(); + void setHorizontalAlign(ofAlignHorz align); + void setBlendMode(ofBlendMode blendmode); ofEvent eventTextureChanged; @@ -50,8 +56,10 @@ namespace ofxInterface { private: ofColor tinting = ofColor(255); ofScaleMode scaleMode = OF_SCALEMODE_FILL; - bool hardShadowBlend = false; ofBlendMode blendmode = OF_BLENDMODE_ALPHA; + + ofAlignHorz horizontalAlign = OF_ALIGN_HORZ_CENTER; + ofAlignVert verticalAlign = OF_ALIGN_VERT_CENTER; }; } diff --git a/src/effects/EffectDropShadow.cpp b/src/effects/EffectDropShadow.cpp new file mode 100644 index 0000000..00f6d07 --- /dev/null +++ b/src/effects/EffectDropShadow.cpp @@ -0,0 +1,99 @@ +#include "EffectDropShadow.h" + + +namespace ofxInterface +{ + EffectDropShadow::EffectDropShadow() + { + //shaderShadow.load("shaders/blur"); + if (ofIsGLProgrammableRenderer()) { + ofLogVerbose("EffectDropShadow.loadShaders()") << "Programmable renderer detected."; + ofLogVerbose("EffectDropShadow.loadShaders()") << "Loading shader......"; + shaderShadow.setupShaderFromSource(GL_VERTEX_SHADER, shaderDef.vertex); + shaderShadow.setupShaderFromSource(GL_FRAGMENT_SHADER, shaderDef.fragment); + shaderShadow.bindDefaults(); + shaderShadow.linkProgram(); + } + else { + ofLogError("EffectDropShadow", "DropShadow only available for glsl >= ver.3"); + } + } + + + EffectDropShadow::~EffectDropShadow() + { + } + + void EffectDropShadow::setup(EffectDropShadowSettings s) + { + settings = s; + } + + void EffectDropShadow::update(ofFbo in) + { + // only update if size > 0 + if (settings.size > 0) { + int wFbo = in.getWidth() + settings.size * 2; + int hFbo = in.getHeight() + settings.size * 2; + + // allocate new fbo + if (!fboBuffer.isAllocated() || + (settings.isDynamic && + (wFbo != fboBuffer.getWidth() || + hFbo != fboBuffer.getHeight()) + ) + ) { + fboBuffer.allocate(wFbo, hFbo); + fboShadow.allocate(wFbo, hFbo); + + generateShadow(in,fboBuffer, fboShadow, settings); + } + + // update filter + if ((settings.isDynamic && + (wFbo != fboBuffer.getWidth() || + hFbo != fboBuffer.getHeight()) + ) + ) { + generateShadow(in,fboBuffer, fboShadow, settings); + } + } + } + + ofFbo EffectDropShadow::getShadow() + { + return fboShadow; + } + + + void EffectDropShadow::checkAllocated(ofFbo& fbo, int width, int height) + { + if (!fbo.isAllocated() || fbo.getWidth() != width || fbo.getHeight() != height) { + fbo.allocate(width, height); + } + } + void EffectDropShadow::generateShadow(ofFbo in, ofFbo buffer, ofFbo& out, EffectDropShadowSettings settings) + { + + ofFloatColor c = ofFloatColor(settings.color); + + // create buffer fbo + buffer.begin(); + ofClear(0, 0); + ofSetColor(255); + in.draw(settings.size, settings.size); + buffer.end(); + + // apply filter + out.begin(); + shaderShadow.begin(); + shaderShadow.setUniform1i("kernelSize", 40); + shaderShadow.setUniform4f("shadowColor", ofVec4f(c.r, c.g, c.b, c.a)); + shaderShadow.setUniform2f("offset", ofVec2f(settings.size/20)); + + buffer.draw(0, 0); + shaderShadow.end(); + out.end(); + + } +} \ No newline at end of file diff --git a/src/effects/EffectDropShadow.h b/src/effects/EffectDropShadow.h new file mode 100644 index 0000000..c05e6ec --- /dev/null +++ b/src/effects/EffectDropShadow.h @@ -0,0 +1,39 @@ +#pragma once + +#include "ofMain.h" +#include "ofShader.h" +#include "EffectDropShadowShader.h" + +namespace ofxInterface +{ + + struct EffectDropShadowSettings { + ofColor color = ofColor(0); + ofVec2f position = ofVec2f(0); + float size = 0; + bool isDynamic = false; // todo; + }; + + class EffectDropShadow + { + public: + EffectDropShadow(); + ~EffectDropShadow(); + + void setup(EffectDropShadowSettings s); + void update(ofFbo in); + ofFbo getShadow(); + + private: + void checkAllocated(ofFbo& fbo, int width, int height); + void generateShadow(ofFbo in, ofFbo buffer, ofFbo& out, EffectDropShadowSettings settings); + + ofShader shaderShadow; + EffectDropShadowShader shaderDef; + + ofFbo fboBuffer; + ofFbo fboShadow; + EffectDropShadowSettings settings; + }; + +} \ No newline at end of file diff --git a/src/effects/EffectDropShadowShader.h b/src/effects/EffectDropShadowShader.h new file mode 100644 index 0000000..58cfad5 --- /dev/null +++ b/src/effects/EffectDropShadowShader.h @@ -0,0 +1,78 @@ +#pragma once + +#define STRINGIFY(A) #A + +#include "ofMain.h" + +class EffectDropShadowShader { +public: string vertex, fragment; + + EffectDropShadowShader() { + vertex = "#version 150\n"; + vertex += STRINGIFY( + uniform mat4 projectionMatrix; + uniform mat4 modelViewMatrix; + uniform mat4 modelViewProjectionMatrix; + + in vec4 position; + in vec2 texcoord; + + out vec2 texCoordVarying; + + void main() + { + texCoordVarying = texcoord; + gl_Position = modelViewProjectionMatrix * position; + } + ); + + // === Base mask ============================================================================ + fragment = "#version 150\n"; + fragment += STRINGIFY( + // Input params + uniform sampler2DRect tex0; + uniform int kernelSize; + uniform vec2 offset; + uniform vec4 shadowColor; + + in vec2 texCoordVarying; + out vec4 outputColor; + + void main() + { + vec4 accumColor = vec4(0.); + + + vec2 st = texCoordVarying; + float kernelSizef = float(kernelSize); + + + float accumWeight = 0.; + const float k = .15915494; // 1 / (2*PI) + float kernelSize2 = kernelSizef * kernelSizef; + + for (int j = 0; j < kernelSize; j++) { + float y = -.5 * (kernelSizef - 1.) + float(j); + for (int i = 0; i < kernelSize; i++) { + //if(distance(st, st-vec2(j,i))<=kernelSizef ){ // radial filter + float x = -.5 * (kernelSizef - 1.) + float(i); + float weight = (k / kernelSizef) * exp(-(x * x + y * y) / (2. * kernelSize2)); + accumColor += weight * vec4(shadowColor.r, shadowColor.g, shadowColor.b, texture(tex0, st + vec2(x, y) * offset).a); + accumWeight += weight; + // } + + + } + } + accumColor.a*= shadowColor.a; + //outputColor = shadowColor; + outputColor = accumColor / accumWeight; + //outputColor = texture(tex0, st); + + + + } + ); + + } +}; \ No newline at end of file diff --git a/src/effects/GradientShader.cpp b/src/effects/GradientShader.cpp new file mode 100644 index 0000000..30412bb --- /dev/null +++ b/src/effects/GradientShader.cpp @@ -0,0 +1,250 @@ +#include "GradientShader.h" + +const ofShader ofxInterface::getGradientShader3Colors() +{ + ofShader shader; + + string vertex = "#version 150\n"; + vertex += STRINGIFY( + uniform mat4 modelViewProjectionMatrix; + + in vec4 position; + + void main() { + gl_Position = modelViewProjectionMatrix * position; + } + ); + + string frag = "#version 150\n"; + frag += "#define SRGB_TO_LINEAR(c) pow((c), vec4(2.2))\n"; + frag += "#define LINEAR_TO_SRGB(c) pow((c), vec4(1.0 / 2.2))\n"; + frag += "#define SRGB(r, g, b, a) SRGB_TO_LINEAR(vec4(float(r), float(g), float(b),float(a)) / 255.0)\n"; + + frag += STRINGIFY( + uniform vec4 color1; + uniform vec4 color2; + uniform vec4 color3; + + uniform vec2 begin; + uniform vec2 end; + uniform float mid; + uniform vec2 size; + + out vec4 outputColor; + + // Gradient noise from Jorge Jimenez's presentation: + // http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare + float gradientNoise(vec2 uv) + { + const vec3 magic = vec3(0.06711056, 0.00583715, 52.9829189); + return fract(magic.z * fract(dot(uv, magic.xy))); + } + + void main() { + + vec4 scolor1 = SRGB(color1.x, color1.y, color1.z, color1.w); + vec4 scolor2 = SRGB(color2.x, color2.y, color2.z, color2.w); + vec4 scolor3 = SRGB(color3.x, color3.y, color3.z, color3.w); + + vec2 fragCoord = gl_FragCoord.xy / size; + + // Calculate interpolation factor with vector projection. + vec2 ba = end - begin; + float t = dot(fragCoord - begin, ba) / dot(ba, ba); + // Saturate and apply smoothstep to the factor. + vec4 color; + if (t < mid) { + t = smoothstep(0.0, mid, clamp(t, 0.0, 1.0)); + color = mix(scolor1, scolor2, t); + } + else { + t = smoothstep(mid, 1.0, clamp(t, 0.0, 1.0)); + color = mix(scolor2, scolor3, t); + } + + // Convert color from linear to sRGB color space (=gamma encode). + color = LINEAR_TO_SRGB(color); + + // Add gradient noise to reduce banding. + color += (1.0 / 255.0) * gradientNoise(fragCoord) - (0.5 / 255.0); + + outputColor = vec4(color); + } + ); + + shader.unload(); + shader.setupShaderFromSource(GL_VERTEX_SHADER, vertex); + shader.setupShaderFromSource(GL_FRAGMENT_SHADER, frag); + shader.bindDefaults(); + shader.linkProgram(); + + return shader; +} + +const ofShader ofxInterface::getGradientCircularMaskShader() +{ + ofShader shader; + + string vertex = "#version 150\n"; + vertex += STRINGIFY( + uniform mat4 modelViewProjectionMatrix; + + in vec4 position; + + void main() { + gl_Position = modelViewProjectionMatrix * position; + } + ); + + string frag = "#version 150\n"; + frag += "#define SRGB_TO_LINEAR(c) pow((c), vec4(2.2))\n"; + frag += "#define LINEAR_TO_SRGB(c) pow((c), vec4(1.0 / 2.2))\n"; + frag += "#define SRGB(r, g, b, a) SRGB_TO_LINEAR(vec4(float(r), float(g), float(b),float(a)) / 255.0)\n"; + + frag += STRINGIFY( + uniform vec4 color1; + uniform vec4 color2; + uniform vec4 color3; + + uniform float radius; + uniform vec2 mouse; + uniform vec2 begin; + uniform vec2 end; + uniform float mid; + uniform vec2 size; + + out vec4 outputColor; + + // Gradient noise from Jorge Jimenez's presentation: + // http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare + float gradientNoise(vec2 uv) + { + const vec3 magic = vec3(0.06711056, 0.00583715, 52.9829189); + return fract(magic.z * fract(dot(uv, magic.xy))); + } + + void main() { + + vec4 scolor1 = SRGB(color1.x, color1.y, color1.z, color1.w); + vec4 scolor2 = SRGB(color2.x, color2.y, color2.z, color2.w); + vec4 scolor3 = SRGB(color3.x, color3.y, color3.z, color3.w); + + vec2 fragCoord = gl_FragCoord.xy / size; + + // Calculate interpolation factor with vector projection. + vec2 ba = end - begin; + float t = dot(fragCoord - begin, ba) / dot(ba, ba); + // Saturate and apply smoothstep to the factor. + vec4 color; + if (t < mid) { + t = smoothstep(0.0, mid, clamp(t, 0.0, 1.0)); + color = mix(scolor1, scolor2, t); + } + else { + t = smoothstep(mid, 1.0, clamp(t, 0.0, 1.0)); + color = mix(scolor2, scolor3, t); + } + + // Convert color from linear to sRGB color space (=gamma encode). + color = LINEAR_TO_SRGB(color); + + // Add gradient noise to reduce banding. + color += (1.0 / 255.0) * gradientNoise(fragCoord) - (0.5 / 255.0); + + // mask out shader + if (distance(gl_FragCoord.xy, mouse) > radius) { + color = vec4(0, 0, 0, 0); + } + + outputColor = vec4(color); + } + ); + + shader.unload(); + shader.setupShaderFromSource(GL_VERTEX_SHADER, vertex); + shader.setupShaderFromSource(GL_FRAGMENT_SHADER, frag); + shader.bindDefaults(); + shader.linkProgram(); + + return shader; +} + +const ofShader ofxInterface::getGradientShader2Colors() +{ + ofShader shader; + + string vertex = "#version 150\n"; + vertex += STRINGIFY( + uniform mat4 modelViewProjectionMatrix; + + in vec4 position; + + void main() { + gl_Position = modelViewProjectionMatrix * position; + } + ); + + string frag = "#version 150\n"; + frag += "#define SRGB_TO_LINEAR(c) pow((c), vec4(2.2))\n"; + frag += "#define LINEAR_TO_SRGB(c) pow((c), vec4(1.0 / 2.2))\n"; + frag += "#define SRGB(r, g, b, a) SRGB_TO_LINEAR(vec4(float(r), float(g), float(b),float(a)) / 255.0)\n"; + + frag += STRINGIFY( + uniform vec4 color1; + uniform vec4 color2; + + uniform vec2 begin; + uniform vec2 end; + uniform vec2 size; + + out vec4 outputColor; + + // Gradient noise from Jorge Jimenez's presentation: + // http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare + float gradientNoise(vec2 uv) + { + const vec3 magic = vec3(0.06711056, 0.00583715, 52.9829189); + return fract(magic.z * fract(dot(uv, magic.xy))); + } + + void main() { + + vec4 scolor1 = SRGB(color1.x, color1.y, color1.z, color1.w); + vec4 scolor2 = SRGB(color2.x, color2.y, color2.z, color2.w); + + vec2 fragCoord = gl_FragCoord.xy / size; + + // Calculate interpolation factor with vector projection. + vec2 ba = end - begin; + float t = dot(fragCoord - begin, ba) / dot(ba, ba); + // Saturate and apply smoothstep to the factor. + vec4 color; + + t = smoothstep(0.0, 1.0, clamp(t, 0.0, 1.0)); + color = mix(scolor1, scolor2, t); + + + + // Convert color from linear to sRGB color space (=gamma encode). + color = LINEAR_TO_SRGB(color); + + // Add gradient noise to reduce banding. + color += (1.0 / 255.0) * gradientNoise(fragCoord) - (0.5 / 255.0); + + outputColor = vec4(color); + } + ); + + shader.unload(); + shader.setupShaderFromSource(GL_VERTEX_SHADER, vertex); + shader.setupShaderFromSource(GL_FRAGMENT_SHADER, frag); + shader.bindDefaults(); + shader.linkProgram(); + + return shader; +} + +const ofVec4f ofxInterface::colorToVec4(ofColor c) +{ + return ofVec4f(c.r, c.g, c.b, c.a); +} diff --git a/src/effects/GradientShader.h b/src/effects/GradientShader.h new file mode 100644 index 0000000..77a199c --- /dev/null +++ b/src/effects/GradientShader.h @@ -0,0 +1,12 @@ +#pragma once + +#include "ofMain.h" + +#define STRINGIFY(A) #A + +namespace ofxInterface { + const ofShader getGradientShader3Colors(); + const ofShader getGradientShader2Colors(); + const ofShader getGradientCircularMaskShader(); + const ofVec4f colorToVec4(ofColor c); +} \ No newline at end of file