From b8da54c053b4b49ae15c3ed458edcfe7d1c616f8 Mon Sep 17 00:00:00 2001
From: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com>
Date: Sun, 4 Sep 2022 19:18:17 -0400
Subject: [PATCH] Add the application CAM360
Add the application CAM360
(Formerly known as RPO360, but with significant modifications)
---
applications/cam360/cam360.html | 406 ++++++++++++
applications/cam360/cam360.js | 605 ++++++++++++++++++
applications/cam360/grabDetection.js | 50 ++
.../resources/fonts/FiraSans-SemiBold.ttf | Bin 0 -> 437824 bytes
.../cam360/resources/images/default.jpg | Bin 0 -> 454639 bytes
.../resources/images/icons/cam360-a.svg | 58 ++
.../resources/images/icons/cam360-i.svg | 64 ++
applications/cam360/resources/images/off.png | Bin 0 -> 2374 bytes
applications/cam360/resources/images/on.png | Bin 0 -> 2516 bytes
.../cam360/resources/images/processing.gif | Bin 0 -> 3144 bytes
.../cam360/resources/marzipano/LICENSE.txt | 202 ++++++
.../cam360/resources/marzipano/marzipano.js | 16 +
.../cam360/resources/models/black.json | 17 +
.../cam360/resources/models/cam360.fbx | Bin 0 -> 657708 bytes
.../cam360/resources/models/cam360black.fst | 3 +
.../cam360/resources/models/cam360white.fst | 3 +
.../cam360/resources/models/glass.json | 16 +
.../cam360/resources/models/greenLight.json | 21 +
.../cam360/resources/models/redLight.json | 21 +
.../cam360/resources/sounds/cameraOn.wav | Bin 0 -> 108952 bytes
applications/cam360/resources/sounds/snap.wav | Bin 0 -> 61000 bytes
applications/metadata.js | 9 +
22 files changed, 1491 insertions(+)
create mode 100644 applications/cam360/cam360.html
create mode 100644 applications/cam360/cam360.js
create mode 100644 applications/cam360/grabDetection.js
create mode 100644 applications/cam360/resources/fonts/FiraSans-SemiBold.ttf
create mode 100644 applications/cam360/resources/images/default.jpg
create mode 100644 applications/cam360/resources/images/icons/cam360-a.svg
create mode 100644 applications/cam360/resources/images/icons/cam360-i.svg
create mode 100644 applications/cam360/resources/images/off.png
create mode 100644 applications/cam360/resources/images/on.png
create mode 100644 applications/cam360/resources/images/processing.gif
create mode 100644 applications/cam360/resources/marzipano/LICENSE.txt
create mode 100644 applications/cam360/resources/marzipano/marzipano.js
create mode 100644 applications/cam360/resources/models/black.json
create mode 100644 applications/cam360/resources/models/cam360.fbx
create mode 100644 applications/cam360/resources/models/cam360black.fst
create mode 100644 applications/cam360/resources/models/cam360white.fst
create mode 100644 applications/cam360/resources/models/glass.json
create mode 100644 applications/cam360/resources/models/greenLight.json
create mode 100644 applications/cam360/resources/models/redLight.json
create mode 100644 applications/cam360/resources/sounds/cameraOn.wav
create mode 100644 applications/cam360/resources/sounds/snap.wav
diff --git a/applications/cam360/cam360.html b/applications/cam360/cam360.html
new file mode 100644
index 0000000..519a82d
--- /dev/null
+++ b/applications/cam360/cam360.html
@@ -0,0 +1,406 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CAM360 v2.0
+ |
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+ |
+
+
+
+
+
+
+ Throw the camera in the air to take a 360 degrees snapshot!
+
+
+
+
+
+ You can also click on the thumbstick on your right controller.
+
+ |
+
+
+
+ |
+
+
+
+
+
diff --git a/applications/cam360/cam360.js b/applications/cam360/cam360.js
new file mode 100644
index 0000000..fb42aec
--- /dev/null
+++ b/applications/cam360/cam360.js
@@ -0,0 +1,605 @@
+"use strict";
+//
+// cam360.js
+//
+// Created by Zach Fox on 2018-10-26
+// Copyright 2018 High Fidelity, Inc.
+// Copyright 2022, Overte e.V.
+//
+// Application to take 360 degrees photo by throwing a camera in the air (as in Ready Player One (RPO)) or as a standard positionned camera.
+// version 2.0
+//
+// Distributed under the Apache License, Version 2.0
+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
+//
+
+(function () { // BEGIN LOCAL_SCOPE
+
+ // Function Name: inFrontOf()
+ // Description:
+ // - Returns the position in front of the given "position" argument, where the forward vector is based off
+ // the "orientation" argument and the amount in front is based off the "distance" argument.
+ function inFrontOf(distance, position, orientation) {
+ return Vec3.sum(position || MyAvatar.position,
+ Vec3.multiply(distance, Quat.getForward(orientation || MyAvatar.orientation)));
+ }
+
+ // Function Name: rpo360On()
+ var CAMERA_NAME = "CAM360 Camera";
+ var SETTING_LAST_360_CAPTURE = "overte_app_cam360_last_capture";
+ var secondaryCameraConfig = Render.getConfig("SecondaryCamera");
+ var camera = false;
+ var cameraRotation;
+ var cameraPosition;
+ var cameraGravity = {x: 0, y: -5, z: 0};
+ var velocityLoopInterval = false;
+ var isThrowMode = true;
+
+ function rpo360On() {
+ // Rez the camera model, and attach
+ // the secondary camera to the rezzed model.
+ cameraRotation = MyAvatar.orientation;
+ cameraPosition = inFrontOf(1.0, Vec3.sum(MyAvatar.position, { x: 0, y: 0.3, z: 0 }));
+ var properties;
+ var hostType = "";
+ if (isThrowMode) {
+ properties = {
+ "angularDamping": 0.08,
+ "canCastShadow": false,
+ "damping": 0.01,
+ "collisionMask": 7,
+ "modelURL": Script.resolvePath("resources/models/cam360white.fst"),
+ "name": CAMERA_NAME,
+ "rotation": cameraRotation,
+ "position": cameraPosition,
+ "shapeType": "simple-compound",
+ "type": "Model",
+ "grab": {
+ "grabbable": true
+ },
+ "script": Script.resolvePath("grabDetection.js"),
+ "userData": "",
+ "isVisibleInSecondaryCamera": false,
+ "gravity": cameraGravity,
+ "dynamic": true
+ };
+ hostType = "local";
+ } else {
+ properties = {
+ "canCastShadow": false,
+ "collisionMask": 7,
+ "modelURL": Script.resolvePath("resources/models/cam360black.fst"),
+ "name": CAMERA_NAME,
+ "rotation": cameraRotation,
+ "position": cameraPosition,
+ "shapeType": "sphere",
+ "type": "Model",
+ "grab": {
+ "grabbable": true
+ },
+ "userData": "",
+ "isVisibleInSecondaryCamera": false
+ };
+ hostType = "avatar";
+ }
+
+ camera = Entities.addEntity(properties, hostType);
+ secondaryCameraConfig.attachedEntityId = camera;
+
+ // Play a little sound to let the user know we've rezzed the camera
+ Audio.playSound(SOUND_CAMERA_ON, {
+ "volume": 0.15,
+ "position": cameraPosition,
+ "localOnly": true
+ });
+
+ // Remove the existing camera model from the domain if one exists.
+ // It's easy for this to happen if the user crashes while the RPO360 Camera is on.
+ // We do this down here (after the new one is rezzed) so that we don't accidentally delete
+ // the newly-rezzed model.
+ var entityIDs = Entities.findEntitiesByName(CAMERA_NAME, MyAvatar.position, 100, false);
+ entityIDs.forEach(function (currentEntityID) {
+ var currentEntityOwner = Entities.getEntityProperties(currentEntityID, ['owningAvatarID']).owningAvatarID;
+ if (currentEntityOwner === MyAvatar.sessionUUID && currentEntityID !== camera) {
+ Entities.deleteEntity(currentEntityID);
+ }
+ });
+
+ setTakePhotoControllerMappingStatus();
+
+ // Start the velocity loop interval at 70ms
+ // This is used to determine when the 360 photo should be snapped
+ if (isThrowMode) {
+ velocityLoopInterval = Script.setInterval(velocityLoop, 70);
+ }
+ }
+
+ // Function Name: velocityLoop()
+ var hasBeenThrown = false;
+ var snapshotVelocity = false;
+ var snapshotAngularVelocity = false;
+ var velocityWasPositive = false;
+ var cameraReleaseTime = false;
+ var MIN_AIRTIME_MS = 500;
+ var flash = false;
+ var useFlash = false;
+ function velocityLoop() {
+ // Get the velocity and angular velocity of the camera model
+ var properties = Entities.getEntityProperties(camera, ["velocity", "angularVelocity", "userData"]);
+ var velocity = properties.velocity;
+ var angularVelocity = properties.angularVelocity;
+ var releasedState = properties.userData;
+
+ if (releasedState === "RELEASED" && !hasBeenThrown) {
+ hasBeenThrown = true;
+ // Record the time at which a user has thrown the camera
+ cameraReleaseTime = Date.now();
+ }
+
+ // If we've been thrown UP...
+ if (hasBeenThrown && velocity.y > 0) {
+ // Set this flag to true
+ velocityWasPositive = true;
+ }
+
+ // If we've been thrown UP in the past, but now we're coming DOWN...
+ if (hasBeenThrown && velocityWasPositive && velocity.y < 0) {
+ // Reset the state machine
+ hasBeenThrown = false;
+ velocityWasPositive = false;
+ // Don't take a snapshot if the camera hasn't been in the air for very long
+ if (Date.now() - cameraReleaseTime <= MIN_AIRTIME_MS) {
+ Entities.editEntity(camera, {
+ "userData": ""
+ });
+ return;
+ }
+ // Save these properties so that the camera falls realistically
+ // after it's taken the 360 snapshot
+ snapshotVelocity = velocity;
+ snapshotAngularVelocity = angularVelocity;
+ // Freeze the camera model and make it not grabbable
+ Entities.editEntity(camera, {
+ "velocity": {"x": 0, "y": 0, "z": 0},
+ "angularVelocity": {"x": 0, "y": 0, "z": 0},
+ "gravity": {"x": 0, "y": 0, "z": 0},
+ "grab": {
+ "grabbable": false
+ },
+ "userData": ""
+ });
+ // Add a "flash" to the camera that illuminates the ground below the camera
+ if (useFlash) {
+ flash = Entities.addEntity({
+ "collidesWith": "",
+ "collisionMask": 0,
+ "color": {
+ "blue": 173,
+ "green": 252,
+ "red": 255
+ },
+ "dimensions": {
+ "x": 100,
+ "y": 100,
+ "z": 100
+ },
+ "dynamic": false,
+ "falloffRadius": 10,
+ "intensity": 1,
+ "isSpotlight": false,
+ "localRotation": { w: 1, x: 0, y: 0, z: 0 },
+ "name": CAMERA_NAME + "_Flash",
+ "type": "Light",
+ "parentID": camera
+ }, "local");
+ }
+ // Take the snapshot!
+ maybeTake360Snapshot();
+ }
+ }
+
+ function capture() {
+ if (!isThrowMode) {
+ if (useFlash) {
+ flash = Entities.addEntity({
+ "collidesWith": "",
+ "collisionMask": 0,
+ "color": {
+ "blue": 173,
+ "green": 252,
+ "red": 255
+ },
+ "dimensions": {
+ "x": 100,
+ "y": 100,
+ "z": 100
+ },
+ "dynamic": false,
+ "falloffRadius": 10,
+ "intensity": 1,
+ "isSpotlight": false,
+ "localRotation": { w: 1, x: 0, y: 0, z: 0 },
+ "name": CAMERA_NAME + "_Flash",
+ "type": "Light",
+ "parentID": camera
+ }, "avatar");
+ }
+ // Take the snapshot!
+ maybeTake360Snapshot();
+ }
+ }
+
+ // Function Name: rpo360Off()
+ var WAIT_AFTER_DOMAIN_SWITCH_BEFORE_CAMERA_DELETE_MS = 1 * 1000;
+ function rpo360Off(isChangingDomains) {
+ if (velocityLoopInterval) {
+ Script.clearInterval(velocityLoopInterval);
+ velocityLoopInterval = false;
+ }
+
+ function deleteCamera() {
+ if (flash) {
+ Entities.deleteEntity(flash);
+ flash = false;
+ }
+ if (camera) {
+ Entities.deleteEntity(camera);
+ camera = false;
+ }
+ //buttonActive(ui.isOpen);
+ }
+
+ secondaryCameraConfig.attachedEntityId = false;
+ if (camera) {
+ // Workaround for Avatar Entities not immediately having properties after
+ // the "Window.domainChanged()" signal is emitted.
+ // May no longer be necessary; untested...
+ if (isChangingDomains) {
+ Script.setTimeout(function () {
+ deleteCamera();
+ rpo360On();
+ }, WAIT_AFTER_DOMAIN_SWITCH_BEFORE_CAMERA_DELETE_MS);
+ } else {
+ deleteCamera();
+ }
+ }
+ setTakePhotoControllerMappingStatus();
+ }
+
+ var isCurrentlyTaking360Snapshot = false;
+ var processing360Snapshot = false;
+ function maybeTake360Snapshot() {
+ // Don't take a snapshot if we're currently in the middle of taking one
+ // or if the camera entity doesn't exist
+ if (!isCurrentlyTaking360Snapshot && camera) {
+ isCurrentlyTaking360Snapshot = true;
+ var currentCameraPosition = Entities.getEntityProperties(camera, ["position"]).position;
+ // Play a sound at the current camera position
+ Audio.playSound(SOUND_SNAPSHOT, {
+ "position": { "x": currentCameraPosition.x, "y": currentCameraPosition.y, "z": currentCameraPosition.z },
+ "localOnly": isThrowMode,
+ "volume": 0.8
+ });
+ Window.takeSecondaryCamera360Snapshot(currentCameraPosition);
+ used360AppToTakeThisSnapshot = true;
+ processing360Snapshot = true;
+
+ // Let the UI know we're processing a 360 snapshot now
+ tablet.emitScriptEvent(JSON.stringify({
+ "channel": channel,
+ "method": "startedProcessing360Snapshot"
+ }));
+ }
+ }
+
+ function on360SnapshotTaken(path) {
+ isCurrentlyTaking360Snapshot = false;
+ // Make the camera fall back to the ground with the same
+ // physical properties as when it froze in the air
+ if (isThrowMode) {
+ Entities.editEntity(camera, {
+ "velocity": snapshotVelocity,
+ "angularVelocity": snapshotAngularVelocity,
+ "gravity": cameraGravity,
+ "grab": {
+ "grabbable": true
+ }
+ });
+ }
+ // Delete the flash entity
+ if (flash) {
+ Entities.deleteEntity(flash);
+ flash = false;
+ }
+ //console.log('360 Snapshot taken. Path: ' + path);
+
+ //update UI
+ tablet.emitScriptEvent(JSON.stringify({
+ "channel": channel,
+ "method": "last360ThumbnailURL",
+ "last360ThumbnailURL": path
+ }));
+ last360ThumbnailURL = path;
+ Settings.setValue(SETTING_LAST_360_CAPTURE, last360ThumbnailURL);
+ processing360Snapshot = false;
+ tablet.emitScriptEvent(JSON.stringify({
+ "channel": channel,
+ "method": "finishedProcessing360Snapshot"
+ }));
+ }
+
+
+ var last360ThumbnailURL = Settings.getValue(SETTING_LAST_360_CAPTURE, "");
+ var used360AppToTakeThisSnapshot = false;
+
+ function onDomainChanged() {
+ rpo360Off(true);
+ }
+
+ // These functions will be called when the script is loaded.
+ var SOUND_CAMERA_ON = SoundCache.getSound(Script.resolvePath("resources/sounds/cameraOn.wav"));
+ var SOUND_SNAPSHOT = SoundCache.getSound(Script.resolvePath("resources/sounds/snap.wav"));
+
+
+ var jsMainFileName = "cam360.js";
+ var ROOT = Script.resolvePath('').split(jsMainFileName)[0];
+
+ var APP_NAME = "CAM360";
+ var APP_URL = ROOT + "cam360.html";
+ var APP_ICON_INACTIVE = ROOT + "resources/images/icons/cam360-i.svg";
+ var APP_ICON_ACTIVE = ROOT + "resources/images/icons/cam360-a.svg";
+ var appStatus = false;
+ var channel = "cam360.ak.overte.com";
+
+ var timestamp = 0;
+ var INTERCALL_DELAY = 200; //0.3 sec
+ var DEG_TO_RAD = Math.PI/180;
+
+ var tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system");
+
+ Window.domainChanged.connect(onDomainChanged);
+ Window.snapshot360Taken.connect(on360SnapshotTaken);
+ HMD.displayModeChanged.connect(onHMDChanged);
+
+ camera = false;
+
+ tablet.screenChanged.connect(onScreenChanged);
+
+ var button = tablet.addButton({
+ text: APP_NAME,
+ icon: APP_ICON_INACTIVE,
+ activeIcon: APP_ICON_ACTIVE
+ });
+
+
+ function clicked(){
+ if (appStatus === true) {
+ tablet.webEventReceived.disconnect(onAppWebEventReceived);
+ tablet.gotoHomeScreen();
+ appStatus = false;
+ }else{
+ tablet.gotoWebScreen(APP_URL);
+ tablet.webEventReceived.connect(onAppWebEventReceived);
+ appStatus = true;
+ }
+
+ button.editProperties({
+ isActive: appStatus || camera
+ });
+ }
+
+ button.clicked.connect(clicked);
+
+
+ function onAppWebEventReceived(message){
+ var d = new Date();
+ var n = d.getTime();
+ var messageObj = JSON.parse(message);
+ if (messageObj.channel === channel) {
+ if (messageObj.method === "rpo360On" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ rpo360On();
+
+ } else if (messageObj.method === "rpo360Off" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ rpo360Off();
+
+ } else if (messageObj.method === "openSettings" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ if ((HMD.active && Settings.getValue("hmdTabletBecomesToolbar", false)) || (!HMD.active && Settings.getValue("desktopTabletBecomesToolbar", true))) {
+ Desktop.show("hifi/dialogs/GeneralPreferencesDialog.qml", "GeneralPreferencesDialog");
+ } else {
+ tablet.pushOntoStack("hifi/tablet/TabletGeneralPreferences.qml");
+ }
+
+ } else if (messageObj.method === "disableFlash" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ useFlash = false;
+
+ } else if (messageObj.method === "enableFlash" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ useFlash = true;
+
+ } else if (messageObj.method === "uiReady" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ tablet.emitScriptEvent(JSON.stringify({
+ "channel": channel,
+ "method": "initializeUI",
+ "masterSwitchOn": !!camera,
+ "last360ThumbnailURL": last360ThumbnailURL,
+ "processing360Snapshot": processing360Snapshot,
+ "useFlash": useFlash,
+ "isThrowMode": isThrowMode
+ }));
+
+ } else if (messageObj.method === "ThrowMode" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ isThrowMode = true;
+ if (camera) {
+ rpo360Off();
+ rpo360On();
+ }
+ } else if (messageObj.method === "PositionMode" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ isThrowMode = false;
+ if (camera) {
+ rpo360Off();
+ rpo360On();
+ }
+ } else if (messageObj.method === "Capture" && (n - timestamp) > INTERCALL_DELAY) {
+ d = new Date();
+ timestamp = d.getTime();
+ if (camera) {
+ capture();
+ }
+ }
+
+ }
+ }
+ var udateSignateDisconnected = true;
+ function onScreenChanged(type, url) {
+ if (type === "Web" && url.indexOf(APP_URL) !== -1) {
+ appStatus = true;
+ Script.update.connect(myTimer);
+ udateSignateDisconnected = false;
+ } else {
+ appStatus = false;
+ if (!udateSignateDisconnected) {
+ Script.update.disconnect(myTimer);
+ udateSignateDisconnected = true;
+ }
+ }
+
+ button.editProperties({
+ isActive: appStatus || camera
+ });
+ }
+
+ function myTimer(deltaTime) {
+ var yaw = 0.0;
+ var pitch = 0.0;
+ var roll = 0.0;
+ var euler;
+ if (!HMD.active) {
+ //Use cuser camera for destop
+ euler = Quat.safeEulerAngles(Camera.orientation);
+ yaw = -euler.y;
+ pitch = -euler.x;
+ roll = -euler.z;
+ } else {
+ //Use Tablet orientation for HMD
+ var tabletRotation = Entities.getEntityProperties(HMD.tabletID, ["rotation"]).rotation;
+ var noRoll = Quat.cancelOutRoll(tabletRotation); //Pushing the roll is getting quite complexe
+ euler = Quat.safeEulerAngles(noRoll);
+ yaw = euler.y - 180;
+ if (yaw < -180) { yaw = yaw + 360;}
+ yaw = -yaw;
+ pitch = euler.x;
+ roll = 0;
+ }
+
+ tablet.emitScriptEvent(JSON.stringify({
+ "channel": channel,
+ "method": "yawPitchRoll",
+ "yaw": yaw,
+ "pitch": pitch,
+ "roll": roll
+ }));
+
+ }
+
+ function cleanup() {
+
+ if (appStatus) {
+ tablet.gotoHomeScreen();
+ tablet.webEventReceived.disconnect(onAppWebEventReceived);
+ if (!udateSignateDisconnected) {
+ Script.update.disconnect(myTimer);
+ udateSignateDisconnected = true;
+ }
+ }
+
+ tablet.screenChanged.disconnect(onScreenChanged);
+ tablet.removeButton(button);
+
+ rpo360Off();
+
+ if (takePhotoControllerMapping) {
+ takePhotoControllerMapping.disable();
+ }
+
+ Window.domainChanged.disconnect(onDomainChanged);
+ Window.snapshot360Taken.disconnect(on360SnapshotTaken);
+ HMD.displayModeChanged.disconnect(onHMDChanged);
+ }
+
+ Script.scriptEnding.connect(cleanup);
+
+ //controller
+ function setTakePhotoControllerMappingStatus() {
+ if (!takePhotoControllerMapping) {
+ return;
+ }
+ if (!isThrowMode) {
+ takePhotoControllerMapping.enable();
+ } else {
+ takePhotoControllerMapping.disable();
+ }
+ }
+
+ var takePhotoControllerMapping;
+ var takePhotoControllerMappingName = 'Overte-cam360-Mapping-Capture';
+ function registerTakePhotoControllerMapping() {
+ takePhotoControllerMapping = Controller.newMapping(takePhotoControllerMappingName);
+ if (controllerType === "OculusTouch") {
+ takePhotoControllerMapping.from(Controller.Standard.RS).to(function (value) {
+ if (value === 1.0) {
+ if (camera) {
+ capture();
+ }
+ }
+ return;
+ });
+ } else if (controllerType === "Vive") {
+ takePhotoControllerMapping.from(Controller.Standard.RightPrimaryThumb).to(function (value) {
+ if (value === 1.0) {
+ if (camera) {
+ capture();
+ }
+ }
+ return;
+ });
+ }
+ }
+
+ var controllerType = "Other";
+ function registerButtonMappings() {
+ var VRDevices = Controller.getDeviceNames().toString();
+ if (VRDevices) {
+ if (VRDevices.indexOf("Vive") !== -1) {
+ controllerType = "Vive";
+ } else if (VRDevices.indexOf("OculusTouch") !== -1) {
+ controllerType = "OculusTouch";
+ } else {
+ return; // Neither Vive nor Touch detected
+ }
+ }
+
+ if (!takePhotoControllerMapping) {
+ registerTakePhotoControllerMapping();
+ }
+ }
+
+ function onHMDChanged(isHMDMode) {
+ registerButtonMappings();
+ }
+
+}());
diff --git a/applications/cam360/grabDetection.js b/applications/cam360/grabDetection.js
new file mode 100644
index 0000000..4f69709
--- /dev/null
+++ b/applications/cam360/grabDetection.js
@@ -0,0 +1,50 @@
+"use strict";
+//
+// grabDetection.js
+//
+// Created by Alezia Kurdis on August 26th, 2022
+// Copyright 2022 Overte e.V.
+//
+// Distributed under the Apache License, Version 2.0
+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
+//
+(function(){
+
+ var _this;
+
+ DetectGrabbed = function() {
+ _this = this;
+ };
+
+ DetectGrabbed.prototype = {
+ setRightHand: function () {
+ //print("I am being held in a right hand... entity:" + this.entityID);
+ },
+ setLeftHand: function () {
+ //print("I am being held in a left hand... entity:" + this.entityID);
+ },
+ startDistantGrab: function () {
+ //print("I am being distance held... entity:" + this.entityID);
+ },
+ continueDistantGrab: function () {
+ //print("I continue to be distance held... entity:" + this.entityID);
+ },
+ startNearGrab: function () {
+ //print("I was just grabbed... entity:" + this.entityID);
+ },
+ continueNearGrab: function () {
+ //print("I am still being grabbed... entity:" + this.entityID);
+ },
+
+ releaseGrab: function () {
+ //print("I was released... entity:" + this.entityID);
+ Entities.editEntity(this.entityID, {"userData": "RELEASED"});
+ },
+
+ preload: function(entityID) {
+ this.entityID = entityID;
+ },
+ };
+
+ return new DetectGrabbed();
+})
diff --git a/applications/cam360/resources/fonts/FiraSans-SemiBold.ttf b/applications/cam360/resources/fonts/FiraSans-SemiBold.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..821a43d7fd25967a72ebe7b828fd8d1491767de6
GIT binary patch
literal 437824
zcmeEv4R}>Ywf35Q&Pj4YO6keT`A>36DNU0QLK2b?LP)kWr4%Veq!bY;rHGUwQlu1-
zB65*(kyeT{Qlyk(iWIp(F}EUeDI^2kx0ayT`Y$`2(dCEhnPnta~1~
zZyU}3A*B>;Axe2+_U9j*+y3R!y_7O=BGLWN&z^JN?Aty!Orwtn{-?>~f5yL=JpM-i
zHuCtl`}dH?|0DlT$m4%AJ)JzH(E$I${)b8U7x=$Sntzdh5efez{zpjjf5rb*68@$B
zuaV|o?q5#A|ET{_()=s@D@geN*}sZ3|6~5g$m4(9{{(6NHU4js@UQhhNt(aG-$26u
zE&sPj^RM%-BjJC_{}gHd_5SrF{NMI(AkF`@|7jBbXZ+8Q@Ne>OBF+D-|5+0L&Hl}#
z`5XO>r1_uoKS#p9#lM9-{_py?lIDNjzm0@{yMH?g|G)Tmkmld%-$}y%g8%y@{7wEQ
z()|DG-$TOxBma*``1kquk>-EN{}KuRkNrO;&A;EjpM?J>{-2QMf7Aab()<_we%Q$B>ZosYow+7(*2~Rr>CcrKs%(1GVd|+4yzwImSXolJZB~qes<1%_fyTx
zd*;rf(d6Z3GEMyLNeRk#Q3PE}*;L@7Xw-{xsE}$Yy{`WDB#o+@a7&UVeynb6l4g8t
z%-AH&zrAikl9qk^j*&@PGkWChN!m2#j*lm4$5@WDZ|s=clXOJo=%MQ
ziqtP3WzzN3U;Rpen?Cr<1AMfWHR*2KZax?}EP<{z3RhAGrU4`?Zts&%?jOzQ+qc06z)82!1vE5%9;up9X&}
z{3Y-oho)r5TH&Mfy(CB@5BlamGWL*+xG;|DDRMH|#mwHSR$RBe)f@6MBdzci0h1d;f+tCXScH=_Fp>D^pVj3GWZhmq~kh2UCtGTeec1K2K!+oN}nAdDd(-U!kDc
zY+f>(&0m2$4m$!s+*@juF>bn}w=wt0Y4QI6RH9vu3H
z`4-iiEoQ6PLQ(UN7eK0
zM_Dtnj@)tnyIe=9%(Fyj11>4IV~4VJ{6&O1ctuKPw(>v5mX9)UZN051Z&+nezqyoL
z-nT9Ke~;^23ad5Qp`2(%$f;^v%7=Eg${$2*E|Y3=*+NzdxOB-6F}eP%&@@W3`TV!I
z4pMx0hq5`cQ}V;IuuJ+s>C~8X9Jh}97x!Qy3R2J=*F1n$l%u%WDm7@_W@q6au=tpN
zG#mFNu7C?DUe2uHRx1H
zxy0I1jb0wbR?k(=Y9q-(xpe4XE;oe-5wQ=)>1Cr-R|8xw-g`TnU^Td>NzYg
zYdBR;wgyDMur-@i6YL~a#n#K__tOnDYTkKK%NbBc-{BXHU+t9Nd`~+fExG
zId&D#P-o3%v(Y?jHnLVQn_2hqti{@gYXG&74qGK1v;*cIbBB2V|8|(ItS5M#fH|=R
zTH=6tmeS1~wvBSYY=jXkMbAw0~Gc^oz4ntFaw}G0^%!
zYftJ$X+d=}u3VNF@`BDqx$H4$&DnPEWTb3yYh+62B1K|7u`TPa1&%}NjQ>JD}Jz%yoo#Wy!>!en*-FyR9G;08i7N-_0Auf5@Nxfp#
zk0mW~v21W_jlgRjtd$Uol?&v8-6kajM=r7IV_lv3viS?vgk3|VL+v%1&E^hhOV))g
zR!_BcrgZ6u!8(?8CD#P+9kG5@s|v+Y?LnAGj}kYcHZD1K7(4EDNWBQZxaMSAGw(fi
z&AzX5TDr6AruMn!mHu;T@S|~E`PmfLto*k+NN(+Rd?06)lbtO|x2|)j(<}e)IrNT>
zI!C#8lTOCwUBh>)Cx_qr%@iM@IH&Di%{%YSM}B^hLU``?in-HlHBV3u
z?*y?uNKv{LT8j6j-iDrUp&aPzSIjqHaR+(UFwdI5FfUP|*<$_{vrxL(V*VRNEvxnK
zbMH0|KB$xPV&}H%>SPRO7Bzn>XJNFeHD}53iv8)Xwqs`pUEl54{;=-DaCyJD?-$;!
zQ}h1&IeS!g8rL@6<*f0{&jwuNcXd3sb{p6!uMgwc8t5)Q_w}xHwg@EEy>H_<^BD)f
zn?qUIGJGE!-f^75{Im1>Z*%Wm$L=u(yC$deTx$N2HG!44gVoz?IdG$48you
z-MKc*v(mPPO~w1_j{W&JI@F;p{YULSQqCW$H*=j@wa(5h$-7}kD?>jy_NdxFv|32@
zb$bU6j_q$A8J(mw56Qe?Iom4}v|P92tFx1_cy%d5AQjuq_S2K@oR!mubMAU^yLY2^
z>q;!DU0c$oSC*^AOO>8i$e^iEW!
zNeyJ>+BvU|PVVh|R8Hk()k!DUS(lrE~YBcXvvXkH~?WwrvgUs$D-z
zP$~^4G7p=3FpAR67W^NLr&oMRAxJrtCwD{Mtu{V-C)cgmfp|}cm2dYm?nmn6n6dgc
zJJplrnw|SQ?@6#Wz%H*f#{RpUTxXkmJeBasMe%L1Fb+hzEhoY`n;2+W4uHV3TH-<`uAChwVZ
zo1uSWZ^(LrpynX7An$ha{?-A+-eE46t;+jw*n8&?es0g_0I;8A9w2SYA)IJxXc>pWw=-#7zQ)w!tQ%~wi)il*?q0uy&
z>Z#f--v@P_a&er~uN`Fd|Bm*`-{b1LNj$n6+WR;z1@BMu?x|gSmbC1G6v1D%Df)C~
z#?Lq3wH|C|#jyUqhwEesba3w##`*^{E_zo7&1U{gjwCfBg9}C$KYdcCDJ;hlLO)(I
z&v)cvIk(M+F)B4{E1s-&dOpM)WH_hp$j|wOy`3(5il{5ptz~iWc^p1RNSQ>Ag(r8t
zQ4Ve)K8Hwj9dcGrD6Cq?(~X{ZGNzvEcbq>_cKLLpU6#x$^M`XzS*)C0&eewetfr#`
z@9!LrR;^f0>B=tkXghbGwp=H>#^K(rlRZaS(ik;w;3;Kmx4f~EvCEgPdY|pg-%Hrt
zQvoZkwF<|HNnYV%mD`=Rw0e^)0jIOd;{MCn`p-^=fr4`?=%d}$6P~PCc~~b_x^tG~
zj#Kp|PjO{AIl5eqOHcAUFP$BpD7~AL9C_4o473N&iLxw?{&l-NOIL6kxyN%yXSbc@
zv}dpI+<78&VjQJYA;vb3e$1U}9_^$7{#J*Xo6B&3YZMj$o)*tU9hox&Br%ngTTIL-KdE!j2s##Ac$&eF%;RL4D%j9!GJnOUi{@?24
zD6u#*7ug3S`dhg|Gg`AE#v<~;^H}NrM!ChtMjn6Urv&w;JSw6xs-jw|r;#|X-}0e-
zZQ~5)*fO$ZFZt*u=xlzrf)fDb!wkw;p6BOhFRbfXAIbA8@8hf!OciD;*M
zU#C5-ajTqMdh$g|!TVsWUHMEAKl9#WE;5_ViL$0(&G5M7_0b;mwpO{z2Yt+AhS$7u
z?8>c81HUf-aZ+0Q(-y(Y8{!-lUBXM9V4ZaBhiY*vo&i6ZGDjCe6{DRTPTIXYF@`VQH%)QL3mRlnN4SBt$MkB++p2~
z5IZifFL>6H_7<+^Y^i&>E|h~s^a{=b2Jwc1oFjSuDsff?
z%A(btn#6VVTH>`N33cWPa}#M#jX;R@+87dCdw6o(YOY2fYc?p
z%_N=*aBAXr#bUl+nLB+a&7Hni&7HnKm^*!@xih7Qxiclh+?jHXxih7wxijTjb7x8~
zb7#tR=FXIWxiclx+?f(Iccx^SJ5xgD&XlmZGbLi~Oo^I1Q)1@Ml(@MwC1LJN$u@VU
zvulC#eE%mkF<4jS<>@k&(G%f;bHS)
zra?P&ZHxDJ*e6gUEvRH*>rt*D`02d$&PMl+#|L(s~uo`3(}Z^&VxV@}3{h&1^ri2H;a)e7=@X*fK@#3UhDXL0SVW
zsz0vz<1W1MO6E@UZS!rqfymrszGD7@DnWbGe3OQd*07v=(r=HppC$nvz+AZZ@jvc?
zmq=@XMfImee`+80ja&eAd+>zVZnk7Z~8^bplQ_*tSnnFt3hi2aq0TrH=1
zkz6al$zBQV;qF^XTibI&C#UjNCjf1yJ&9iQr`3O2M;gB|+_lf6_F1!vCucpmo_v%c
z*3rF0*PSF0m_#Bll|*0$iNI{4>&~dZ=ZNsXl|*13iNHbqrDPk_a@CH}E2fz%~+rT_k|_5nXqc$mVlEr8`U%@RA4|B?_dI2%I1hI7Jlb
zMHC1@CMn-p5`ptXfdqLoiA11H#p_KJ$WyXhBoVkm6euE3=HoE))P^aTOd@ld`a6?E<{a{5uEl?mIbY?mh(zX6$U%X6@l2p+Aed<5
ze}PyasZifQp+Y5rnm{E&hXqC_+5#gIZGmxti7Ir8jiv`?DcbbFTpL-m1%btiwk)tZ
z(H2;lXbUV0G}vf^LYo6yRlFU6CWZC}_J1IBDA26p9SR&*$SKFkz!^nzN^~yJo@fiS
z1}+D#W_o34W_o5Xg+iIVGZTz6^D@gai-4*!YgMR&>N7_w+L+Ao3Qe-(O_h{HTjq?+
z*(%gQPUyVMg(`GO=5mErWv)?ZUFJrG8Z);kv@7#Pg`9l%Wgd{U!1Tf&Xnc(BWwTiahLf!TfyY+*cta!mK!R;#T
z?%*DYoYoJ%6g;SCcIyX^Sn_q(`oUwt7RAp-uDW;H+(s^0Y^h}X22Uqk$kkf*2ym6x
z>BUapwULvXtB*Tlby)CqHEQjV7rYQOR5>mLFR41%9DGNi9a)-0S!r246>V>pr6cxc
z#T4yaR#J@~j3cH>8l%j8S$$=^%&IJ0H(VMO&P;Ore!ot0i)3JgXsVgQU57
zwmkxzw3(~2HmkIDPt4kywL@`k%GxWns58nOO_Q}U>rkRCYk#6Gt2s+)uFQQ*s(f=%A-B&YN9Rca-uD(J><1fxLx*MBtP!E3ipz=6DTU64&MVXw
zx~R~VFxg1y#9jx&fkaz4gIgvXktm$QH2#-)F`OUn!zf%FR@yOKZM9KY4-c2|!lS}t
z6`BxM+A%yWth8h1uJ9ZcIzOy*V&GhOsiLh2Kd#W)@Op(dg||o)JQh}3FT6Xfv|f03
z_$3wZVEBk^neef&(q`e);n!tocfG`E{qO}VUf2j*dZSaDGoSD~5v4&QX%S0OqN|!{7qDn_ZtD=^*
zWNV9PeN^d)(DLXQ$=Stkyrq$%lcLHt%G?)KdLueJsR_vYTuPoR*F@Mt3FJqT3Q}Su3MTgGBd5m9~f;jw&4yJsdruBz0(~qRN(vHb%Mp
z=M#)h*yy4{S7J(o#8P4zl1nTQi*$pOedUA(kHw%#5{#71mDL<8R%y#))e7mcQ8DP1
z%t^5ciMH6-*kp%G=Dyf86>nxtX_eUg*wPsEN^C_;=@J)O8&g^((j40)(`N39Dg6>q
z{U*^C+aBAkINQh-x+kV|PG%^kEUnm)*fE(RTpUx{Cz>8Rt+>1%yP%L^&FjS@j~0;YK;>=9#>X@)A~-E$IryiDG6HRY9x2p`ti&0
zt16z2oHkE*6X`P4X?;f)2PJwXSPQUyVI!xtoKm{_uH9o@$nMY1xQsR?ddm@-$V(_2
z#2IgyV-mJCl2F!2qBf>x$ygwv>=LJCBF7U-`@}9Kl=g|ONT^j?Y(-*{EUz;bGIu4E
z9&*Nh>_|dsB&RJCv#pWh)Soi~67v#jb(dI@Q2HvdDxtKL(*xdQ@kH+4u=16_`JI)%u(>4gg*{G?_~?~M))h?e+>S&;Xef5
z1OG1g=V+`*MUC=`eZFY!t}$>gg+R5KK$`~$Ei6Oem?vH_&35|34ap&
z8SGze10Dtc)A0Mj{|dORhkrNx8{w~ne<%DI@CE!)@N?mR8h!!%XW`$)K0T{dkf5zv
zF?_}cfe!+o06qcy8{ppne-ZeLz)t~h1l|bzg7TT$v%tSpeg%oEZ;4tG=5DSx;fMbz
zvzUbV6qix+GuHf!#c+fU2fhRN4l#j*xC4~FOwrJ$qAw`?yheyTV19}v=m}7YKq>a@
zBq0VNuR);jZA3yGh93hZhByh&S`vbvxCrq>rqdN*DHZyaKvS|#Y{rQ+kj=&J&~LZH`)`@|#?VlqN|AZ-tnx(6r;P!hn;0Y3-K``bd~
z01pJl{k!62;Fm$?C+$Mq1iTD*8Sr<2Hv>y)n}L4=`fq^wNsSOU0P{0uL4ROOKL>sS
z_?ujB^lh$TdLA+V1*!f8xF0ZjvUm`!@F3`X7mX0#2Oa@D0(b-P2H+~-D&QXh{|Fd2
zXNt#xPl0}lFoWjaFnxw{b8BlK<0Ur2a%u?(IUFbdWqv;r|JAX^0}L*Q3~
zF8k7IU;}Xs;OW48MpKABOwsr}s1SMRMRmaCh*=5BkKp%!-xHx;gpT&iB_ZwveIonR
z4x9se4savtN$4u*$3Q;@{A=J}1K$JxZcy$9z6SUj;O_x{54aJ2
zD@xZ2+z#9h+-A0u5Z7?+iCm=0)qY2U-a&m{^$aEDgSLu0L=}SU<75u-7I5)uO`&os+%tF8Me3FD`2*>f%AZ-Ie
z(-1QgX)zDtk%SPKNyWVg-HOnyz~#W@;BXa`Z!sS&8~x<#pf`c@Sn)6kT8@@FiBe}F
zZ5C1mfrG%;qDKXgsuw5$Q0Aj<{|o+aI6fH&y;*yMgeX9qz6d=7EI`+Qeel18(9_5Z
z^OV4hPk%*TW$=s8Y6UEz7Kfa2rrQlH=iGD1{Ty=VGr>YM0&fT24$M!Cg(v|Y20RRy
zZ!;Id2fP4y0q{onH$%1uL4OdGYvFGOeKYVj;BCO^@O4mh;Fo}30_NL@h2SUrLTEg9
zi)-L#gA&I4E;Vo(=zh=LBt!%pBB02b#RKf~l#>v$pEMxtN#;Z65LyhL#lRKdQwv-N
zoD0nF?+fu6U_RX=!~l_C9~4+|VjyEJ1(a*y^Z9Hc1~aBN8Pl7birxf;-?-&o&83?U
zJRkJGf`Q
zBt#wPW$=9*N>>ru;#ok#Gm|Nv&m+_eKaQ4-BhH1ZCJ7M-&l-dxzE}?YL&W?c@G#(E
zz_6}`Y@O?oHXZaSj5RrjP65S>-ZBSqz70wceh77S5%d8b9|=(o%C9^_xR-+BL0S#|
zSK+5ahQ&y=7<@hf{0YYNdk&@FgI)!{1oU>`1@I@pp98-XKCEA{6?iZB?*$$V{8Q;O
z1y8TV{4)>dJ5Qstwvz~zkO)I!0vkX;A4l5M{NH2yG_HI!z+9
zl|*OO7J!?AFXaX1++4EF^p3D+c>!j;LU
z(9H0N@G#IuhbM-|C7Z%i!qdaERNB$uxe|pk!V6R>Tf&P~=(6xig;s|f6xtBptk71g
zY{{ljv7|Zm9NrN|Yb2Y(d&B!xibGcYg`302742mBj6%)fbBc>o_jX-zt0tSmt;r^*
z#>4I5tI4MDWp49`SB8e$Bk7VB=@m&tLd-GJJ5m(M11gKuMyi17BV!^XfyPIsMkWEx
zh|G)323i@)svIXGXCtQ|-}%VJNE^_VXiAhAMKhw2DEfOeC)!7r*VQ-dUJ}iZmM5E{
z#mS~LDXJ%%qNAb{l1F<8KAvofuILcY
zPT}-A2SwLfBPzPy&TW&O+ZH>w?RIXv?cDa*xjFG{6r$+CD8^6pNVFw-3?)Auy%2pJ
z$cVlZ#i)sCv7RxEl~^#AjKw;|vr{-D#f36rebuPQh!sl2DPkqbrdVaHCN?5AEZGzr
z9UB*$5}TN8icOEriY!@+~QSMZt+?xw|KpkTYRLI
zTYQY2+ju)S8-)(WF)EWy@u~3{N|xF2c@l-@#}_KvlK66kR>jvSv@X6;p~m<&iGmIB
zU5fT%e4j+2webUrb~t`ip%Ydf@l)}$Dqc(cX#9M#Dc%;p7{4NE2}-EhC6SR(vr8h9
zP_s*-PXcpGvMJt}P}(t3o>22lLbpN_!xN(vzp)85<2aHA8xoj#k}jIVFW#7#rewDB
za3pp3xoXm>E4zjgGZSi7OUzHGSuL?Np=Pzjm{)}
zu}78TrNlvnW+sj(bS%-L(CGxmXR;~&VnWSt2_vEAx5PWy*8Dc#ikF~HvTRB=Wv6BL
zRQ&9E&JJc{Y$uztli8RBldd)j9n3D2DMAOcOKenWqZ%7wwoG!o5jJhKjmFtXjls~t
z>?t;Fx{cHf8#+U}fhAw|0!zN^1(tl-
z3oQAv7g+LTFR)~ZFUeN(d3;IsGAUntNw%8V<4dwv+cY)D$CqSpuxV~&cDp4@cDp4@cDp4@cDp4@cDp4@cDp4@cDp4@cDp4@cDt2tu)(UKU_-Xj
zqQQo2rA31cIZBHL8*-Eu4L0N`EgEddQCc+Ekdu&g5Nya%`ZU;(qqJzSA*aX=Ewd5q
z6ZeRB>w}zH886h5y+e+?P)km|jYisNjE%-yD7)E0Ig@NORiXstC>@)i9N0jtxpI`Y
zjW_04+O{zVb`e4?z1x_xN=g-P%&|0ZW6nC8X6xddMw_Oza=bCe(#nlFFWR9>KRbHO
zjdGOEPK?btEK?-L<|yr*7@Kp#rolo=GEM36#Mm6QN=S^&fz^aitQLSQ-99!KmK4)+
zm6p%Vu=I0oh7~V2!-|)iVabx4Vabx4Vabx4Vabx4Vabx4Vabx4Vabx4Vabx4Vdtyn
zmSj_IB)3m4=9k?3Ts5cUmglNDC0EZKE=!&p$sL=EStWNuu9`n`r{&H`Hs#JtHs#LG
zRa!o`JaY7THpnH-&D%`fKx*7vOaM<-d|Gi|O_
zFUbW-rFUIzWY>l?2HL|tJKPa*_*GGh$(PJaG
zMzY55KN8KQ2^}5#{~b#7Nh(YAe@~c@_)#Kr{P^sr^vG(IQ8K^BO!D=ceo9ya!=I9<<*xXvVqO~`i>V!F?YxX(!7oRT~lqRmBoc|L^iPZXLwX&_IMTt(E^(E3FseTx4IK7!iGOssT@+gb$%LNLvH!K5sJtPio|I
zG;wNzDI&yV_!a3)nv^q
zKq#J@Yx1ewBTUhXSV9j@<7hZvq~VFA2WKI)0f>V$4<3FgPiQ#nrQM8FI7_45j5vtz
z!5IuK7kTA*8u*kBPJPTVD@llh@c)B-Z2|l*!~X*OFT%f{eX$qyCeOzF82QR4X#0^D
ze-T@F(Cf4>fPyE*9`qA!E-0Tx9KL%@XgE2e-48qyvZ3ZhJK9~=|6e#%`~{T1fCHXr
zYmH3NaE3&~lSl2lpnMl`@T^w*HYnc)g>Oj~+B2X$gS?(XxoY5l41PQOKg0ho_;0c=
zWM7qMY;X=xor=MUJAv~gnmikJ0i5v^Sd%^HO;BD%?(!VVtDyW2lp9dG-!X;0$?ZaG
zxLveK2t91q>0Wtr|6b&b)H2!Y6@ZdSVwvFkY6$r(dC=WPmI2q;nI_Td-eA#2a
ziTF4lrO6W!-vZ?!#Dr$h@U&XP*&*#L(>t8``2*y^87=Jv#@Y*r(-*z#M)a=ppu7#9
zTjAs6kA~A++LNFxMcO668vCLVHD3<@Hu#s}zYYIY_`idHlznybq(8=He?A34Z(|g{
zjWY(<<6MO6R0B05v>7p_R*~mV9^qaTZGCp
zLh^Kwb>4ta)Z`&mf5y~?_-&vUf`1|Cu5&x;{L({6^^gn&cAuGXoynmUI6Z=sPQ+g_
z5%fp!cb}87&MvY%^0Yvc;ImTloYHN;9~Yk>L3`liEEcsR_g5kFtH6ImNryw8;lS4e
zUk}dLfpR-2^}t_58NZ0MICmsZBH5>>`1H|e#FwY7syx+vmI?k|_*>wghW``x#Z8`P
z`IHy@8*pkX0za&s2fZJk62a-3yU;^!LfYTK-wJ;%{3GypurICyhZOkrpm-5_2>x#P
z7vTSleNl?s`@-*!RDIyzz%tMg&X+!i`2FBV;okwj6n+Dzr4{hka9Vm4{&H|w!KI)_
zxfJxzo`?8M4pO}g|NHQN&%P)|zBj_Z6O>-?s}bjI`2Pm~dHAow|0(+-AMz*Q%ky&b
z6kH57nLtg(QIiSC(1=u1;pf56fAk{y?UkaW-L(M#mcIkTl=iN^J
zq@Wkca~-ZTKXeYg{W8u)bUm>nPfX$biTgZ^C_;SqNgLP6AL1MQtkW9uq-)ocKk^(A
z&Z){%Km-j>ui`vLms3FMT#9vWiqC97tE*E$@(d?V%gD1jA`NFwUWX*FLt4!8A`=+1
zIUN+&+b5>R0Dn?UCqXZ>FUojK(VwM{9C2QVOmK)|#HI4trw-?Wu18FHZV*~x+=_7*
zoKqz?Umz`i0crV*Ny}eGTK-C+n+^5%5)uBtLt6f7(()Tf%ilm+{$`?ljkNr&MEPl?
z;@Dk-0lBXa+T0y#sS3;CuDP<|>MOs0KD8Gh8{w$*WVMGWYL0UnA
zD1Ws2ACzUvA4gh2Z}Jv2%Df8lz+WpUBCVi|w1O(q3TjC!s3)ypBxwa>NGljmls}Ou
ze~Rn(bkYhYkybF3w1OF=70f2BU><1&3rQ9^RS+ikSlMtgu>(vAFsHtmRw94^OfS_{x=-N=94
zrd%xE!a%XFh)wQdxwENIY;f(4761@3Yv7IV22BF
zioFQkZ>M$Qap)n0Hrt`cb)(>nZWNp>IA_zG^0w+mK|4|~x(sx+&|8=eNg4IBQOHIK
z8#(cM7v|{(QWO=I=|*8yq1Q#LEv#3eBW*OMaJ-^TviVK5(F{i5;^Z;g4xMMCg*IAZ
zBcv!?t{a7`m{zz(HwxDQZ7lQ_HrnyFfwoIG3SYF*J{uhXI;!
z#^^jym2MQa*|du`x?&;j8@kakZ9n4Bekr=qF9Rr`8~q|cIl9rW4^X~t^efkme#QN&
zb)(;K-RP%-HVQNj9ouh0zv6zA?Re94qu(6e=r^<9e5)M&7U@R6rQo+hH~L|8_gmX<
zeLsxkep~vj?}t$f8b&P;MlH}wNXsb>_B*0W8pbMU7^^^%AICe56tCNPFb(4u$gufg
zB!h;L3qgO5rm;pU
zYAV`Ww4-RhZWJ9tzKoh}bR6iUZWNtigjR)aFFL0iMXeUCsNF&`l;ag$M%t^gZ@ANP
zXn!wKaNhtw&@fV*Jo@*t>Z&_h|B!C<$Jp-}uYYgmTzIN~UjL&0WxCP7N;mq~+O&G6
zIiWx!ZQ2-#bfbTfonn0dNh-zE{xfu=|Lp#GF50~Q3svY68!hj@O3~KXoY&cCqm3GE
zw2cusLuN>|%MN|fMn(PiDbDqbR0@l>%SJES=zxu6Z5-B({z_Z)&+C7}=6uRVXKi%e
zMvhd7*S}3S`d`tF{ufzq6hm78rP#H0z)D-3VWR+};)re(=Wx8@KDtqi85Rgu1|yy|
zbfdUj&K2%>&OBXQtsBKU$KzgHj6MVedjkmeMyJpT;5@lQifQ0dq8r6CJMt@@qZ`HZ
zkz$c<6hlh^t>}gZ%~ia%L%j9Hn{=7NNegSFc)J~Mw>8HX@6nCogSt`tQt=VpC~nb>
z;$xtl2F(e5-Hzwb6w)P^3rNAgz|XN&iZ59-*6qd6YXdah7yxZ%aVdUjK+gfe0kHu|
z-2mzfR9NU8P%@xW(Q53_VKy2uV6+MyXVWIy$l*7o8`^ZH_3zao-&uCNxi*RoSYS)F
zz)oS&X4z=2jTYO;kzkq4Z>5b8%Dq^QeUyB)9lF>?4L}>Ld3C^M-59Wyd&Gbpx-p;$
zXs>Pz*l#2BXV97l9M>f}X@^3y4mhV91E5cxQDNC;x-p<#HwHkTGLrodw5ugv8Cn9}
zS<=fLuLL$yNkUp~Dju{Wr!C222}+7|qoj-xTWKX#kg7v&CD5HE^}10q5-Avsv5`X?
zZ_{8wl}xo$%#giKcUeItvvs3nVabw`c_qtrqXd>w$r{}#fn}7RqZ=g~nI8~rq>^pA
zQL+npyr>%`u#8F$=tjw5(2nXx3G5;6#U-bh<{-A4N~C49yyU#h4MOp}%oBUnbI
z)Ro4erBcH&f@K60;M{;kx0YR?;L9an7X+^RG
z&~QM|Ye182S)kY0zAA-Ya}eUqvEsS-LDwO45r>v8)s0fO(#N?+HFQdne8yn?H`QHpp#
zu+2Krpv}rOcf2y_wX&YNQ6|@0S9PNd_F7p|H_EWyDl62DvJ#fS;m0zU)szh@t1KI#
z8)dM_c!gFr4w5>d6RmhI+7#U=n{LOO#ay`Lir-vIma+x9QMMR)EYpp$m7Jn%wH>cP
zH_A4E#-W>mw(3UN4y0((jk3K!Oxq81NH@xw8RefYJ6;C;0tEd6bdI?ILDQ7AcZdi5
zg3zl2y}T+fJKlwMy6pJCbc8bMH83Rk4TK#A8uSYg^b5GyvJ8Y(g;3}mAm|(*Xc|T`
zMd3!>7+B9TvmHASnr7e_-53Z>!|TR@&@>Kh;8fihh_%|l*}5?h>oOp$%LXpdje*OV
z-@sM6F>npgIx7VvfX?B5KM*=+;5OYD2%Q6jb(xE{Pd5f)T{iHrZVZG~HSmOP421Rp
zg3cLuUN;6p(+s?5b7llhQ%<^34z0qpa%dGGXcZu66{L_-aXeU1+)K)_8Y|D&jdEB}
z<>k6j4qf7+>AF!4T~a8t)KPVBJ_T
zS~n`7kt!zYM#c1sSrt=&<^nCyjf%z0rDB`KwpA+6-H
zS2rqPzaZWr@N2f?9oLPDlc1f^jS6U$idNmIXt(pdTIsF0T$!#LmDsVV4CzK?@5;Q&
zL}ig~RATH`R_R71Mm!M4IS|Hq0<~3MROpJ8b`aSp#YP!6
z3NQj^Thc)hJ2b~amAeM@vC6?nrm$#(A~wpgQND#FXYM(Jpru&SLFE?bLDe?WZ8V(G
zpix#Ep=^$PNHJ)vZVZA}88lfpDxs-?U>zcle4F1i8_fjTA@!AR44R`GgJAm%TBI9;
zuvP#kys*<`<1uey^{3`5Z0YP7NqCsC()mZVInG^A#xjLnQ=BgTPrKlR`Msluo
zxbVzgHKl5L)x_>l)hykpn#;9YwZMv3wb(*VimGKyL%fw1Lg;GdEJK0V=7Ob#c(A^z
zHe39vw(3UJ4(7u1Wfj(WReP=>E>~SGpD@^~8;l00GaB4$aAEHwI%L9SHgW2$mZVGy@Ry?%>0^F&LKH;1jwr
z7?xYUZdsPR?>!hc+~D)pIASyy)*KMljX<#Gs%>kIY1OdnsxvIgVk5f)*LK6#DmpWZCicSV|Ak%8q*bTvTjsk
zwOBn$BRte&qM)k}4wdQtTX-Kd8CV=K2BPu;55>qhk!-KgHg?NJRIi7k|B=(XxS
zx={^nHlR>9s*hA3t3FuWq8ruFQoO5C4V$a_f^JmHwcl>tsD{l|{mu|=2<$5$=q4bn
z-+-W{sxyXYU1*#Zd+4jr;VH-lFUrtx!w+Mcz++O*o3Zq!2W0zvQA
z7FxQA+fC|rMzydaJJMXCuqSJ4+$mh4uqSI-A7idyF0$7-{Ax#AHPjugcARe1LT7Vm
zEp&Fj`L)w)XVuQtB`UEIXwJ-pcnj>%#Wq@Iqm{M1e^*#Ly)zAI8#okbL+xgTw%TcT
z*r>@y!)&yd5jfkD)|{|I_uFVz?IF7yydTK2*tD7xc4)JWj@t;FYftJ%t$fzY^>WVU
z+-jqC8(p@MEtQN{dsR2;@PwD^uNJc(5LzFck6UT$(rwg>5%2id;mHNt&vn>YbZiSo
zb=YI9%hQcI>?b;*gL~;l9d;MEm(*cr(Xlre)nUg02pYIkDCPysm#|Peg<`JYU9dXL
z6?KzzqYkvW?I
zy1lN^3T0cl4t8G?L&8S&ac$4uhPR-j={;T49CIRyxF3J~TLAj~8{cs`@^
zEQ0yN>CetM(s@3?&IAzV6d=qgK$uB%o<*E^*oEa2M=ly>7o@=KqO;A8*@brub<7_K
z#q7d!vW}SqNbWs!q+w4LG}!k#j~t}nm5q-52*+yq2YDmSb%XE!-hcdI??3M5Ewnt`
zA1vSg$@4sFzn4(rox*48y{WiUmhZK_(X)+&SnVkVUJiUM-#!cc4d7pS`Q3{fyeTBa
z4
zjC%M_)WZ~TmT$K8(*DD~3t65zzlGl`5_sdv^EH;!gLhm!-vl@Lw%I2TN8SNk0D7s}
zgM=sq=TgYb-@_K-r-+F+nM8>>f`muDHT8LZi^B5-+@IR@eZe^7PvHHV1o%fG|1!uQ
zMcXYyOUZi{BcS{fDF1=h45KxdGKDUpHRVm!2}mgKuD$^+m_Q50QU9*{eLK7_DBrnB
zL;c6mg6`XhQy^ha4pp};$~&iXke7VBQQjqdFUl1MpL&q>oZrFVb
zG2J&kcYS+uEK-d{J9
znLh!apCfb)mqoqlg}yMew4RbHz*-j+?zqjV9J&i$U~?I^o^w^H6ryi$CfZ|Y?}+B%j&!#JXEqAlc&
z#ZMs)-uR>|98-kQpC1=zth<@DN0IiQ`R-w{9r5Ko+-Ua>@1(8(=M`wvBdE_K%+rJW
z)IGO?|2V`M2Wjs_UUwn>CqciB^YY+bD^EUh9EV;fThM(!dOi5pgXgD^b|U)KL~yQlbq7UZ@
zJZR3|sKdulhc}`IVko10)1~X1#63*D?X`#CQuNSXAR&5!TTirdPjKi74%e_g6#XHC
zys0__EN`R#AUXQZhhIe`E(Z08%
z9d8An(P%q-Q9;~>w!01WGaT)88|JUu&=&G-LU}8^yx-mZHnx0+N#20I1)LjM1}zgZ
zY(ehNfsVIq#g8Gg`+e&hAoJshFW+zOi~8wlE!-}&1#bb$x2tjY
zw*AEbek;+skDqZ5#JmVBZ-VcMcgU{A8)?^ic$T~tQpG*z7<(4M=bOc^_4Fqp(mfgp
z@sP%L&cAqG0p&}eEaltZ`F?SAllQfr2Z32fUFZ2czdMM$BA!ox-ji?dh9uYEO}J}4
z6Zwv0uZM)X1w5ca`OUw9T9Smo+s5h+?Cs$8J*1UyqzysM)OwEb?ZPNUK2zvl=}8jy
zE$=)w<@W(@MSR>buii53gOcWBto1>8uQyNQ`vY8iH{z~$yrD~fKwA0Dfk6oEdV_cj
zqox=!zYo70<8CQrTM9})NQ-wpwWCbehJr5NVI8be@z^Xxs{fRs?0ZmZPc?FX4SBr=
zdJUIC^Madvzt(+!zkCx>zJr)Rc`H!f1j-vm`z}TM?nV2C(Y{O3z8BHH^6vixT2{W@
zcq7_0fi{)zHOiaLakG1eF9YO3TKU!;?tmxUMlY^Gx%#qC|IU)rzk@OvJ^V{Zm4!0O
zcPMc~y!$?QYUi@J-%(cg;>)iGJdLz|@a%y)mv=vJLyqsDZsohG1T5d*4PaaZP)h;S
zPXMKkB9(kg^4Gxl8VUUj{H-@2xh!}eoqh-Tv*Gsw|LbwzynKsVeqqD?-GCcBE!^u+
z|EoMxc^!dN+3FGOME_x0%b0cctCdl6t^h@RdzC#`O
zUA_rGD?DdO*f(czz2W;LVm7`Wuo;v;gR{IzeLLu9K`BM(i#)REHOPihAjXR$BPk^2WU*5t#9jX2k{pWtfc^VY?#@MXmLvZAxjl<&lsA{E}k*M7!vv||Xp32*&&
z{d$IcUs=9+-xs~NFLLQCwHZeDDva)f=v~)ibg#nbzKYR}Zz+hIpuPJduRLgP`95?p
z_a7|@Ir~6{b-;bmqi%#Yz6o<^U-)0<^3uOcA2H?K41GQS3XM98g!mQeq#2>^uYVMx
z?EN5v``vf>wFLQ%5qu3s?BcZad-$zLg|C;;n-~i}<#N$-$RNLSg6{&+*N~$?fA}^0
zH@Ot_bzu2+GNG+;3k#Xxk1rv}uU@EcgS^E#(iPORU|mXAF#4{rZ=rpVc|F>q08;Hk%vPQes1>2|UW5!;1E8$ame}7O
z`7+}F&U};vy@cGCpwwSuZt6QB^8N$7Bd%%8LDLW?2Q`UrC23OkmNH$F-|k4Fcjcng
zxhU^t^q*XHYXa|eBq4bcdEE?dH>3aH%ON5g{U?c@lY^d<3mYI8eFN`Ft8cl;ub`x&
zjPec}>z!|&m*;}>7tzDNh}<6mWf7M}EJ7UjeF^whjQXC8Kuis3Z%)-Y>_UBH~+!BfmHyzjT2wX3)PO{xZb;nYe`nod=fRa0sI;`1*(X
z7DO|0Z$=#XHHoe_2YB!u53lET+>~%5+j3Y9`EU<`*Yk0{>%wyr3GsloorL&~m+eFH
zYy{=IBXZU2Dfp>J^es_)%B&b8sbS%IDc=QZFXzw{z+p(uu&
z*(lLGjD=R<<-pH?v-(yH+IPNKO+uT>e6$&exe7659m?;hxNfr$_nx?Xw$B@UsRxVD!``#HC%#`^)yD-uQ0MoFtVQJktMFh7^%RQ
zQYtXADm^Pmh#Jpy5}N!XN-aj#K;-y5?cKEtZI%4)fd9TGt?19#F-}CVY
z@c9Gg#5V5d)CN9(Kv_~1=GhRpm(e9q{*0KopF`k&CUG;b4lE26BCBcOuozsMSJQI@DwV%3HwoMrdpL3u4M|&ddXchrs_K
z@c$Ah3t3vR5Ha0f+DS!d8sg*T65&IsGeEx%Et`VT@n1}*{{jcuS5q)jaDxlI#qsG1
zYVr!k-Fd_}IKI4(B+wXWBS9IomUtJEcR)`N5r3PH|DPqI^F(L?{)P|#=GM5v4MN2C
z$Y9lTl!({vB0_{c{qsb;yTbcrpcNDGa|JwGU>ocd5%1-2TBOs7`0J5;cburE-gKCb
z(g`|6XX!k((M7rK@#Q=GfBd{!%QV%-bv4pFbmBz66R;P_nUY+Vis~=HzV{c3G*iNMiS;KZY}ec
zt3M`T4m10ZFdx3UfrRNZZy{lh=H74K4W1LO?j&J8gwW4i{SOl6rmH_BVQzpQLfSi!
zV?VQ$g!%NX5i
zzw?N+g+$sC#cw&0whH-Fi$<|c>=G}Eed2&PERKp3;*>Zm&Wkp2QC!hTOVKj4fELkm
z#5S#umai3S-^R-3VQf-Cyxc0cVR$HsB*Vb#Bv`yL;
zZHu;D+pg`_c58dIJ=#m!OWHy0ApP&N*bnh6*1U(UZL^2xdJ<+9?^>Eecr{`U;kATW
z$X2+Crvl~>*4<_y@4cD@ye2Vk;$2{K74O5EpW&TZ^FiLvHSrx!^E15HZ1(3pT(gi@
z1!gI)YRsE>U16?bo8J61a-YYm0&|ro!6TYiFXr`-v;Eq|MR!)_`XQKD{+_l&GQ~Lxx_uUT)`UtALF~x5Ai)~8QL|yTv{?l#QXGoLV$N~@xO#fR1)!%YJN)2
zPfz(9sQlbSOeEs(=XKGpoTfYN%DmkgmNjm7TDCh4>(;K8mVGY`%bM1uWm#ienpW(m
zEHPe85|hMKF+eOzx+}=Pa1j1D{dk3_VfNg=)Myv
zGsMqGkVw0WG@43Y;wNg^R7Vl|7~M@n=u>nrjiqTcjXq5e(L*$emeX?j46UNoG?~`W
zI=YY6)6+DQcF}**Z2B3!N-OC#;iIQTsu)E3#b9v@{aM^8rVA4Hi`gO~7KjBRM>L3a
zB3B#`2Sji2EAfiBLHt(yR^)4$T38flF)b;IwcgrIqC&e_%NIkm&uO0%L$$fuTv4li
zU;DnO)0(xP3tjt#)*|XXPk5dXBfUl5BJpwW0B^Y%<*oEqim~1*Z?*WOx6Z4J@!nzH
zVPb-}-dis|yJ+z4@V+3{d0+JI5gWYcz30U<-izLgVw3lZ_lkJd=ka;OW?zOcLwv^<@C8Jp
zFXD@e=X}M!0ph#9QeT;P-dFA`7vJ*@_0@{)zFU2_iXFb&eYcC9zF+xHiCweP+r{
z;z-J^DR+rKr+gu0j+T=0NXjExTFR1?C7M6wYblRv=_#vHR%zFy97;K@^-OsyHBGxQ
z^|jR3w1H`3(>|${r+qDLg;triE^VDwo%T%HGujaUJpVkc#(&6vNE_-u;yfwEuah`flJx%fq
z_Y9}ccxHJP&}7d-&mwxj^SEa<&GxMEY^4W1+dTVdh393@Df+hOwC6PK^qld=X_xQg
zzA@D18|xcS7k!`hO`^AalYNuvZQm5%6ne)u)i;g)>YL%4A;>q|_XQz*5BeSw9^XRW
zLXqZM>{}-MzU97^qL*)#?+KCRd(yXF#C@B6o5l6Mt-c+iw{Mqkx47B&1K$rsq3?&j
zy`rD*pzomQ?>po>B8q)SeLoiieZTPiLR6$)pW0Vcrsk#QiJH{>)Iu>dwJ5c}&{GGb
z4iv*uD^e@OZK*?2YsH9EJ@sQ^RO&6Mw}{cH!&5&l?o7QSb+ouEbxi6f#oehBQYVN{
zr+zwhl9-e_Id!p^oVq3T$KosLrRk;ODH0S(`&im7Y4vGi(ms)PSK1fS=A=ECHaG2y
zY4g$^N_#l%OKFd!eI@OyY5$b=leAx_olR@?|CBWPtfUbBlZJ~wh(G-w_Rc%Lsw!Ro&uV+EwNF1u4&j8510;u#KyUL8rU^m$;
zH^A<4Lpcja%N^zJI9u*1_ryhVuG||J%YEcN_?_HOF2JR7k=!3w$OGje_`N(-9))Y<
zG4fd4B#)CPVwpTyo{YQXsq%E(Ew7c=;=YKmalgD--i!z2GWiG|lz)_ku`bKTjWe%(<6xwE4smMh#TsLx#4bv8|g;5(Js21uh%2=NIgn#qW9H@>I?P7
zWHYM4eULs{AES@gOY}+lW_^p<*t`#c&`oxouFGxf
zc5pknUEHp2H@7zgQu-eKh<;qZs9!e1NE4cbsW4ThhnZwHFi~nW(rjU7ncd9pW)Cyh
z%rl3W!_494m*zxshWWKQ)0}J0Hy4=Snaj)-<|cEqxy3wTo;1(eF}BrCwD;Nj?F05f
z`;h&keb_!?AGLq7kJ-oV6ZT2_lzrMhWB+WQwa?k-?F)8!G?VNXRf2Rsvxz%pv4g9Tk1lzHL_nc8&cI76Q_5>bH%)wm--p4)`Pe
z`LO;%e+i2IQhybi{MG(84E1;V`!U|XABNZf5?T+^-vS0^3Z5}j&1Isexxzdr7Dl9D
zo)69ef~9sj9*ll3q=ZBq8ruNa79U^+KE$W^8$K5b9||K5#y4WI_)aX4LM{-W$wl%I
zxu-l-E|>es6-vm*l~Pa157jfeM%@j8zWyM8m_O1V<&XBq`Q!Z={@4C2e~w@3&-WMl
zi~VK(_x>t>wZG2a;BWLd`CI%lf2+UE-|6r1_xX?gC;sy=`iZRld7{tq&wh>v{Ga@j
zetGn{ATZ7!><{sa{h|JFe~kZyKi2=!|H_}>m-rL?N&Xansz1%2?$7kU@n`$r`g8qx
z{vv;gztmshuk_dWYyHjsE`P7T-@ory`w#pY|DpfL|J{G;Kl5MsFa1~kYyXY^)_)fw
z6rl`F7=$)-VRVMr_Md*`@4s&MuetVDe8fNMpYTulm;B3qg@4tr{Lj9F?q8k1IVbze
zA)x%P%I}FVgoFuw=z%a6W+B4ruo^zhhXsUTzp#i5B<@8&G(e+>W(W+#Ku8S2NGOcL
zD0qy<80653iSU?&$;e{^Yy*vLu`Lpqh3%lRJ$8V=j@S_i?1Wul$f{YgYBgEa;v}4k
z0H@(JSQ4wnQY?kVxi}w=-0JZpUV_KVco`b6;8lcJiIqs>HM|Cozv4Z_@IF339BZ%!
zJ^7m($7hIkNk7Nu@c2R~q=Xh4J%kYkNnwRWN;pwKM)VPV;6-0ikBn##MPx;z7=#MZ
zB3clN!D28f#Sk$DRiah2Mo+pIZKx9MVlr}K1F->YM9`>?2pS}4_=up9j|dvo5kaFm
zB4||03R!`?tdu=a9dR_OBaTLO#L=jZI2zRvN26!N(Ws6%8u^H$k&ieUKH_KudYB#t
zsfX*~5PF0jg;d1U(0Z&M3$4fLaj4X7x(y=YYXlKr!$o`zuQ$>gA=De|jiK}=dK0Ad
zrn&=JJylPI*PH3hP#MuTl6ot>HIjN8y$#}erk)9Rt7&Ppld+T|~Mx2h6UZ591=!NFW^a>-F`}`UZUiyk4f4A*pZGw<6TH
z>Dy2pxdBv1ZUEJh8$fmB22dTj0aQnB0M(HjKy~B>P#w7eR7Y+A)sY)Ob>s$+irfIS
zS#Fj?m>129NST+-%h2W(^9pj2KY%wY%}NAjm01O6UN^5pn>WlG@a8S^7DDs3c^e7y
zj(GB8MzbmjNAz-BX@#oNI99#cNlu17c^?o7sIGc`K<&r@Gs!zyU1$w;b6k!muMI-;o~
zj@sd<9iG~usU4o$5flAIe+;97#Hk&ls2xdaM~d2!q;|{_Q^XW>iVej^D2R>4#^@BA
ziVk#&sbVS$Vl&Z+PP%|W)R&FK9%2s^=mtDOQO!m?}OLAEH@&B>s-6;$!g{YQ-1gE7VFM1;$A&HF{IyI%T!&
zi6}AXg-%&3Yq6*7Et}9Oo8?p#WT)H`1vx{`K&RYVZjDa4jobzWxt-h*1-X;l8J%($
zxeEr#*>ZPu(s6XsadgsgbkcEbPQ@(JcWf>XkO!bZ_p!M=R33)S<>B&h6yy=|L=2$&
z=%o7?Ab%sTK{Gu_L0%_sKr@}lAS!P&{m3A>Ox}eSdAGb9ozV#Z#>so-BN!|nm5*Ww
zeac|@gj|jpbSu^JFY+(wk}Kq^=#VSrN^B`#ldqvezAj(KboqvS8y)o4qm@(=T}mm3
z(aNhBHdb+!L5Iq!Ji1hk>W2>1pvIy@jZ@>$rN*oE(4i)%3FuOj)ns(24b?{IP#dc*
zbg5}-8oJaLYEN{iz0}^=OwCh^(V-4ihhdC5Tpf<->Iii*I_T89I7_sOuEyw6H>g|D
zrEXJqqC?%K?naloM?H)V^@w^3)6~=IX>_P()HCQ(e^#%cRsBV+K!;kXR-#qCroP5>
z^^N)#TdMEWcNndq4aVv~2k6jNTeNAX(`eUOU4eF8scWzmXPDH3^S)YPo
zoO7CUZWQNSN}sKN3$2&xr5Mg>7wQZ21rVHbqx6;fN+^Amz6zQX&gpCPwNRXD>v5`S
zeY3t9it}tEeY?IL1$~FU8=d+deGe-2z50F>^aJ_
zKFTPtk(p|yVzk-JOhbp+!fb)v%ycsY9cCM|Jvz(|W(VxSd~S@{$?Sv>Q-y38Ci2d$AK$2_x#*#o;r=^fh4T(d7a%zkD+w3_*5K03?-vjBUTg=Qf-%p$W0
z)6D*6e{`7x%|Yle2b+VjnK{H9g4QVQLx(xc9EMhNxH%kqnIp}S=rBi_qcGYWZH`8V
zImR4=HuDSf3v`%YnqOjXbDTL2UFKKjcx-7-FejkPEHNjd!<=MJLYq0ooQ4i_x;Y)K
z<_vQtI?Qj(S?Drno3qhs&N075yIE?MqAf}g&|xk%m!QM^&ioF0m`lxN=rC89D=@}f
zX?~B<<|=a)Ha34S*PzQ>XRbqsx!&A>E_0K)1@p|U=5}Z|P
zfO!C2=0WoyTFoEL!`Q<-Vje+<`IGq*y3AwdF^n~jo5#^%o-j{f5A&pX1|3maiQUYz
z=2`4vo-@y(!#r=E$A;zw^8$vMm&{8TMw*;On$+es^BRVcCP$Da6QoH^j)LVa3Tu9Nx{kJjB++K1*Zn5qBA%>I30!H*TI=61iuM>gU%>oM9k*amdiqAg-8+u!y_N0dXO%MP$j=&;SU8Kdn$I}l^+AUg;hcCa0cE<3~yMTZ?>
zN1)Y?v?I}ON7+%B8)emKvt#TS>}^|ZEB3NuZ5ujlyIl|Mc7mONE<4dq#9nrNyFNzS
zNp=Ht*bVK5=&&2xjnQQ{wH@fPQ|(lA*iPGt(YDKWp(Dx?q3tv~4PAB%yCvGAToHvR
z^G285)^3Z)WJ;vA_?SU9=53-k`!(MK$L6^POUWX2Qy}cLh_CC8D
zdodl`-o9*KM!~MIE3kom)xL^8cBNg3_3dl+HB7Xt>?-uMuiMwrXy34Jpuc_7zKN~v
zTlOu~*|+W6m}B3u?_d}Eu6-A~+P~SqVYYqGzK5Oc`}Te8Xg{efd;
zH_1&x+D&$ok#QTi4baO?aZ`|W8@r7$$!+2`!DQFrI>3YyGu`HHb4+&A+%z=My%gOH
zHv^O0R&Fb7;kI?#VxZg6?TAg>&TeOH>Snvy*u>3obFit~-R+KgH_y#Oz1z!1`?BI@aN1?_Y?T*F{?ihCrYTPf}FR+6<
z)*Xw<^iD;0f;$0|-HGl*Omb(rvrwR$8c8=b(%tXwM=!VBEk~z&(Y=UXZk1bwUhX~j
z9(wr={e~DC<$dTu-&OPn_yaK6Kj?sk_u&@Z{YXc~_8kJ$X0DGpq!8H%Z=2lXo*D
z-7HBrB*%~obB1ZHcqH3Uz@0#01V
zS?kSgGaDgit>Uara=unXr(;N%1!f@5VoJ~ha?qKQ!%TkmEJblCInPTXIpFwG*!~up>`-jJIoG8oLZTr
zR#s9aE2xQ;)I@J5*-6mRxgLz&$ZiBrHB@#JyD7ZwupLm;L_;+UsDqw5SV;v`RJ{~c
z&)I|Q5zy2-PrVDNca`j%3P_JH-nERGf#K;Y&>44L8x@mgczI3;J>2B-kX#3OA4xpp$
zPZyhEKlhWXIl76(n
z&dkt*X6QjPbe|da;ZSy9h8l8Td|)?}zPwdDFba=oMOw3xlj
zUeM(FS`vLo^%+X_$xwX;lHzO4q2^EwBE{E|+?&blE!3bUGJ6jyQHDy?k4lswt+$wy
z&B$)RboXPWGpCUvGsooO;=nsk{aT{e>|o2iT$
z@?$fVaU_+oNM+1W6Kkl6wbaB$@?(z5*g}5nL49nbK4wUZ&D6vU2{A)9Y^DxosDq8<
z!8Fw{LlR6=4M&mzo2iBw>R=;TFHOqJlI-FnyIv%_JUOm{>^9u4v1>4lq$WselBAX-
zomG*}s>o$kc0`yRsVdlIwn
zAMH;08{S)oU3h|t8GlZ2Qc-X#MIj}^=@VA
z?U{N{V(RUgdN(okZer?PS<2(fKxrgsh%wpb(9@fGBvJYYTS#dv0!Rk
z!#Ur^)HuhyxEJ%{LClL=m>0J&FV@V9tC<(KFfYzADb`Gidod$!VLCjJ>9A%lteFc7
z=E6B9!itG-3lm|(M7V{CaE@89W)|GSELbxO?!hcL#}qin6u1}j-$BfO1@qq)=D#^6
zzb(vstC{xZnD+K!+S|gkS2OMH#hkZ=Id3oKyhBJjZOnOF$vchYoi^sYMJBwhOm$mH
zJ#9>NTgg6cq@HF{PaE^xBH5=u^W0V@xvk7_TbbcbAP2QEy`9AL)-%0rVtU)k+_sgu
zZ7XxzB6HhT=C+f_O>HEmHYT>MOl*tHYFnAowvwLOn9LT*P5qh77MaYpGLvm3L-l7G
zJA@?F#x%Cb9Ci|Us*NPoOp@x)1h$n4Y>`ye#_Y9~RMkeFYGdBoN}g(C#@fnswUs>8
z$XvCRxoRtORn0_IGEp5u!U{-Oj%?MFRMk$ZYA-vuC@oEqs)mxPvZN|Ys!EcodXlHw
znTn1kPbEoGN#>#B$x{J&Doc`zlcd^7QfZP@J4q@_hDws5+JEHZvScVrhU!U%vZSYg
z+|*8DY9}kD$V!&1lqD^DVS8YFsbapq_PK-$`&S-f=Oi$CY3Er
zDqEOT4q{T-!lY6#scd0V*@GO{Ms{msF4@XlvW2WV$iTC0m(DZa}hYV4-1&9f`E_I(MVisv`PJeBu?Ctn6Od*!_kSh#e~pw<
zAt23IZUG0}0uHzZ9C8cT$qnUnIJu?V5<9v*6^8az{84jA#CkAjf!ej3>uQftdk+@WaNwTMQHhwdcG}siBfuy5j^j)J2=oaCFC>>glMM
zF4~NSqdWG&X~Ai5!5P7?;i!)x_0a_v1Q);smjsuqs+etqad4E;wR`j1BXk3MuBhR(y#c^G!A
zq4UVmc^Ep6x^kCBn>L1?!_aLsvOlZnGpg8`jqJ=S`ivZXMvgus$7bT$(2H~+$pvw8K?}KH
zFwX&pFjvYjR}##XG|&DjIsbcd{`ZWoPC#E$Ku=~ed1g#CJo~F87c`R#dh_fr%d@`<
zp8aKc_E*6Ks+tK@H8UK|3`aA=(M+I9Nlra;D8)Rdo@ta~s#DKQN-^81Cw-LmCTqwb
zJ$d$5NfI$kel(LG&E!Wj`O(a$`cdOT=2JDKm7Yw5G*9{}nNrp8q_2kLVn{BAXc&YB)GYmW9pP+
z>J(?{lw<0YW9n4JyeY@LDaX7iM{V{@opMZ_BvU8J)G5c*DbCa>#neeNbuvty0;Wy@
zQ>QG|y^iW$M|H2Ky7!>E*HPVjP}h4fSISY{>!|K^RQEcndmVMXj=G*FgY}}i*OS3|
zQRC~V@pWXdUgex9+I*~|X4g@(>!{gv)a-g{c7dAhso4c;b{#dlK+P^tv+JnYeW}@f
zsn&JW>3S-3Jt?T6Th`ORe6kZ=Q&rj|&oNI)Gf&AdPf0OPNmH}yn5P)#DH$dyIVLGN
zCMl9hiei$IW0GQ+q(~+y873(?CMi`+QY4cU$s{GkB*id8$uUETle==vPz*B^$qXgO
z3`H_S37DZ6W+;XkN`~o4is?y?>4{-_l4E+Jn4TD>CmE(EIi@F)=}Cs^Nsj4BhSRAB
zr&ArLQw66}T{$<2t}UzMEUN2vHdI$mNurIm0%uNLIq8VD(&{)*>Pc>OrF4Tcq>j_0
zzMN}ByJkgBi5{F1b>;jb+90bdp8-YtVx_dAj&q=n6QGW&Uq{t%Aa_+TkC4nG1ogfL
zlZZwp5d)Yk44~T|Ko38FzI_0_`T%M45l6uo+uUOh*zo}x?7(WOhe
z^nm`{(3z*`%yV?+0iAh3XP%=oPtlnNbmloa^Bg^Sj-EV4PoASE4>+&tIIrqCsp{y-
zbDU1~oJ)0_OLd$@b(}wSoIG`$Idz;lb!5dHCr=$GPaS7Y9cNA*r%fH_OdVM<$7xf?
zX;a5JQ^z^usDlaWU=4M!4|Oo)oasq5>`kB9#0g_LVQM*HsySgQIbkX}TPitKJf})E
zr%H@dr5`6oEhk1TCq^wNKqb#6JSRXUCqOkPK%HCamZF(+pq6u>mUEz%bD-8w^;41L
z1n`^ym7D;zoB-9F0G<=T)5jXlfjZ8CI?jPQNMxxIT2Igupmmq-g4WaYH0ZT@JKB{M
zdOy7%Bs*E_gY-d=`e=PLq&`L;1I518dWl{F%>*>sQ@sVUoTWv3XaW)^cRQ^p{^+!#
z$hlGE+~~)-QRLhxa&82i8%55IBIibtbEB4XqsY0@hgSlXt^w-9=~3kL=-2JcqMmc3
zfpepQbEBG5!g4-X&Iil+P$cE2Na`t)dWwu*Llv(j4fkLYUZmox@=r6`doCr|iYlwA
zvPG(Fkt*AVD%+PTTcp1Bp}uPBYmxdI@ZX>h_m~Y;wof^)j;_KfQeXQ~UyD@MK2+8s
zm9-C*wW0j4673?Fvgjgpv`8K8O9j|JI4;55%+t^S?i_}p~9ko=@IB7dYZL`#;
zIRB0NbjwREl_vO6Dp*aWDV9^g=xUfEm8K7srlDKXL-Feww}aaO!tLaCf^@sMT_D`9ZdXXRo7)ZA?d|rC
zNKRCc;Yz24(Y+{kg=GH)>_5r=lf0sD2)nR_SJn(+FG}{JWG_ngVl{hFu61%4U5Ph@
zy(oD#%@B5EK$5fUMaN!rq_-^TElYZv-lEboOuPoWCj_g%O_Uc1lTu;lhVpE!f@f<(dA3%;v$YDItyS=Bt%7H36+Bx@aeJmWPuMD`E0QN{
z6+B_9;0ap=PuMDW!dAl*wi<5F^yWERf#+;PdCu0CCu|KoVQZj14WK@ilxYB2FiU+B
z)F(-OlHJbJ4E0HNJ4qANCrN#3S?eS%nh~YbGf8C%s7$ikxtZ*CZsw>=B~6mlBuPyw
zQJtVB$!=$2f@&nGMuI$-r5ZJn=dvWZEJ-d)lB;K)kY$n(Bg18x8w{d)4J65BNpf{0
zxhxqjONOhX_m9!<$4GBka$A;;eh}%co{m07FP|m7Wl3*Y(p#4F)`#lYRGxs*PX17G
zTQj+BI8Tr&c!E^H6QmlRAl32&DZ#U&IM0r1NO;3}c2vQ$qZH4MYIt^3!&9T7-8OG3
zcwSWCc~J#VifVXLRKb&?8gAP(@Qf%*8Bv^MIh?0M
z6+9iPA!QEd=}-kvhx(E@hm$y)Nu0wu2U@85l6o(@o&UJ<`A@_KiexFN`i`pasQQvj
z>8SUTdM~N>k~Ar)^o}%{B~8|mCbP^v8aV+ZnX--(pdZOHOR~(8EVE2GhLJC`z*Ma%Yy@nT_s8pdZnXKrs^(`bGUBlzv&i3>DoW0?LFYgfa<}
zfMoinOqHpEV)~|-e<|+1DM&2j+~~f0nIX>!PLDLHPLS#ZXUI=&V@B6dI?j;NPG*KP
zq`Z^K8R9rY9G!lGljP_2Gc%kaKixe`oL
zlT1XEj?z9}hFzX!XJ^>c-|yf>SBk8?eHUH-@l$(u(KR2A
zef(3~chTu)n*Ee!-;_4oqC1>Sh9qTqQdXQ)r$}|0RHsOFnp77f)x}EtX6%E1+!O1`
ziJ;9aGYgvfZ_HdX7uw7-^Ps8oiaM{jBOs{r(wt~cgo^Ht0&UJTXF{2C&AHI#d~-gO
zxxidd-l5dyGILpZhf-6|O?2-RDC)DO{z#q%3!VTAp4LWAZ60~fl8P)TCrzdiWSTUY
zMv!UJWSTUYCQYVElWEf22-c*TG&v?sj!Bba(%c1hq?t5nCM3;-Bp5-0NpNZk{)|$b
znu##j#D$upJT|MW5{_~+LkZvRHQj0L(a%FXJp8^
zsJMBmITr=zVw!U?&7Wh86H##@ra2KqPDI6tnC3)Ga3U&B#1wzxiW5R`LI_TXG$(}M
zUT107J-HM@4
zF-*V%>bRv(>HZs?;cs-7ztI`~MrZjOUBTbz3MLs674wWL<{4G=I62M_OOIoiXH?PSSk4m5duU3;=^7+mLn*Hm^t&a7
z6m*j%mXKtL5=E3~p>%?v`Ll_p$ASNp|B3D+u(sQY?mn`%&x!6eB7fG~MECs4l$}g;
zWqyXPBSUx5eKJ(gT~yIsRMA&t=_^9|iZp#foIW94b_mgx+sX2-U3ATM=^B>OeqE0A
zU&@0^-2cz9eso6=`TxZC(H%b4Cj02B=I@z4x<7{`saJ7cd9rw>Jb9w)bxV8np0r)X
zN#aS>r8HEpwR071uZQJ5tLTc;_*%PF(RHK=GV%9&Q_1ejJy=1=Z?{H$4Ez|lM6vQit)^%bZ-E~
zQwdF1s`xvqn2xD#+nlBA_%+>U>5eq2+gXF=S%WU;V$oe_G|v=D*W8z`tuJkf#ON<$
zWUvg0D@KEt;>zKW5oVkD~!nJPw_%8;Wnq$WpdijkT!6Vx+7XJyVRHDMreQ(KE&9mSS{EG4fT6J}E|@6r)dyk*{Lp
zs~GtzM(0tQSe~;g&RG@btcr71B{-#0W(w*G|J0_x?M@zKBeXck=Ai=HmIJeg0?1lul*5hR*kM7t~+V+ZbUnIqzNU$do
z?1=<>BEg7J8g}Au0AsC3_{tZSy#HK~mf{k8|5R&K^pzhZ5X2
zk8|5R&VEX;pAy{FikIh0ba$0FceUc&)rxahE6&r%WSQ=wyE-P>g$bTUCV3i}WJe~r
znHA^mNQ&K=;Ockw-W5FO71Yn
zxx*Z1pC!1%9A~#B%9A2;ISKY$CAXL3++L1zdpXYYx+Hrs!R?R~cdz2ySdMdJIZh8$
z$&KYWcSKU`*FY|z-T}xEj`B48C){U<8E@k9ty0;uzw+C4_N7n5@*3FZ3
z^FOoaQBBsZChJy{b*q1Zb)##!74<1m-sgy}-;V#xR)_l${g(DQRCflZwk4=-32Iv+
z+UMYFmefp1&6Ff^!S7P=yA=E`1;0y4<&@M+2`NHSuqxjNFggWL-A(}%PXQE90W!@0
zGbCcg{9iHuFI@*)M=n-B%KuAu;#1x3#P@Ugf1X;KFK=%|Dw`)YE9z^W`kJS{=BclF
z>T9068u9X$Mzn*Mr^@E3mwD=Co*J2_M&`>q8PWat>Zp8qs$HH6m;ceeMd_-VMpAhr
zH!b4y#5E-J1`>LXgx-%XIZKyZLzkSTORk|yE?qraLzi4bms~@Z??;zhL!wvo$~E-L
zHT23gbjdX&{Q^n9K+^BW%)fz-IZMafpPByvQvU#E{(_mm=?N6me$_4QmvjcI
zTiP$_4;0gW$%&C?+F#n!&2v8FIT`ZYA?(BX(8&3ar=O_e_Fx}QgFH1p-)(Or&)vU1
zRP;P||N2nZ>*+kIm~d55%k$LlJoUSgE~JXeou_8!xw+Se%AKcX=jl<3Os{-7`H$|;
z(}zh$mPtm)BqPQQqlOtq4c$zE8Ae~`|2^nwa`ZF><{70s0o2gh6qsZbm}Hc$6zR
zMQZ4B8kqdoFx4n9)u^H4DKPmTK*y6~!VzQgpJT$2Wx`RzgrkN|s4tWM9CMBsbB-Fi
zq5^Y{7;}yq<{bT*bHtc)gv>c&bWVzyzxq+;pQ3+CGxJwJ%KTNg%wI9{SIqnsGk?`B
z^UrtNAj#89scsu2dCs&vHyitKrse6blALLIPP07s82fOJS0`n&<0ka?#4HJp=q<~>>FJvH=y14y$;&d)qgwi8V6dvS9mx?lMuR514_
zZK%|7LiFT>=*bDulM|w}kyyv6mFGmN(22;oRljr=&bN=Lc7v(s!ndpDf{e}e}
z8xlS7B>Jz`Zd)I+>`J3M&VGO19No|H`;+FMNm|P3N^}QCLC>n0{^(MoQc6O~dl%82
zP`^LRjP83{(y!8nTImj^vV1lf-Px_QgZ8}_?4DYb@(LyuYx%8GCJ^0^NtDmDqWgDh
zv)Zg)>k6h)0;SC-<`XF9P`Y%c)y;K9w;0j?aIzKMYpHYvQz^01!Pdc^Q01&3x_gl<
zB><2p(6AW|$-fbZ3r?p_%#xBn{2qqkz1j`P&rmw<&
zyW(qC5Pn;BibTME6(n8B?^*F0r-0wN;didtQ=ytwaXs|pDIL?1-{qkBb1`kV`Md6g
z=37oUqjREoZ0h#24P
z?+K((i)OT9Lu`p%upfSf-{5z+0r%ob`~`o*7s84v(N7E&>vj8k5^40tK#avkn1R`t
zkK=I`F2#+w4^LqQ-oux|iJYhx!^8wkKsa&ArUfjVICFynuADS+dI2jZO`Bd2xlJd|
zEQpS&ogD>nR9DBQ1+i>e=hT8&J$>Tzf~=oDZPS9BS$>TQ8Ps7A#$jV@g>MO@@XqZk!Eorqt{q6+;m6zgFsw#6Pe
z07v3voQvP%R{Rmq;jj1*--(2%5d*~N=(#fdTMjwYV;Cl2Gt9!CI1oqS6r6{va2p=R
z^LQN}35cZVC7Q$-F{S*sJbIu3!!Z$^*baN)ARLWTaX$Wl+wllqz#I6x5F#aNMYCuX
z8P;P
z96Mld9D-lqbXiH*yDD~>!GF$$A04Lf2U7UNi)fs1f0
z?!seu32)<5p+!~{M2l#Pp6f?1>nW^f
zvMy!4i1l*Tt66Vky^ZxA)`wUhV||8o`RsZ7?Cn>uzRvnC>l)TiS-*~IC|MnAlC_dG
z&stzDvJRXxf2Uo-VXSSeQ&_uLXR^*_oyU40>rt#rSkGj=fb~k&8|Ut^+fLzKtPik0
z%K8-R^Q^D1u3~+gbv5h9tY1bo2G)QzK6l=ty<=I{YS!MY^{h>-Ls&<#wz00yx)JMU
ztkYR%vhFx{pIzq0=CICXozHq8>tU?NupZBP3hSAyOZVPw{$8<*STAS2n)OE3+gR^m
zeTelj)@N9kv#wx$o%LPTHS-qjJwNs->(^0@OIF94WUXY)vldv3tOHqxv5sLK&pLUZ
zd5iXrZ^GKeI)il<>&~pZv(95($a*mA5v<3uE@3^5^{jp7&z=`QkM&a4t66Vmy^HlB
z)+bn>XI;ViChKa}Pg%c>Y9iQo-lDw|N!Ci%JZpiq$U2a980#3;@vM_sH(~8!oxwV5
z!A^4*CU$1sopm1TLe_&>k6=BPbqVWftY@*F$9f6tm8{n;*n5|K6F0No!FnI-!>muR
zKFj(N>q^!)S>I#*i1l;UZ=;&j3l73sM1VoHff@&Dxu_p0$Z}2#hM>+!6ou%5}fl=ULk%NNdDw0G)i)*D%GW4(v<
zA=bxOpJ83jx`Op})^}Oguzt$=^})N&-zP0u9cz-ck~Pm-U@fu^WF5vjhIKsaWY$es
zyXZMfkFDf0>;DJ-TOiM`xGt+kJsMC%f8gKx{pik9(NBBb)>?kfbz9T?oa?ei?jwr|
z;NRdqf!=(5>$c|jIoEBC@pC#>&l<7@tdV~eu&hxM5S`9OmCs~HobRvOn&RhNx3wof
z=en#Cm8hbY{m;A=Oc2&}E%4{EZfo@HRI!e0AAZhtTl?~JuG`v=pL5;T1V87xtx0~)
zbz7_XIoEBidi`TP4qNxK=^k{Z|1~{5Cw*YL^#959Y3WN!f4U($
zxd22%HAHa+JVdbz9*M;mey-l_;r4V7yGPuk(X09H2EL{Zqx8GsS%`+0
zqMtW_0sP1_5DgEn^^r><8lorB|Hq#>1ES%cA3h=)qTkNwiHO>FLCI#fIb_4-7;0D8
zSM5qZ0rjunKLgcux&z%=?re9C`>k8*&U06|E8XwiJ?=htzkA3%?w)c_yFa^U-E;1F
z_kw%Tz2g4jK69VDFWi^zYxk}D&cmFlRer~_8U)rzi*Y+Fxt^LkLk42MCIqi(w+Rb!}-J$L(_Xl^iyT)DXu5&lLTih~t
ztGmtJ?(T4Ry1U%n?s|8FyV2d`g_mA=?Trt-_0D@A`k0UVgirb&zS{Tnd0*pu`C8xG
z*ZG3)UDR%y;pZ`z3k}fyX9qbPMiJ$*Zy`IberJwV^^2#RqN#FllbbBT9N@-kNRmD*a(Q8U%HYL?ngZLfAvJF1=3&T1DmTkWcLQ@hL8
z)gEe3wU?T!_Ez)MK5AbzUoB9FsD)~g+Fu=@4paxJgViBwade%DI$Ry0PEtpzW7IFy
zvFexVIQ1)ayjr48QYWiZ)G~FdIz#Q}JE>~BmE7kASRq7AwYITjeR$ZsAS2w5|)lKSVb&I-H-KK6=cc?p~?HqNF
zx>wz&?pF_}2h|_d!}2ZlhS^_i`m=ggJ*S>mFR10}MfH+;S-lcH
zYfZhXR;t(3D)m?Ox_U#ssoqj=t9R79>Tl{j^}brIK2U4ahw3BsclELQM1870Q=h9Z
z}I;GP(Bj1cRf^?;>(miyw?y2*-
zM!sR5F@HACn&-?^vzh5MU1oDL&1_+&n=Q=@vz6J}Y-47cZOyFc`4wgdv!mI`>>NEM
z%Is?9M7t_x53{G)%gi-8H%o(cR_kwzg07Odnfs8*I_`w~f)$du(*y^+C~-
z2+`gW3?Y{%LOHoA-EI6K~MV5is(qkRrL)ovC&Ro-r4r`s)U
zqutKVwAN7y6nQTAwijQxc@*8b8SXMbgnw@d8F_7r=nJ=D(_OO8$!)x3;?V`!DO;gzptD(zl;iH?_6e=4X{{
zPNZ!=Qnvl5Z9lJUN2;TLM%hkPr&HP1g|038Pn7MUNZbCqmF-{EwI8dR+CWW-o}T${
zr)kl1?Eg13?R$;C>YvcHVgI0PW9>NGX4~y}yPln3Czh42q;4e*>#lK|+i7-&-O6rl
zx3M$rwsw}?&Tema_(`4Hv#fOU>^?tIy956zy*t4!u_xM-ex!Q8`AOZoh|2dnd#Szb
zNBVcIz0O{5Z?HGoo9xZ@7Q3vhgm+L2@3!~Ydw)_9AG43!C+w5|sEc;_x=_a2hcL!%
z=r(e@xY=%3H^=Sfc6amL0=LjDa)-IY-4X6c_h9*H_s98P`Qv|h;{C}#JoElJ|Ga;}
zFZVC<3G=V`zm%RbALhbX7!MO+GE9Z(FcW6Oim);q08#q@y_7_NxO@>(tduW7N(oVW
zWw-z5W&S^}@c)suXF|KcS?8RGsEz!%sEypYs6B`E0#rlPUVu1yqY=ZksdZ{o%cFKfKrW!+Y&Nyf^-b_tyL2y$L_OH}Qw}*8l!JzXPPF
z2dyna)Smf+n^X|B$3xUUwbn|Llm>xVxjd&g^!fv8>B?aztYZy|bDcK=B4=@7lYKg}8d*?YF$Z5{c7k}LSP@C5%Y
zj-b0Ah`hkE|0y4!9#N0|$N~Is^M5z`mv8=Szd`?3>RS7E=zoB@{Jid-^1sAfKTljg
z&0Fi9wSMd&OQiMR^tVMutM_&COo%(+)T>Mt&;4R#G{YRFx{P
z3aY3Es$pu38m}g+O;nefp=PO_)$VGZTBr_IN2p`f5_Ot7OP!}KQCF&K)y?V-b)R}z
zJ)xdeFR7L4P4%AoNPVup)mn!-t#i7U?yDPhiyooJ>Ir&^?$Fcp)_QwATkom&)%)wk
z`Y3&zK1rXU&(Rm?OZ8Rydc92Fr616b>ZkPc`W3xOzpYp6kM)-ZCNOc6HPxoKsW(k#
zh#6(t%=%^{vzeK0W||$%95dInGtZdi
zW`%j(yld8&PtDhX3|x>5DuaAb2#Ud|U~(`m*fE$FEDnwj&I&FKZVc`S?h76co(P@|
zUJ6zQZwBuL9|d1p*uchZ)>hlzw%#_`A$F7$D49+T~m?*Vi?=7B|9;
zbraka*WtR{bhove<#u$l-R^F#+t)302fHKOv2KYw%bn*gaaXzP-7~V;*jZnW`>-DfMNi%0-^{g
zU_#6R6%_;oBL)x^Gv+KJDx!#4(QQtMBABxbpkhKX!h79SZ8-bveZu?w@x8)SNJjIu%`tmeip6;*Z3}2q<
z%W1wm%a>>S@*H2D>&xlBoZ-uvzP!+vvwV4xFE94xCBD4WmzVkSa$nB&?RKRvukz*9
zzP!el*ZT50UtaIa8+>`AFK_ncExx?nxBOgR-r>u6zP!_yclq*eU(WaCg182n-sgMj
zeqTP|%ZGgVurD9++28>#JTx3H~k^YpuPl}(V?Znm#&V_T%(
zr>l|J?siMt*0xO7rE8Gb9(F6+&SvQk=@&?BPrJ2kZ}arW^h+dmGrNuLV9V+H^eZH`
zm+fae+RF5&bS)Cw+xEAeY*qSm`ZW^U$8Kvo+v@a}^cy60bGx1GVq2xZrr#n;KS+PG
zDKz~s{T-Tqlx~2gAEz6k=_eM@^iwO)^fRm6cgjZ4bfq=Ww8qB8r|tjcr!`&0`IdAw
zBwYhZzksA)Lej4w=~_toH6;B8l70)dBkUf2*Sb+fDRvLUc0YTpJ<1+o4?}GCx5wF|
z?UD9ysGVXbL+wO6wJ61Zf2X}3YVWc)K<(Z3MyQ={Z-Ux;?9EWSz}^D2v+W|Nz0y7a
zwO82(q4sL~5Y%2{ABNiN>?2S+*FFlhci6|EcAkA4Y8Trlp!QySE7aa+Z-d%}cFzB&
zqlvv9VsC)h8zJ^4h`kwNZ-LlbA@(+ioddDAL+$-6o!F0|PVFa97uin{+a>k``@A#u
zGpLL0=TMi}m55wwYwR;nXYDGeb9ObZ3bIqZ4scQkXZ@89FyUb-!`=-mGcDXAe_Fh
zuAcoCiT&07Za=awy88AzsB2)qhq{J#9n@9WAE2(0WgPhbzwYcIv7bQfrx5!Y#C{I3
zDc+VJpza{9l5hjv!BDrGI|Sc5&}=X|()
z#8$<3_)RD1GzjXW3vR|jtd(u#RBf)E^mttoHHc1+E{a|>6>h0})2-zvISlo4kqr#r}fY5Hysfsya>=Cu9HB
z$|ZirzGC0Dzd#ZHhvU3rUnzF3sqK%psjto6d}cfRo&UbX?`><_#jjNs+uXMDGua9w
zL;Py)d$ps#f*YYo(^cuWfZfCHfs&nUC!?0V-rkN)?8o*;G;-UzZPCf?$i>F;2NP{QNQincK@<|quoKieqCVD20%NsM>RU4
z3tFQawnlsO!-437gD@VWFcH^bEN;NfxD>Zy9%kb%+=c5gAMj
zz$^F)Yw-@g#X7u)AF&Z1iO4osBmHGZX=gf{bEJ!zZZ47O=5lj|aK!zPTpkaM2g#y%
zd2*yY=q9_#x|^Hors`lf%}vwY-KFkQ-NRk(F4rM$wwtYcx@+BaI@I0bZqeaxuA8fS
zx%qCs?(Ob%_v#3@$Su;5?s50Hj&e)gQr*YB;g;#X?qj!7_jjw^mwIriU8$WOUg}ut
ztVfi(mb&WErS7HfIu?rkWv~neWQZIA@jD?lljCJP%5suSL@Svhr=pFVE@z^HoF!+Y
zvz#k4&{by21?V9c$wlZTm&$DPmaF6{Y$?~sJ^mf$i!ekUmd7zv7RzFckf-D+jP!4u
z8YR!mE7(_-$P$c^=2Ll8@vY93kJyI!u=JvK~|AR|QV-@AaIfvBo&tzt{5||6b1-
zT1V?(rqLk3QC+ifv
zr>E)}_`tvQ^AkN+&&B6DLuX*6&eU0`(TnwBeChX=`$`w+{gUVd`k2(xC-h~hudnJ7
zDeF>QDpmT1zA4qZLRUx|?!P2$&BJkB=@{3KTgVx49+&0(xH{fRF60i0a$j;(n#)3O
zH%EB8InvwBQQmHj_I5MY+s!fFZjSYKGtS%1@!oDu@OE>ex0~_aZYFrUImz42L~l2f
zz1^JV?Pi*{o3poa^moIs}{B!FH%Uz>c;D+A&^RC)kthBzv+w!=7oU*|Y2$ZnB%|
zrnyVqUMiPbm0FkDQCa0FMws-2bXEFY`kQ~6W*+Xs7dlF7xF*iWpY|B9pG026-Odnf
zBI9McJf#h_neL?r>ft(0Pt#ZJ?tDv7{B`^d5Pu)9gC@0-wlID#o=U$LPy2N1bZd0?
zJKFT%8Ugf7N2f=iS9(-B7X8xW(vz@VIw?I31N?3^d#3lL_hD3ee|kUmNgqfbz`p52
z=_A;W_uDa=SHLkXYW;cE?~AjB9e~RIOzr%c+WRwg^k?ej&$PKeQ-6P^UHq}Ql3ddE
zzT}=W8h;)C03@}NBmIuTjnc}rJCOEFw?sXzc0jYVf4T!&_+wZ4V|Vn&?vhSQXP|dF
zGo6WD(hJkev1>Xzy%9sWx&Zt5bMBWeNEhG`e~pLwYdp+f-Z7BVi|tNM!X{;TjPBn7n)IV
zr7U~O5mHITl`W{a(vONO+shO=MRug($}Ut~8A!#I-Ke;-2NhR_QgLM%6<0=5ab=X;
zFN@?@Dz1#9;>rXnuAD^0m5EebnM}o%(`2bEmD8!aa)x{?-^jVtU71bYm8+?{a*akB
z$xYNaNVwrrJ#IqVCFk>aN^J-IWKmgLaUIsJrqobyrqU
zaphAgu6$0#m6cRnSw+Q_FR8fl6%|+3>UbS5UsG%48)~h5N3E50dX}CoKT&Jt7iz8i
zO0AXOsI@B8T2*STHmBBVnY(ssTYXYr)^_@;zN(v1akUo}S9?=&bqgx4_SH}H6WvB@
zv_|_yn?{>z|ENLKK(~!fk51R^q8ZT)-9DNb&D0&Di=vBk$LPiAMcv6%mUXpm<9;+EULL<4jf&rmKZy2^KZ-w(#>6#oO>{W-
z5{r(Azlgtzj*NdyO3~QlsO0GAjO3VPd^9aNDLFNonVg>H(Pe4-w7uav&0eM#^HI~=
z4z`0$e>>C;HQREBAG4i3z>YE7Q#a%6)#!0DFc#%M9d>5E~d(#YcHLk`Cb8FlhGu*9pYt3Gzic*EyyVRuA#Ed94E0xViYO)#4$Y91W
zGMGac8O)(j41w{_oU{j(sSCP5F&^U);bz5E+6^nd08)YInL9QC!Mc0vOm*(-d!Zln`*
z0-ESForb1<-_~ZjM3-3cj=0b=UKy`M=JyoNIj%xEUK{^_O0S>o{SIu?{obN8
z{2puPr61TBGkw0j(C4;`e5U?@AB{Zd^W2Ah2L6c8-5>RN_~Z6EyBPoQ8Td+{fv@rz
z_-dblukji9mp%jk)@R_~`3!s=GjQ3|Zg8EX4l`WYhAZiXPiPF3?U;ef_RPR#2WH^1
z6GsIyfLVd;$*e$zGAoc_%nD>UvjW+RS%K`$NGv0m704)N1+ovb0@;`Ofb7S7K=x-o
zAO|o$%V_2UGRCcTtL1RUXE}mdfgI&WJQpkX>Z&YyoV_W&r&K#?M?}7zjc;4NXYmKW
z7xR&*O$)|Yzk}Q{enfRFYmP~*IVQ8_IGHua6xJM5S#zAin&VW~9H-NEaR##qoXPs*
zEY=@qv;H`T^~braKc>5nT@B7-{c$ntk4tFHxQy0}%W2KHg4T@d__VWbr6c%suFlXA
z00xHt%Kqpf+W=ZCiTF#H(a?<=p55_Z+Yj4eJ1j=+jT@sm8`cBS9C2mH_57vQ*M$Je
z{y8W<`5OVsv7-U%Z|+x20iC!)%l|y$Q^WN)M?AwH?)@*v#=F|R?3?~6p*`JBex%eHy|E(>#KAZg6LB6cz{R*0
zH{xErhmY|ozQWI9rM0w^uF_4mwg=iB>=-x1?&Cg}Au?W0k?C@cJSES_3i(LZ$#1GY
z1M8@J>3({k&%v(Hh5Dc_)+hBDSEFi)JJu(
zKCdt9QeCDW=xSXXnW%PDCu$H?MxCP`QSWH$XuD{~Xy53-=%i?JG&MTaKPxgTx-ps?
z&5Q1i?ulNAK90UObxZ?O;h&eNHeF3m)5~mO`kL*{q_}I#0WBxAyr|_9EnmputWMS-
z%d^&5*Q`&rZMJi^Tef$$Pj*l?E}N8{m0glum;Icld7Zo>Z<)8vyXJlJe)*31Zu#E%
z$b6rCzx;swu>9D3Tz*16K0hg+l%JeW&Ckg%%&*9=&*$Xx^M(1-`I7vN{N4P+{L}pF
zd|kewY|C}Zjmpi+S-Gm*rrfREx7@G1LwP{?xbmd(spaYA3(9wv=a(NYKUP_)Y*5*#
zvZ}I8WtYlfmHSs7P|zpA3DSyfimv1*s9(N%|3JyYGTx?}aL
zt>?FXvF(i=(@uwW8r$iFIp@#0W6s@k9+)@uqv%)NuyNx?0JTv@H}u5~a+)sG2lNSj
zR$tUtb(t>Lk92K>D2eJs^`b^mb<{Q5EZXAFc0bNPyK_o3%|D}aQFL>3M|5X2KUxsI
z7=071Gj&Zv(}>Thm{z8n+067dea)6;2Q#DPfR;!5c7Hn4td!NyvaD6sCF`ASmFD^(++HRs-WLqEc=!gk;I1CZVwBu-BFOX`vv`2WetzMT2j&w=E*sS7`@`sh{YUZx|rlw!bu$p~q#??%%
zIj82bnm#LM)$FwL>Y9^QJ`zq)!`)O+!wB%_*Q#;+-&Ji^y|8NFs+Kj+uBub>Ld^?6
z&3vHdo0>0ynlD!_UA5J!zN3}
zD<`j<3am_km7PAH`RPTUj{lhJb@2vU0wZ1o#!TAxoDSQk?>N6=S55?EmNto&0ZH$q
zf3jV&Q!)TZ1}FOi$uY?UAUPvBJGmygCs~v{{71FJ|0Pc+&jJZo7W=Q{Wds<%im&u<
zSDSWAeQo$<-?J<2m-a{dQ+N*5!IfNH*T}W{ikGiMbM}Ygr{Q|h(
zO7%;PN^MH*O5Fgio%rV?m%8xh{ON!Go&PCq$bXf3;7^L5bOOj9UtFWXpM-P$@l*fx
z-^A(vcVe==$PQ*iwO883ZbvuJed=~KE$kU~g+18~aI4*J_BTFb?UvfN+%9%U_p$A3
zTG}&h9lMFGYlosKV$?>JkL=w2aTs>O01UyIMO^HQ1$f5C#<#H8zK7*f;Ui=n>5h+d
ziX19?$|yNb4wSKSyqqEPMwLATaU+Fgg}=Jr|LU2oCZ%mwr*-B+JR
zOF0UO3`HhKql=u19pn%30_pr(;W*iLK=V>@9a=XSoi0%3O?)`PfCS#}V=(4wL6`
zl)Q{1vt)y8#HAWxwmMv{DX!F7
zxJK*aW^Il+TE?xKX-mx0)_6^K!6NO7S9C{a7WhoZV5J^{&-Gxe)#LHKPQ-UQ0pIF)
z{HD|JtDb>h^mM7#dnMPqrIubLRk}c0>YY;7`O-ljmLB>K=_%Xj64_SYkp8+kBC6&f{n^a00>8;Pn4!Q#SW3()mCrx`XdV##EPng`4O=c>w
zId+h%a0#x~I=Bh*wH-E*k(eT%;Q{R?o9NZjKyQ+|dcD-s8>GJ8D378-#-NEDg4S{(
zj*;a!TwcJ1@;lzpL0G1{;Q)DDencN^FSBuoJd2a03+~WXD9bTuB`08o?tum}8qMW!
z>>+com)wO@WF^j$ukeKS!4lmWHF_vk>(R2QUMrd2g>^a!8}w}1LSMu@3geLGppTFYn2B@~sTex|-;wT3efH6K$+*w5<%%F0z{r)RB6e9-~L;SUpk?*CY6D
z7o94L>|6$PbxA{
z_m?+hnOrHC$klp@o~LKZ(^^j($jLHEFVo9SwW%_#Ob64+z3iTM&z0J`SKN#46SvI0
z=3aF#xFzl-_q2P~J>!mYM;5v68uz7J>5g_2i+vi7amTuG?gV$dJI>wWCcDes<8Hp2
z>aKIwy4&0$H`h&bPr6gxmF^06vzz4RxrOcyce{JQEp|7$``iLI$6fEPare8~?oxNJ
zd&-^eu5xF(%iJmMF?YAS(>>uHb&t3Q-5Ks-_mKNX{8Msa{BttPO>ig0za$sg^W){E
zic;hFYdbUkCjK`5E?yV^ker=NOQt7hCFdqHl5>*t5+qkA*Cdi?!hO`QORkE4O)iUn
zOD>OpPp*hJB(vj<$(4yoZg%67IJqTBk~FzBxh=7YOG-Y&9%Fi$QD&ss*X(EZH+!2A
z<^Z#u>1PI+p=LKT*z93;H$%*xX1LkQ3^V(f(dIz2+^jHfo43q6=3VoF`Ov&?J~OM$
z8uOI-hxx)hZay`in9t2hQ)50dADdO?CG)&_)4XR6GGCg5%~$3Sv(_AHzBY%MZ_MH5
zTXTf@&KzmJH%FOu=4kVS8Ebwt$C&lzSo4$VZ(cAD#@m{Q;_Xat^MpCh{A|XVU(E65
zS95~-&75d{H{;C)Gr?>$C&e%mV~KZ;cQKRV$ebJ-GbN7A)HpGx#Hl$ow&t{$ZwnY;
zPLE6GjJTFLGv36U6>n-Q%XXo7~B0D-+O8PQo@a3;pCGY%7;xD>)xyPWq^{*N3E|J|f%cGBlQh(M%4*rm_#}%6_OP`=h=bfI6}-
zQW*v(d!ZzIqn3<-mEjmFcVM{OiT&ge43wL&o7{rIaw~S1+b~FO#x(g7XUG~nty|$)
z-3AY94?L=y;W6!n$F(;e(Vlo-`{PC34ln8Ucv*MA3%ac|)SIP|-YQLWjx^J`(p>M5
z7CKLw>h01?pOww@8R?_X%U1ewa&K~9a(}WgS(GeDo=7T^MoELDVbZwNG%c5!l-iW4
zlV!;p$(zaR$p=ZBq;1kI>7Mi`H7~U+<;m(~ZL(vsQ?h-sL#ah6E0vS=$xmsN+GMX}
z?_^jqJlVZeS*j|vN-NTaX`{43nkTy@gOkz8fytOs>ryj&ft_V9wwK$>>?QV6JJFB*
z$Jv2?{C_s*-|SBIcl)kg!aZe78~dw$$G+7?yWA$8JB%Sp!ceopiZ}dcrmmN#p{l0MM#~uCv
z#QpvFlw(xRMR8^+!1*EW>{SWa-2lHMR~2A~0e&Z~YQXLefVp@pz%mPO9k9&Rd4IeO
z;C2T5?u=~#JKWzh=Pov|V*zvs*zEyy4A@`%{1xZ0UHDLD!
z&<(&AK>7gyX5f7RyDNY#19mR}TLtW!0JaX;R{(4iupDvp3)npYuwD8WqlIk&5BEyi
zu7KCadK1=hhXUs1JN^xhHpqbh*cRkq0J{_%3xIVc69Mp=$$6YHEVux`pn{75us_JP
z00tM_2!Q=T?ghXdKFNCk*k0sg0K7KxDS)8`UjbmhlAi&vpN0d%-3QrrdvUWT0Bq~M
z0pXa1Gnyj-VLyxt2-|g^faUe>8?bDf{Q`Cjfc*oGbvhtm`MJ>n_j%D?2XZX|0Dfi+
zAmafX6p&Mjc03r6=>QH1$Ta{C4aidf4hzUL01gkx3IIn0b~b>U19l#OTLSh<0JjD#>u_7Z(cb3-9BuaYfTNAg4LI8O9Rb5#
zPk+-d;#1RQ-}LBO)VX!rL4mVVD!@`Zp~
z3gG^LeG9;%fTRCC5U{L2+xJ1h(MLG1`Ve5LC7hpl7%<#rm2)nS0QO7(j|MDv#C$AZ
zx#Q;J0ZV;-B4FufY%jvyE}tym{5@@yP=7gNO}P6ZpQI+VH`*@Yj(g7*a5ux}3c3T}
zeqe+?{6YbBhr5Ciw&6Qxd9|_xpZA#eouNSa>ZxpcY
zmld!rskwyhzr28L!Tw&sd7I*QfBgP!fCzW;4!+_E!`29zKP#f6C9|J-i{3IaMFxu;se^p7tC!klmh4pNUegi0NEtK+=2GwIUSHq1I!(0Tb`MK)D19q
zka`6d0Nh}b__){r@Z1du@4L`0ChHW4|)bJ1688%rE2{K-f>r
z^Vmn-3+Th_?;as83j3I>1!S`T*mu1O)&tTzfLVa_0c3MPHUP3k0G9&NH=wjf+5zLq
zY(TaOC~b>&K%cuD;N4t*N0;{4FMuln=^s$q-L?T-1MqD*L}@$Q2N-YpW*egH=N$u#
zt9%O$QT8G2i8_Nx>=sZSgKIV!{}%zWdqCOl
zdjuF8n1>N%y=c4C&UXRtt3v^0zBnvE?G%1L98l(M%paK(tptSmpbZCjc@!K)s}n6CDo->%^S$H$V;w
z=rllhZsz8{0>b(o0_YhbX85@A3n26>-W8%99$rAdp&uRr=)Hi@mk9lj{&p0g)CB4m
zp*@TZ=v9CmQ$SxlHlPba9AYf;zC8{gdMAABVf^tveFFU5E#8;%cV2k+g+9mYWIp*Y
z@BbFiS56A(KLBCd5&F!e0^0KAfGz=q{z+)RQv&)1AX5uyJ`2zb0ij-;9r6aD7MufsK7DQhe?Ps*{pq{Z9mYo1=ez*N
zYF@jk0apNWe!<0n*KUrhXlp#*g(3b4bzxR9wz&u(9CP^3TnyN20l6f=@qth;E-l6z
zmjRv+0iiB1muG#c9gLqm9(Cc$Fw_?I{Z)YS+OG~M;~q7FG4_U#L-;)6t|ES12PpNG
zF@P&V9t4Dc$DIB-_&kHThEj)a3NW7&>dVc%n+eD*0p>?S9k~_YyTatQ0_q=ihcMpW
z9#FOoV-<6H`sE!3tOK=X9-zEN+9+XcXT9$Nlzl)SAk<0PD`5=0C!jn(?Vd13(U%Bg
z&V2>c?}Y*7_1<4V?WBG!0(1o+4+J>Y^z~zYPd#`D5c7(-Zh#v$hM
z)bE-Cw)d(4s0Ym7$?t%y32=PFe4Qv`>6ZbHb%go*SAa6EGHx-CXDni_Lug0LW5|zy
zFeWjNXAZ)+#XO$50Am}WW~>WvZbN=3pzZMU%;Tx$%xMVork?^FXUoq4t_>5$E#~pe
z9~j#R+l29tc|8Ay*GU*pm=7_JXTNR?=pI3{I2FQoc_`PHF^?Y&KR@E_%JZ%oKAtyv3#Dj5`47J1IC700pHe}0EFXg
ztzFOu&`kpzztVp^I|Eubz;T<_D>yXdVa&xiW>a1pIXcYsaK49Q0<9>x7SKik=Goe~
zfc0+@@Z+wgfQR!n%>o=7F}L%a4QPu1b5G`No)<$t$DGd3ALRg{FERfkod3|u0OOWc
z1vvMi)dj=Cx