From 2736b481a4e96d5f3425e46387799d586eeb288b Mon Sep 17 00:00:00 2001 From: Naman Aggarwal <31132760+root00198@users.noreply.github.com> Date: Fri, 17 Jan 2020 01:10:30 +0530 Subject: [PATCH] Added aspect ratio module (#1454) * Base file * Added aspect ratio module * Compatiable with Experimental GIF Manipulation * some refactoring * Changed the name from aspect-ratio to Constrained Crop * cleanup * Changes requested * Added test module Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com> Co-authored-by: Jeffrey Warren --- src/Modules.js | 1 + src/modules/ConstrainedCrop/Module.js | 56 +++++++++++++++++++++++++++ src/modules/ConstrainedCrop/index.js | 4 ++ src/modules/ConstrainedCrop/info.json | 23 +++++++++++ test/core/modules/constrained-crop.js | 10 +++++ 5 files changed, 94 insertions(+) create mode 100644 src/modules/ConstrainedCrop/Module.js create mode 100644 src/modules/ConstrainedCrop/index.js create mode 100644 src/modules/ConstrainedCrop/info.json create mode 100644 test/core/modules/constrained-crop.js diff --git a/src/Modules.js b/src/Modules.js index 3c34de70f7..6a00ab6dfd 100644 --- a/src/Modules.js +++ b/src/Modules.js @@ -13,6 +13,7 @@ module.exports = { 'colorbar': require('./modules/Colorbar'), 'color-temperature': require('./modules/ColorTemperature'), 'colormap': require('./modules/Colormap'), + 'constrained-crop': require('./modules/ConstrainedCrop'), 'contrast': require('./modules/Contrast'), 'convolution': require('./modules/Convolution'), 'crop': require('./modules/Crop'), diff --git a/src/modules/ConstrainedCrop/Module.js b/src/modules/ConstrainedCrop/Module.js new file mode 100644 index 0000000000..cac7f81572 --- /dev/null +++ b/src/modules/ConstrainedCrop/Module.js @@ -0,0 +1,56 @@ +/* +* Crops an Image on the basis of the ratio provided +*/ +module.exports = function ConstrainedCrop(options, UI) { + + var defaults = require('./../../util/getDefaults.js')(require('./info.json')); + var output; + + function draw(input, callback) { + + var step = this, + startingX = Number(options.startingX || defaults.startingX), + startingY = Number(options.startingY || defaults.startingY), + aspectRatio = (options.aspectRatio || defaults.aspectRatio).split(':'), + widthRatio = Number(aspectRatio[0]), + heightRatio = Number(aspectRatio[1]); + + function extraManipulation(pixels) { + var width = pixels.shape[0], + height = pixels.shape[1]; + var endX, endY; + if(((width - startingX) / widthRatio) * heightRatio <= (height - startingY)) { + endX = width; + endY = (((width - startingX) / widthRatio) * heightRatio) + startingY; + } + else { + endX = (((height - startingY) / heightRatio) * widthRatio) + startingX; + endY = height; + } + const newPixels = require('../Crop/Crop')(pixels, {'x': startingX, 'y': startingY, 'w': endX - startingX, 'h': endY - startingY}, function() { + }); + return newPixels; + } + + + function output(image, datauri, mimetype, wasmSuccess) { + step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm }; + } + return require('../_nomodule/PixelManipulation')(input, { + output: output, + ui: options.step.ui, + extraManipulation: extraManipulation, + format: input.format, + image: options.image, + inBrowser: options.inBrowser, + callback: callback, + useWasm:options.useWasm + }); + } + return { + options: options, + draw: draw, + output: output, + UI: UI + }; +}; diff --git a/src/modules/ConstrainedCrop/index.js b/src/modules/ConstrainedCrop/index.js new file mode 100644 index 0000000000..71549002ce --- /dev/null +++ b/src/modules/ConstrainedCrop/index.js @@ -0,0 +1,4 @@ +module.exports = [ + require('./Module'), + require('./info.json') +]; \ No newline at end of file diff --git a/src/modules/ConstrainedCrop/info.json b/src/modules/ConstrainedCrop/info.json new file mode 100644 index 0000000000..30115138b2 --- /dev/null +++ b/src/modules/ConstrainedCrop/info.json @@ -0,0 +1,23 @@ +{ + "name": "constrained-crop", + "description": "Crops an image in a particular aspect-ratio", + "inputs": { + "startingX": { + "type": "integer", + "desc": "X-position (measured from left) from where cropping starts", + "default": 0 + }, + "startingY": { + "type": "integer", + "desc": "Y-position (measured from top) from where cropping starts", + "default": 0 + }, + "aspectRatio":{ + "type": "string", + "desc": "Enter aspect ratio in following format width:height", + "default": "1:1" + } + }, + "docs-link":"" + } + \ No newline at end of file diff --git a/test/core/modules/constrained-crop.js b/test/core/modules/constrained-crop.js new file mode 100644 index 0000000000..6fafcf2f80 --- /dev/null +++ b/test/core/modules/constrained-crop.js @@ -0,0 +1,10 @@ +const testModule = require('../templates/module-test'), + benchmark = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAADICAYAAAAePETBAAA0IElEQVR4AezBD3zU9WH4/9f787m73N/8vcsll/8cCUk4EgKEBIV+sVgEXR8WH121urLNP1NrV1fbfnHFrnSIj9rN+ZvfVquttpVOu9rp3OzUrVhaVEDABEwIhJwJhPy5XJK7S+7/v8+P2+Nx3+V7vVOJAdna51Mo57DA9gyO8MLJIfzRGI0lhdza1ohZryUUT7D7WD+HxyaRhWBddRnXL7UjC8F8hOIJdh/r5/DYJLIQrKsu4/qldmQhGJ7x82TXSZyeGSx6LZ91LKbdZiFlz+AIL5wcwh+N0VhSyK1tjZj1Wt7L8IyfJ7tO4vTMYNFr+axjMe02Cyl7Bkd44eQQ/miMxpJCbm1rxKzXEoon2H2sn8Njk8hCsK66jOuX2pGFIBcVC+ylU2d45K0e0kZng/S6PTx29Vp27nubrvEp0pyeGcb9Ie7pXMZ87Pj1YbrGp0hzemYY94e4adli7n51P/5ojBRXIMT2Xx1i1xXtuAIhHnmrh7TR2SC9bg+PXb0Wo0ZNNq5AiLtf3Y8/GiPFFQix/VeH2HVFO65AiEfe6iFtdDZIr9vDY1evZee+t+kanyLN6Zlh3B/ins5l5CKxwJ7pGSCTKxDisSN9dI1PkekV5zC+SJTz1T/lo2t8ikyvOId5+tgp/NEYmZ7tGeCZngEyuQIh9gyOksuLJ4fwR2NkerZngGd6BsjkCoR47EgfXeNTZHrFOYwvEiUXiQU2GQyTTdf4JLmMzgY5X6P+ALl0jU+SjTsYZjIYJhtXIEgurkCIbNzBMJPBMNl0jU+Sy+hskFwkFpi92ARCAaGAUEAoIBQ2L64EoYBQQCggFBAKGpWgttDI+WooLgChgFBAKCAUEAoalWBDnQ2EAkIBoYBQQCjYi03Yi00gFBAKCAWEAkLBXpxPLvaifBAKCAWEAkIBoWAvNmEvNoFQQCggFBAKCIXNiytBKCAUEAoIBYSCRiWoLTSSi8QCu2NFMxpZYq5Wawk3OurZsqSOTDe3NqJTqThfNpOBLUvqyHRzayM3OhZTlW9kLqNGzS3LG7ljRTMaWWKuVmsJ62ts5LKlsZaqfCNzGTVqblneyB0rmtHIEnO1Wku40VHPliV1ZLq5tRGdSkUu8o5zOGcyGObsbACTRoMsCdISisKgd5aZSJRCbR5zheJxBqZn0MgSWpVMSplRT0eFFY0sY9FruXpxNV9odyALQbvNQlW+EbUss6SkkD9d3siVdRWkheJxBqZn0MgSWpXMXJPBMGdnA5g0GmRJkNJus1CVb0QtyywpKeRPlzdyZV0Fakli46JKtLIKk0bN6opSvtzZis1koMyop6PCykwkSiSR4Pqli7l79TJkIchFLUlsXFSJooArEOLyqjK2X74Cm8lAmVFPR4UVjSxj0Wu5enE1X2h3IAtBu81CVb4RtSyzpKSQP13eyJV1FaSF4nEGpmfQyBJalUyKCMZiygNvdHFwdIIUo0bNF1c5WF9jo2/SywNvvo0rECLFXpTP1y5royrfyPMnB3nq6AmiiSQpm+xV3N2+DFkI5uP5k4M8dfQE0USSlE32Ku5uX0Y0keCBN7o4ODpBilGj5ourHKyvsTEfoXicB97o4uDoBClGjZovrnKwvsbGe3n+5CBPHT1BNJEkZZO9irvblyELwXw8f3KQp46eIJpIkrLJXsU9q1uQi//g0zt+fWaMtGgiyZtnXawss7DzjSO4g2HSPOEIvZMerAY9397fTUJRSBvwzKCWJJaVFnO+Do25+fb+bhKKQtqAZwa1JLH3zCi/PjNGWjSR5M2zLtZWlVGozeN8/Z/DPfz6zBhp0USSN8+6WFtVRqE2j2wOjbn59v5uEopC2oBnBrUksay0mPN1aMzNt/d3k1AU0gY8M3xuWQPS68PjZEooCt/r6mUyGCaT0zPDT3r6yWbf8BjzsW94jGz2DY/x+vA4mRKKwptnXczH68PjZEooCm+edZHLvuExstk3PMZ87BseIxcpkVTIJhRLkEsoliCbaCLJfEQTSbKJJpIkkgrZRBMJ5iORVMgmmkiQSzSRJJtoIsl8RBNJcpFWlZvJ5pbWRowaNZmsBh3XN9vJpsNWynx02krJpsNWyqpyM9l02KzMx6pyM9l02Kzk0mkrJZsOWynz0WkrJRfprlUO7EX5pMlCcFtbEx0VpWzrXI5RoybNrNfytctWsKG2gi1L6pirzWrmc8vqmY/1NTa2LKljrjarmc8tq+euVQ7sRfmkyUJwW1sTTeZC5uOuVQ7sRfmkyUJwW1sTTeZCcllfY2PLkjrmarOa+dyyeuZjfY2NLUvqmKvNaiZFKOckFIW+SQ+ecISmkiLMei1pB0ddPHn0BDqVijtWNNNUUkTaqD9A/7QPm9FAQ3EBH9aoP0D/tA+b0UBDcQFpCUWhb9KDJxyhqaQIs17Lh5FQFPomPXjCEZpKijDrtXwQo/4A/dM+bEYDDcUFfFij/gD90z5sRgMNxQWkqDhHFgKHpZhMz51w8v3uPtLu+eWbbFvTxvpqGyk2owGb0cBCsRkN2IwGMslC4LAUs1BkIXBYijlfNqMBm9HAQrEZDdiMBuaSyGEyGOapoyeYK6EoPHL4HaKJJL93YUjk0DflIaEoZPJHYwz5Zvm9C0NFDkXaPHIp1ubxQZ05c4aDBw/S1dVFd3c3XV1djI+PcykrKyujra2N5cuX09bWRkdHB9XV1VwMKnJoMhdhL8rH6Z1hrg5bKWa9lvcTj8e5//772bVrF/F4nP9OxsfHefnll3n55ZdJUalUbN++nfvuuw+VSsWFJO84hywkIbissgxXIIQ7GEYry3y8tpJ72ltQSxLv5fjx41xzzTU8++yzJJNJ/rtLJpP8+te/5t/+7d9Yu3YtFouFC0XFOXtOj/BC/7v4o3EaSwq5taUJs15LsTaPr1++kvPx9NNPc/vttxMOh/mf5siRI6xcuZLHH3+crVu38n5C8Ti7e/o5PO5GFoJ1VeVc37QYWQhyUb3kPM0jh4+RNur30zs5zWNXfQyjWs35OH78OLfffjvhcJj/qcLhMLfffjurVq2iubmZ97Lj9UN0uSZJc3p9jAeC3NPeSi7SM8f7yeQKBNkzdJbzEY/H2bp1K+FwmP/pwuEwW7duJR6Pk0v/tJcu1ySZXnn3DL5IlFykyWCYbFyBEOfj/vvv58iRI/yuOHLkCPfffz+5jPoD5DLqD5CLZC/KBwEIQAACEGAvyueDOnPmDLt27eJ3za5duzhz5gzZNBQXggAEIAABCNCoJGoLTOQi3bHcgUaWmKu1tIT11RV8UAcPHiQej/O7Jh6Pc/DgQbKxGQ1sqV9EppuXNaFTqchF1Vpawt9vWMczx/vp9/i4xl7DHy6xIwvBB9XV1cXvqq6uLv7wD/+QbO5sW0pDcQH/eGIAnUrFHy1toL2slPeiCsXj/OidExwcc5Hys74ByvQ61ldX8EF1d3fzu6q7u5tc+qY8/KjnJK5AkJSnjvVRZtBTZTKSi/RYVy8Hx1yk+WMxHjzYxZBvlg+qq6uL31VdXV1kE4rH2fnmYVyBIGlO7wwP7D/Ce5FeHxkDAQhAAAISKLw5Os4HNT4+zu+q8fFxsjnmnmIyHAYBCEAAApy+GYZ8s+SiSigK2UQTCS6GX/ziF5jNZt58803+5V/+hb1796IoCheSJEls2rSJzZs3097ezpkzZ/jMZz7DQkokFXJJKAq5qFaVmdl3doxMHeVWLrSqqiquvvpqUlavXs1f/MVf0NfXx9/+7d/yk5/8hGg0ykJSq9XceOON3HvvvTQ2NpK2evVqSkpKmJqaYqEsNRdjVKvwx2LMZTXoqS0wkYvqrrYWRgNBnF4fKbIQ3LysmaaSIi60jo4OMjU1NfHkk0+yc+dO7r//fh5//HGSySQpKpUKh8NBbW0thYWFFBYWUlhYSIrX68Xr9eL1ehkaGqKnp4d4PE6KEIJbb72V++67j+rqajIJIVizZg0vvfQSC6UgT8O2jhU8+Nbb+GMxUsw6HV/rXIksBLmoirV57FjTzhPHeun3+vh0vZ1rF9eR1jft4eCYC40kcVlFObX5JhZKZ2cnudhsNh599FE+97nPcfjwYdrb21m+fDlarZYPIhwO093dzaFDh1i1ahVr1qzhvaxdu5aXXnqJhdRRbuWHmzbQOzWNLAQtlhJ0KhUpCUVh7/AITq8Pq17PhppKjGo1KqfXx7379uOLREn5bvc79E17uHf1Cp7rd/L9Y72k7T5+km2rV7C+qoKFsHLlSt7PmjVrWLNmDedLq9XS2dlJZ2cnH0RHRwcXQkGehstsZcyVUBTu/c1+jronSfv5KSe7N1+J9N3ud/BFosz12pmzvDgwyFPvHGeuhKLwyNvHiCaSLITp6WkuFdPT01wsLw4MctQ9yVyuQJAUqW/KQzY/P+UkoShk8sdiDM3MsBB6e3u5VPT29nKx9E5OkYtk1KjJpqGwgFyKtXkshJ6eHi4VPT09XCxmvY5cpC31i0AAAhCAgAKthj9rXYq9qAAEIAABCOgot2LW6VgIp06d4lJx6tQpLpaNNVVoVBIIQAACEPwn6fol9fzJ0kYK8tTIAhzmYr61dg1WvZ5dl3eyrqIcnUrGqFaxqbaar3WsZKHccccdXCruuOMOLhZ7YQG7Lu/EXpgPKJh1Wr7Y1kKKShYCq16HVa/HoI5RqtdRkKchpVibx9c727kQ1q5dy2233cal4rbbbmP37t28/vrrLJRQPM7u4yc57JpAlgTrKmxcv6QeWQiKtVqseh3+aAyLXofVoCdFeundIR489Db9Hi+j/gCvnTnLl/a+jj8W40LRaDQ88cQTCCG4VAgheOKJJ9BoNCyUHfvf4uenBhiamcHp9fGj3j7+/u2juIJB7v7Vb3hzdBxXMEjP5BTbX99PivTMiX4yuYJB9pw5y4XypS99iaamJi41TU1NfOlLX2Ih9Hu8dE24yfTK0GmePn4CfyxGNtJkOAQCEIAABCDAFQxyoWzcuJFL1caNG1kIo4EACEAAAhCAAAR0uSdBAAIQgAAE/0myFxSQjb0gnwvF4XBwqXI4HCyEhsJCstHIEhuqKslFuqPFgUaWmKvVYmZ9VSUXQmlpKaWlpVyqSktLKS0t5cOyGQ1sWbyITDcvbebGxgaqTEbmMqrVpKhaLWb+fv3HeOZEP/0eL9fU1fKHDYuRheBCcDgcXOocDgevvfYaH9adLctoKi7mwNg4GllmXYWNdmspKd+54n/xwsC7OH0+rHo919rrSFGF4nF+1NvHwXEXKT/rP0WZQc/6ygouhIqKCi51FRUVLJT1lRWsr6wgk06l4sbGBjJJjx3r4eC4izR/LMaDh44wNDPDhTA8PMylbnh4mI+K9ProCAgFhAJCAaGQIMmbY2NcCE6nk0ud0+nkoyIlFIVsookkF8LIyAiRSIRLVSQSYWRkhI+KtKq0lGw6yqxcCMlkkqGhIS5VQ0NDJJNJPirSXa0t2AsKSJOF4DaHg6biYi4Up9PJpcrpdPJRUhVrtXznivX0TU/jCUdoKi7CrNOR1jc9zcFxFxpZ4rLycmrz8/mwjh8/ztVXX82l6Pjx43yUVJwjC4GjpIRMzw0M8P2eHtJ2nzjBtpUrWV9ZyYfx6KOPcvfdd6NWq7mUxGIxvvvd7/JRkshhMhTiqd5e5kooCo8cPUo0keDDGBwc5Mc//jGXmqeeeoqhoSE+ShI59Hk8JBSFTP5YjKHZWT6sBx54gFgsxqUiGo2ya9cuPmoSORTl5ZFLcV4eH9bg4CA//vGPuVR8//vfZ3h4mI+aRA5NxcXYC/IBBVAABVDoKLNi1ulYCF/60pd48cUX+aj97Gc/46tf/SqXAokcZCHYddllrKuwoVOrMGrUbKqt4Wur2lkofr+fLVu28K1vfYuPgqIofP3rX+f6668nFApxKVBxzp7hYV5414k/FqWxqJhbm5di1ukoztPy9fYOLiRFUfjLv/xLent7eeSRRygqKuJicLvd3H777bzwwgtcKKF4nN0nT3B4woUsBOtsFVxf34AsBMP+WZ7s7cU548Oi0/HZhiW0l1pRvTQ0yCNHu0kbDQTonZ7isfUfx6hWsxDq6ur4zGc+QygU4tlnn8XtdpPpJz/5Cf/0T//EDTfcwOc//3lWrVrFhbB//34effRRnnvuOSKRCBfSjrcO0OV2k+b0+RgPBripoZG7f/Nr/LEYKa5gkO373+Tfr92C6pn+k2RyBYPsOTvMtXWLWAg1NTXs2rULWZb5xCc+QV9fH9u3bycWizFXKBTihz/8IT/84Q9ZtWoVGzduZNmyZbS0tNDQ0IBKpeJ8xGIxTpw4QU9PD++88w6vvPIKXV1dXAz9Xg9dbjeZXjl9mkRSwR+LkY1qMhQiG1cwyELZu3cvmzdv5h//8R+55ppraG1txWAw8Od//uckk0myOXz4MIcPHyZt+fLlHDp0CJVKxQcRDAZpbm7m9OnTfBRGAwFy6Zp0k4tkLyggG3t+AQvpP/7jP7j88ss5c+YMBoOBzZs3873vfY8PQqfTsXv3blQqFR+UXq/n0Ucf5aPSUFhENhpJZkNlFblIdzha0MgyCEAAAlotZtZXVrLQ+vr6+OQnP0l+fj4VFRWEw2F27tzJ+7n22mtxOBycr6uvvppPf/rTfBRsBgNb7HYQgAAEIODmpc3c2LCEKpMJBCAAAUaNmhRVq9nM36/7X/z78GkmQyGWlpRwbZ0dWQguhHfeeYeHH36Yr371q9x4442UlJRw9uxZHn/8cXK56qqrmK/LL7+cn//853wU7nS00FRUzAHXGBpJZp2tgvZSKynf+dh6Xnh3AKfPh1Wv59o6OykqzrEXFHBnQQsXy86dO7njjjsoKSnhRz/6Eddffz0NDQ389Kc/5dChQ6QVFxfzqU99ik9+8pPMV3NzMx+l9RWVrK+oJJNOpeLGhkYyqfgIzM7O8td//df8zd/8DX/yJ39CSklJCfX19bS0tDA0NERDQwMpXV1dlJSUMF9NTU38dyKxAMrKyjhfDz30EL/85S9Ja2hooKWlhZqaGt566y3i8ThCCKqrq/kwLBYLF1JZWRkLSWIBtLW1cb4URWHr1q309vaSotVqqampIeWrX/0qVVVVlJWV4XA4uJS1tbWxkCQWwPLly5mPsbExli1bxtVXX82ePXsIh8NkCgQCXMqWL1/OQlKxANra2pgvRVF4+eWXefnll0kpLCykrKyMWCyGx+PB4/EQCATQ6XRcitra2lhIKt5Hn2eag65xNLLEZWU2ak35ZOro6EClUhGPx/mwvF4vXq+XuZLJJJcilUpFR0cHC0niPTznPMXdb+zlmYET/Ojkce78zR72jp4lU3V1Ndu3b+dCURSFS9H27duprq5mIUnkMBkO8dSJHuZKKAqPvNNFNJkg03333cfKlSu5EJLJJJealStXct9997HQJHLo80yTUJKAAiiAAij4Y1GGZmfIpFKpePrpp9FqtSy0ZDLJpUSr1fL000+jUqlYaBI5FOXlkUtxnpZsmpubefzxx9FqtSykRCLBpUKr1fL444/T3NzMhaAih6aiEuz5hThnvMzVUVqGWasjl61bt7Jq1Sq2bt3KkSNHWAiJRIJLwcqVK3n66adpbm7mQpHIQRaCXR2Xs668Ap1ahVGjZlN1LV9b0cH7aW5u5sCBA3zjG99ApVLxYZSWllJSUsJ8abVaTCYTH4ZKpeIb3/gGBw4coLm5mQtJxTl7Rs7wwuAA/niMxsJibm10YNbq0MkqrHo9Vp0eWUiU6Q1oZJkPQqVSsWPHDm6++WYOHjxIV1cX3d3ddHV1MT4+zvuRJInCwkLuv/9+ZFnmw9i5cycPPPAAbrcbRVF4P2VlZbS1tbF8+XLa2tro6Oigurqa8xWKx9l96jiH3S5kIbGuvILr7UuQhSAX8a9DTuWRni7msur0PLbuSna+fYCuyQnm2lRVyz0tK/m997ft4D66JieYa1NVLfe0rCQX6ZmBE2RyhYI8dvwoXZMTZHpleAhfNMLvvbd+n4euyQkyvTI8hC8aIRdpMhwim67JCXIZDQb4vfc2GvCTy2gwQC6SvaAAhAJCAaGAUEAobK6uBaGAUEAoIBQQChpZotaUz++9t4bCIhAKCAWEAkIBoaCRJWpN+eQi3dHUikaSmau1xMKNi5vYUltPppuXONDJKn7vvdn0RrbU1pPp5iUOdLKKXFStJRb+/rIrePXsaSbDQRxFZq6tXYwsBHc2t9JYWMzBiTE0ssy6sgraLWV8GAlFYWjWhywkak35XGoSisLQrA9ZSNSa8pkrlIgzNDuDTW+gQJPH+7mzuZWGgiJ++u4JdLKKz9U3024pIy2UiDM0O4NNb6BAk0eKinPs+YV8vrmQbK6wVXGFrYqF0OedZlfXQVyhACn2/EK2L++gymjiUtDnnWZX10FcoQAp9vxCti/voMpo4vnBUzx5sodoMkHK5qo67nasQBaCXPq80/ywvxdXKEDKkyd7KNMZqDKaeH7wFE+e7CGaTJCyuaqOe5atROIiCSXi7Hx7P65QgDTnjJdd3Qe5FIQScXa+vR9XKECac8bLru6DHHKP81jfUaLJBGkvDw/yU+cJcgkl4ux8ez+uUIA054yXXd0HOeQe57G+o0STCdJeHh4kReIiOTrlxh0Okck542VodoaP2tEpN+5wiEzOGS+7Tx0nm33jI+RydMqNOxwik3PGy+5Tx8lFxUWSUBQQZJVQknzUEooCgqxCyTgIfks0mSCXhKKAIKtQMg6CrCQuEkdRCUa1mkxWnYFaUwEfNUdRCUa1mkxWnYEbFjWSTUdpObk4ikowqtVksuoM3LCokVwkLpICTR7bWlZjVKtJs2h1bF/egSwEH7UCTR7bWlZjVKtJs2h1bF/ewQZbNVtq65mrraSUrfXN5FKgyWNby2qMajVpFq2O7cs72GCrZkttPXO1lZSSIpRzmIeEorB3bJiBGS9lOj0bbDUY1Wrejy8aocczhSwErSUWdLKKlISisHdsmIEZL2U6PRtsNRjValLc4RD7xs/iDodwFJm53Gojrc87zYGJMTSyxOWlFdSa8nk/7nCIfeNncYdDOIrMXG61keaLRujxTCELQWuJBZ2sIm006Oekz0OF3khDQREfhC8aocczhSwErSUWdLKKlISi8A8DfbxydpC2klLubFqOUa1GKOdwnhKKwra3fsPRaTdpVp2BhzvXY9HqOF8JRWHbW7/h6LSbNKvOwMOd65mJRth2aB++aIS0DbZq7m1dzXOD/Txx4hhpshBsa13NFeVV5OKc8bLt0D580QhpG2zV3Nu6mosloShse+s3HJ12k2bVGfjJ+s1IzMOLpwc46pkAoYBQQCi4wn6e7D/GfLx4eoCjngkQCggFhIIr7OfJ/mN8p68LXywMQgGhgFDYM3aaF88M8GT/MRAKCAWEQoIkjxw/QjSZIJfv9HXhi4VBKCAUEAp7xk7zhmuEi+XF0wMc9UyAUEAoIBRcYT8pEvPQ45kkmz7vNPPR45kkmz7vNH3eKbJ5brCfhKKQyR+LMTQ7Qy593imy6fFMcrH0eCbJRWIezFod2RjVaubDrNWRjVGtxqjWkE1DfhG5FOVpycWo1pCNRavnYjFrdeQiMQ9XVdSikWQyXVdTz3xcVVGLRpLJdF1NPVtq6slUoMnj9sYW7PmFZOqwlGPR6shlS009mQo0eawrq+RiuaqiFo0kM5c2GCFF3nEO56k4T4ujyIxz1osnEsai1XHbkhY2VdYxH8V5WhxFZpyzXjyRMBatjtuWtLCpso6lRWZUksSg30c8mWRpkZntrZ1UGfO5rLQCVyiIOxxEq5LZYKvhnmWrUEsSuSwtMqOSJAb9PuLJJEuLzGxv7aTSYOJiKc7T4igy45z14omEueqIk/uM5RhbmhDKOXtGT/P86VP4YzGaCou5paEFi1ZHKBHn6VO9HJ50IUuCddZKbljUiCwEw4FZfnDyGM5ZHxatjhvtTbSby0jZM3qa50+fwh+L0VRYzC0NLVi0OkKJOE+f6uXwpAtZEqyzVnLDokZkIVhow4FZfnDyGM5ZHxatjhvtTbSby3gvoUScp0/1cnjShSwJ1lkruWFRI7IQDAdm+cHJYzhnfVi0Om60N9FuLiNlz+hpnj99Cn8sRlNhMbc0tGDR6ggl4jx9qpfDky5kSbDOWskNixqRhSAXedUtn9vxUO9hpiJhZuNRBv0+Xp8YYWNFLd/sfpPXxs7gjUXwRMN0T08wFQmxyFTAXft/idPvIxCPMREOsmfsDE2FJXRNuXio9zBTkTCz8SiDfh+vT4ywsaKWb3a/yWtjZ/DGIniiYbqnJ5iKhFhTamMhuUIB7tr/S5x+H4F4jIlwkD1jZ2gqLKFCbySX7W/v47WxM3hjETzRMN3TE0xFQiwyFXDX/l/i9PsIxGNMhIPsGTtDU2EJXVMuHuo9zFQkzGw8yqDfx+sTI2ysqOWb3W/y2tgZvLEInmiY7ukJpiIh1pTayEXm2k/sCMbjzBWIx/BEwrwxMUKmgRkv/liMPt80mVzhIAfcowTjceYKxGN4ImHemBgh08CMl2urF6OVVSyUf3i3j+5pN5lc4SCbKurIpn/Gw5P975BpYMaLPxajzzdNJlc4yAH3KMF4nLkC8RieSJg3JkbINDDj5drqxWhlFdlI7nCIbLqmXeTSNe0iG3c4hDscIpuuaRe5jAb9LCRXKEg27nCIXEYCfnLpmnaRjTscwh0OkU3XtItcRoN+cpHspgJAARRAARRAYVNFHaAACqAACqCgkSQ+Xl4NKIACKIACKNhNBdhNBYACKIACKIDCpoo6QAEUQAEUQEEjSdSaClhIdlMBoAAKoAAKoGA3FZDLkoIiQAEUQAEUQEEjSXy8vBpQAAVQAAVQsJsKsJsKAAVQAAVQAIVNFXWAAiiAAiiAgkaSWKw1kIt0Z+NyNJLMXK3Fpdxkb2ZLTT2ZbmlYxk32ZqoMJuYyqtTc2tDCnY3L0Ugyc7UWl3KTvZktNfVkuqVhGTpZxUK6rraBKoOJuYwqNbc2tJCLTW9kS009mW5pWMZN9maqDCbmMqrU3NrQwp2Ny9FIMnO1Fpdyk72ZLTX1ZLqlYRlqrZZc5Mce/JsdnaU21JKERafnmspFfKFpBbIQtJvLqTKa0MgyjQXF3FzfwpW2GtSSxMaKOvJkGZNGw2pLOV9xtGPTGynTGegstaGWJCw6PddULuILTSuQhaDdXE6FwcjZoJ9yvZF7lrZzpa2GtFAizsCsB40so5VVfBAJRWHQ72MmFqFQoyVFLUlsrKgjicJEOMBaayXbW9dg0xtJc4dDjARnMak1yEIipd1cTpXRhEaWaSwo5ub6Fq601aCWJDZW1JFEYSIcYK21ku2ta7DpjZTpDHSW2vDFIkSSCW6oa+Lu5pXIQtBuLqfKaEIjyzQWFHPrIgcbKmp5L0I5h4ukzzfFrmMHcIUCpNhNhWxvWUOVwcTzp/t58tQ7RJMJUjZX1HF38ypkIcilzzfFrmMHcIUCpNhNhWxvWUOVwcTzp/t58tQ7RJMJUjZX1HF38yqiyQS7ju3noHuMFKNKzRebV3JFWTXv5fnT/Tx56h2iyQQpmyvquLt5FdFkgl3H9nPQPUaKUaXmi80ruaKsmvmQd5zDRRBKxPnyoV8xEQ6S5omG6fFOYtUZeLDnIAlFIW1g1otKkmgpspBNKBHny4d+xUQ4SJonGqbHO4lVZ+DBnoMkFIW0gVkvKkli7/gZ9o4PkxZNJnlzYoS11koKNVqyOTQ5zoM9B0koCmkDs15UksTe8TPsHR8mLZpM8ubECGutlRRqtJwviYvk6PQE7nCITM5ZL7udvWSzz3WWXI5OT+AOh8jknPWy29lLNvtcZ9nnOkumhKLwxsQIuexzDZPNPtdZ9rnOkimhKLwxMcJ8SFwkCUUhl1AiTjbRZIJcEopCLqFEnGyiyQQJRSGbaDJBLtFkkmyiyQQJRSGbaDLBfEhcJI4iM0a1GgQgAAEIsOoN3FDXCAIQgAAEIKDDYiMXR5EZo1oNAhCAAARY9QZuqGsEAQhAAAIQ0GGxscpcBgIQgAAEIKDTYiOXDks5CEAAAhCAgA6LjVXmMhCAAAQgAAGdFhvzIXGRFKjz2ObowKhSk2bR6ti+rJMN5TVsqa5nrrZiK1vtS8mlQJ3HNkcHRpWaNItWx/ZlnWwor2FLdT1ztRVb2WpfyheaVmA3FZImC8GfNbTSVFBCLleUVbOlup652oqtbLUv5QtNK7CbCkmTheDPGlppKihhPuQd57jDQV4dHeQ3rmEiiQTVhnw+DHc4yKujg/zGNUwkkaDakE9KpcHE5spFNBeY2VBew581LKdcZyRlRUkZAhgL+VlbWsFXlq7GoFLzXioNJmqNBQz6vZTrDHx56WqaCkpIWVFShgDGQn7WllbwlaWrMajU6GQV7SVluMNBIskEf2x3cF11A2l9vileOuvkuHeKfLWGQo2WlBUlZQhgLORnbWkFX1m6GoNKjU5W0V5ShjscJJJM8Md2B9dVN5A2232c8WdeZPbtHtSF+ahLikhREgkm//WXuF94ldDQMLq6KqQ8DWJgxqNsO7IXXyxC2obyGu51dDIfzlkv247sxReLkLahvIZ7HZ3kklAUth3Zy1HPBGlWnYGHV30ci1ZPLs+dPsET/UdJk4Vgm6OTj1mr2HZkL0c9E6RZdQYeXvVxZmJRth3Ziy8WIW1DeQ33Ojp57vQJnug/SposBNscnXzMWsW2I3s56pkgzaoz8PCqjzMTi7LtyF58sQhp1+UVc+fHPsHID37K0IOPkSZkmYa/3U7J5vX0/vE9+A52k5ZXUcaqvf+ILG35xI7h4CxzDfp92E1FVBvyOV87j73BcHCWuQb9PuymIqoN+WTzz8OneOmsk7kC8RjeWIS1pZVk4w4H+Xr3PhT+iwJ0TbsQQvDyyLvMFYjH8MYi/Gr8NMPBWeYa9Pso0OTxRP9RFP6LAnRNuxBC8PLIu8wViMfwxiL8avw0w8FZ0rShCBu+/hQmrZahBx8DReH/UhR8+4+AELie+wVzJWb9VH/xT1H1zUyB4Lf0+NxcXlrB+eqbmQLBb+nxubm8tIJserxuEPyWvpkpcumbmSKBAoL/hz8R46URJwh+S9/MFK5QAAS/5bkzJ0mggOD/4U/EeGnECYLf0jczhSsUAMF/6nztGJuee4OUkSd/hpJIAoK54jMBxp/9V0CQjWRUacjGkqdnPowqDdlY8vTkYtbqycao0pBLsUZHLg2mIrIxqjQYVRqyaTAVkUuDqYhsjCoNRpWGlLKzk6x/6RBpRkcDuRgdDeQibaluIFOBOo911krmY0t1A5kK1Hmss1aSy1XldWgkmUzXVTWQS1NBCXZTIZk6zDZuqluKRpLJdF1VA1uqG8hUoM7j9vrl2E2FZOow27ipbikaSSbTdVUNbKluIOVTP34NbShKirqogLq//DyGpsVkKlrfSdVdW5HyNGQj/+zh7+xQSRKDfh9xJcnSQjPbl11Gpd7EfCwtNKOSJAb9PuJKkqWFZrYvu4xKvYlcivO0OArNOP1ePNEwljw9t9W3sqmijlwkIbistBJXKIA7HEQry2woq+We5nZKtXochWacfi+eaBhLnp7b6lvZVFHH0kIzKkli0O8jriRZWmhm+7LLqDLkc1lpJa5QAHc4iFaW2VBWyz3N7ZRq9TgKzTj9XjzRMJY8PbfVt7Kpoo6lhWYqxjyU/uINlFic/BUOlvx/f4VuUTXFV64lMjJOdMyNrNdiufYTLH7gf5Nns5K/chmBE05ikx405aXU/u/bMS5bgkoWgjKtAavOgCGuxqo1kK/R8H6GAzP8YOAYTr8XS56OG+uaaS8pRxaCMq0Bq86AIa7GqjWQr9GQEkrEefrdHg5PjSMLwbrSKm6obUIWgtaiUr7XcRXZ7Bk7zfPD/fjjUZryS7ilvgVLnp5ijZa/armcbFqLSvlex1VkkoXgprpmbqprJpNOVmHVGbDqDMhCYNUZ0EgyKa1FpXyv4yoyyULg8EVxVZQh5/vJq7CiLiogRWMppvH/fJNsCjqWs/zF75NJXnXr53Y81PcWU5EQs7Eog34fr7tH2GirQyPJZOMKBbjrrf/A6fcSiMeYCAfZM36apoISuqYneKjvLaYiIWZjUQb9Pl53j7DRVsc3j73Ba+On8UYjeKJhuj0TTEVCrLFUkMtLZ5081PcWU5EQs7Eog34fr7tH2GirQyPJLKTt3b/htfHTeKMRPNEw3Z4JpiIh1lgqyGX82X/Bee+3iU5MEffNEjz5LlP/vo/S6zYh5Wk4X9IzQ70gFBAKCAWEgivsZ8/4ELn889lT+BNREAoIBYQCQuGZoeM8M9QLQgGhgFBAKLjCfh7rf5suzzgIBYQCQgGh8PKYE18sQi7PDPWCUEAoIBQQCq6wnz3jQyyk/plpujzjIBQQCggFhMLLY058sQi5DH/vH0AIEAKEACGIjLpw/8svmQ/JHQmSzXgoQC6ucIBs3OEg7kiQbLqmXeQyGvSTizsSJJvxUICFNBLyk8to0E8u0XE32URGxpkPyW4qIpvFpkJysRsLycZuKsRuKiKbTbZFZKORZGqNBeRiNxWRzWJTIQtpSX4x2WgkmVpjAbkYmhaTjaHJznxId9a3oZFk5motKmW9tYZcrqteQpUhn7mMKg232lu5s74NjSQzV2tRKTfVLWVLVQOZblncgk5Wkcud9W1oJJm5WotKWW+tYSHZdEa2VDWQ6ZbFLehkFbnUfe0upLw8QAACEBSsXo75mo8zH/Jj3/qbHZ1mG2pJxqLVc02FnS8sWYUsBLmoJYmN5XUkFYWJcJC1pZVsX3YZNr2JMp2BTrMNtSRj0eq5psLOF5asQhaC9pJyKvRGzoZmKdcZuadpNVeW1ZIWSsQZmPWgkWW0soqUMp2BTrMNtSRj0eq5psLOF5asQhaClISiMOj3MhOLUqjRMlcoEWdg1oNGltHKKt5Pe0k5FXojZ0OzlOuM3NO0mivLankv2ooyitd3IuVp0JRZKLv+Ghb91RcRssx8qDjHbiri86YizsfLo05eONtPNJng38cHkSXB3UvakYXAbiri86YiMvXNTPHDd9/BFQ6Q8qTzGGU6A1X6fJ4fPsmTzmNEkwlSNtsWcfeSdmQhsJuK+LypiEx9M1Ps6nkTVzhAit1YxHbHGqr0+Tw/fJInnceIJhOkbLYt4u4l7chCkEvfzBQ/fPcdXOEAKU86j1GmM1Clz+e9GJoWU9e0mIUg7ziH83RoaowHjx8goSikDcx6UEkSLYWlZBNKxPny268xEQmS5omG6fFOYtUaePD4ARKKQtrArAeVJNFSWEo2oUScL7/9GhORIGmeaJge7yRWrYEHjx8goSikDcx6UEkSLYWlZBNKxPny268xEQmS5omG6fFO8gcVi7lYJOZhn3uYbPZNnCWXo54J3JEgmZx+D7sHe8hm38RZcjnqmcAdCZLJ6fewe7CHbPZNnCWXo54J3JEgmUbcLmaGhrlYJOYhmkyQTTSZIJeEkiSXUCJONtFkglwSSpJcQok42USTCXJJKEmy2fTz/cjhKBeLxDx0lFSQTYfZRi6OQgtGlYZMVq2BG2qayKbDbCMXR6EFo0pDJqvWwA01TWTTYbaRi6PQglGlYa57v7KbjuFZ9PW1XCwS83CFtZotVQ3M1VZkZWudg1wK1Hlsa+7EqNKQZsnTs91xGRvKatlS1cBcbUVWttY5yKVAnce25k6MKg1pljw92x2XsaGsli1VDczVVmRla52DXArUeWxr7sSo0pCiDUXJLyhgyUPbEbLMxSKUc9yRIPsmhnFHgjgKLVxuriStb2aSA5OjaCSZyy2V1BoKSBsNzXJydpoKnYkGUzFp7kiQfRPDuCNBHIUWLjdXkuaLRejxuZGFoLXQik5WkZJQFP5hqIdXxt6lrcjKnfUrMKo0vB9fLEKPz40sBK2FVnSyipSEovAPQz28MvYubUVW7qxfgVGl4f34YhF6fG4qRjxU1S9G1ut4P9FxN5P/vo/ouBvTSgclGy5nvsTA7LSyrftX+GIR0jZYa7m3eQ3PnTnBE84u0mQh2Na8hitKa8jF6fewrftX+GIR0jZYa7m3eQ25JBSFbd2vcdQ7QZpVa+DhFVdiydNzvhKKwrbu1zjqnSDNqjXw8IorseTpWUiBE056b7mXmMdHmuUPPk7Dt+9lPmTp01fuGA7OMNdgwEuBOo8nnF0o/BcF6PK4uK5qCbKQyGZnzxsMB2eYazDgxW4qolqfTzb/fLafl0YHmCsQj+GNRlhrqeJ8/fPZfl4aHWCuQDyGNxphraWKhXTyL+4nNDjMXMH+QQyNdvSLqjhfUt/MJNk8N3yChKKQyR+PMhTwkUvfzCTZ9Hjd5NLjc5NN38wU89Hjc5NN38wUC2326AlAAAIQgAAEs2/3MB+SUaUhmwZTMbkUabTkYlRpyMaSpycXc56ebIwqNfNhztOTjVGlZqGpCowgAAEIQAACNFYL8yFtqVoCAhCAAAQUaPK4fXEbdlMRCEAAAhDQYbZhydOTy5aqJSAAAQhAQIEmj3WlVeRyVXkdGlkGAQhAAAKuq1rCfFxVXodGlkEAAhCAgOuqlrDQyv/oU2RSFxVgvmod8yH/7O++s0MlSQwGvMSVJEsLLGxvvowqfT6XmStxhQO4I0G0sooN1lruWdKBWpLIZWmBBZUkMRjwEleSLC2wsL35Mir1+eRSrNHhKLDg9HvxRMNY8vTcZl/OpvJFzEexRoejwILT78UTDWPJ03ObfTmbyhex0PLbmhEqNcFTgyixBPltzSz5279EV1vJfKhkIbipZik31Swlk05WYdUasGoNyELCqjWgkWRShoMz/ODdozj9Hix5em6sWUp7cTmyEJRpDVi1BgxxDVatgXx1HimhRJynh97h8PQYspBYZ6nihupmZCEo1mixag3441EseXqsWgNpe1xDPH/2JP54jKb8Em5Z1IolT897KdZosWoN+ONRLHl6rFoDaXtcQzx/9iS6s27+9PAE9V/YisZqJhEMMfzdn+B54whClin5xFoqb/sMQpYJDQ4z9HdPETj5LnlWM5W3f5aitasQskzVHZ+l6o7PkikRDDH83Z/geeMIQpYp+cRaKm/7DEKWCQ0OM/R3TxE4+S55VjOVt3+WorWrkHecQw7b39nLa64hvLEwnmiIbq+LqWiIRcYi7jryKk6/h0A8ykQkwB7XEE35Zro84zx08iBT0RCz8QiDAS+vTw6zsWwR3+zdx2uuIbyxMJ5oiG6vi6loiEXGIu468ipOv4dAPMpEJMAe1xBN+Wa6POM8dPIgU9EQs/EIgwEvr08Os7FsERpJJhtXOMBdR17F6fcQiEeZiATY4xqiKd9Ml2ech04eZCoa4s6v7CZ8wsnUnjco/dQnOPkXO3H/4lfEpr3Epjz43jpKdGIKQ8Mijl7/RQIn3yUxGyAy7sb90muYWhrRVdvIpe/Or+P+xa+ITXuJTXnwvXWU6MQUhoZFHL3+iwROvktiNkBk3I37pdeo/vwfoSKH/tlpujzjZHp5zElCUfDHo2R65nQPrnCATK5wgMcG3qbLM06ml8ecJBQFfzxKpmdO9+AKB8jkCgfY4xri2ooGsvnnkX788SiZnjndgyscIGX5ASdpkREXg996HO+BbjK5nn8VJZEkPusn09knnqVo7Sqy8ff24z3QTSbX86+iJJLEZ/1koyKHkdAsuXR5xsnGHQnijgTJpsszTi5dnnGycUeCuCNBshkPB8jFFfaTjTsSxB0JUnZ2mk3/dAgQpHkPdAOCbLwHugFBpohrilzCZ8YAQTbeA92AIBuJHJaYikEAAhCAAARoZJmPW2tBAAIQgAAE2E1F2E0ylJ31AAAQ7ElEQVT/f3twHxxnQSdw/Pt7nn1/y9u+JJtsXtsmoaFpS18Y0iKltaJgod5p6UXwhXdfrkjRgj29OowonOhwzM3d6CgqA+PLie8UHYoUBAuoJaQ0CW3YpmnT7G6STTbZTXY3zz7H3szexdw+OM3xR3Dy+ZSBAAIIIIDAFVVNIIAAAgggYFFVLg/UgwACCCCAQJO7jCZ3GQgggAACCCxzlWGkyVUGAggggAACTe4yrn9xiFu/+mts01nmCvzdeyhGsVrwX7WFYpzNjRhxrVxOMYrVgv+qLRhRMBC0u9lZ3cx8NzS001nXRsjhYS6XycKNDau5rWktFkVlrvbSAJ11beysbma+Gxra6axrI+TwMJfLZOHGhtXc1rQWi6IyV3tpgMv8dRj5QE0LIYeHuVwmC58IrmTH5dtRbBYQQACBkg2rCN2ym+B114AAAgggUHf7x6i5ZTf2xhAIIICAyeOk/jMfw4itNkjwumtAAAEEEKi7/WPU3LIbe2MIBBBAwORxkqceeBMG1pcHqba7OTM9SZXdxR0rNrIt0IBZUdhe2UhO14mmk2zyhth/QQdBu5tKm4uLK6qZmE2TzmlcG1rJnhUbUEVYXx4k5PBgUVRa3BV8vGE12wINmBWF7ZWNWBUVt9nChvJq7my+mKDdTaXNxcUV1ZgVFZ/NwZVVy/jU8vWoIuRpuk44OU4im6bUYiPPrChsr2wkp+tE00k2eUPsv6CDgLsEW3WA8ks3kh1PkJvJUHPDB2n64qcRVaVs0zrstUGmB4aw1VSx7MDt+N9/OYrZjP/qbZDTmRmKUrGtg+Z/uQtbbZC3UrZpHfbaINMDQ9hqqlh24Hb8778cxWzGf/U2FJsVU4mb8s3rWX7PZzC5XZh4Cz2JER4+1UVkJknet8OvUGlzEnJ4OHjuJD8920cmp/HbyBuoIuxZsYFMTuPhU128ODpE3g8HjxOwOdniryNvi7+OLf465rOrJjrr2iimyVXGJ5ZdxHw9iRG+3PM8kZkkeU2uMva3dhByeDh47iQ/PdtHJqfx28gbtP95gHfv+nty6QwDD32f+LMvkXf22z/GFgzgfe+7mHy1l4GHHiE9FCFv4MGHsVX7sTeEiPzkNww9+nNy6QzRnz+FqCpNX/wUoqoYmXy1l4GHHiE9FCFv4MGHsVX7sTeEUB12QrfsZj71wJsoYlqbZW/XU0TTKQrimRmOJWIEbC7u6/0Dmq5TcHIqjkkUnokO8EzsNAWZnMYLo2fY5A1RarHxdpnWZtnb9RTRdIqCeGaGY4kYAZuL+3r/gKbr5LW8OsjaB3+OmEyMPPksI08+S0Euk2Xs6SOUXrKW3jvuJTMcoyA7Eidx9DjWYIATn/8auqZRkOzpR0wmStZdSDFaapruj+4jMxyjIDsSJ3H0OJUfeh9GTBjomogQy6RA+Av9yTiPnO4G4f94bnSQyEwShL+gofP86BnqnaW8XbomIsQyKRD+Qn8yziOnu0H4b7d+5Qkqz8ZBhNFDL5A+GwER5tJzOcL3f4tMdBREmCvZF2bwPx4DEeYbPfQCoVt2U8zEy91koqMgwlzJvjCpkwM4ltVRjIIBTdcxMq3NUkwmp6HpOYrJ5DTeTpquY2Ram6Wg8mycglw6g67lKEZLTWNES01TTC6dwYiuaRjRZzWMKBho8/hwmcyADuiADugEbA6uDbUCOqADOqADOhvLg6wrqwJ0QAd0QAd0Li6v5u3U5vHhMpkBHdABHdAJ2BxcG2qldHSKuz77Y0AAAYTySzdQeslFgAACCCCAULfno5jcLkAAAQQQrMFKaj7+QUAAAQQQQCi/dANGPGtXYnK7AAEEEECwBitxLK/DiIKBErOVfS2X4DJZKPBZHexv2cRWfwM7q1uYa01pJdfXreJTy9bR5CqjQBXh5sa1tHq8vJ1KzFb2tVyCy2ShwGd1sL9lE1v9DfxT1I5tOktB6cZ2Qrd10vj5W3G2NFIgqkr9HR+n/F0bWH7vXkxuJwWWgJfm+z+L76otBDt3MFfpxnZCt3VixFzqYfm9ezG5nRRYAl6a7/8soqoYEf1NsXSK50ZOE0unaCvx0VERomAim+ZYIooqCu0lAeyqiTxN13n0dDdPDvezprSS25ouwmWykKfpOj2JEcay07S6vfisDgp6EiMcGTuLRVHpqKih3llKnqbrPBM7xcmpOJU2J1v9DbhMFvJi6RTPjZwmlk7RVuKjoyJEwUQ2zbFEFFUU2ksC2FUTBTOnzzF1/AS2UBWulcspSA9FCH/tO0wdP0n1R3ZStfsqCrLjCRJ/Po6oCiXrV6E6bOTpmsbgN39I5PHfUrqxnYZ9N2NyO/lrxg6/xMCD30N12Gn43I24V7XwVuTk5Ji+r/sQE9k0BVv99dzV0oERTdfZ132IrvEIBQGbk2+0b8dndWDkx2d6+OYbf6ZAFWFfSweXemvZ132IrvEIBQGbk2+0byeRTbOv+xAT2TQFW/313NXSwUIk+97gtZu/QHY8QYHvystYce9ejOiaxms3f4GJP3ZTYA36WfXd+7AEvBg5+72fcurr36FAVJUV996B94pLMaIquy4/MJhKMFc4OU6Tq4xaRwnF/Gyoj1+dO8Fcydks49kZNnlrKSaWTvGF155B53/pwNHxYUTg4HA/cyVns4xnZ/hd7BSDqQRzhZPjNLnKqHWUcL767vwq06fOMFfqxCmczY04Gmoo5txjv2T4P59kLm0ySXZsgoqtl1BMJjJCz6fvAV3nf+g6Ey92EezcgZhUilF6JkdAAAEEEEDgWCKGkWOJGAgggAACCPRMjWKkZ3IEDR0EEEAAgSktw6+GT4AAAggggEDP1Cg9kyMggAACCCBwLBFjIRKv9qEDOqADOqADiaPHMZI4ehwd0AEd0AEdSHT3YSTxah85TUMHdEAHdCA7mSR1cgAjistkoRifxYERr9VBMS7VgpFyix0jK1wVFONSLbhMForxWRwshMnjBAEEEEAAAWtlBUYslV4QQAABBBAwuV0YsXjLQAABBBBAAAGztwwjys5gC/OVmK1s9tZi5D2BRiyKynwfqG7GSKvbS5OzjPk2llfTWduGRVGZ7wPVzewMtjBfidnKZm8tCxHs3AEIIIAAgrm0hIptHRgJ7NiKYrUCAggggBDs3IER96pmnM1NgAACCCCUb16PNeDFiPqjr//bAZMohFPjzOo5Vnp87G/dRI3dg5Fyi522Eh/9U3Hi2Rl8Vgc3NazhisomjCgiXFJRQySdJJZOYlNNbPXXc8fyi/FbnbSV+OifihPPzuCzOripYQ1XVDax0uPDJArh1Dizeo6VHh/7WzdRY/ewEJ7VrShmE6kTA+jZWTyrW2m5707sddUYsXjL8KxpJdl3iuxoHGvAS8PtHyFwzbsxIopCxZaNpIeipIdjqDYrvisvY/k//yOK2YQRkypCpc1JwOrCacoQsDnxmKzkTWuzfP/0q/wxfg4VYbO3lmtDK1FFKDfbCdicTGkZfBYHAZuTgkPRMI+f7WNKy9DqruCG+jX4rA7sqpmAzUnA5kJFCFhdWBSVvHKznYDNyZSWwWdxELA5yVNF6Kxto7O2jfMxHT7DqQe/R/L1MJaAl9CNH6KsYy2iqoRu2kXopl2cD0tFGbYqH9rkFJaAF2swQEH0188w9OgvmJ1M4r6wmfo912MNeFEddqxBP9ZgAFFVbEE/itXMW1HX3foPBx44cYTRbIrJ2TTh1Di/Hxtku7+RL/Ue5ulYmPHsDPHsNK9MDDOamabRWconuw7Sn4yT1DJEM0kOxcK0ur0cnTjHAyeOMJpNMTmbJpwa5/djg2z3N/Kl3sM8HQsznp0hnp3mlYlhRjPTNDpL+WTXQfqTcZJahmgmyaFYmFa3l2q7m/M1MxSl68N7Sb5+itmpFOnhEWJPHMa9qhl7qIrzNTMUpevDe0m+forZqRTp4RFiTxzGvaqZiRe7OPGlh8iMxJlNTJE6OcDY00fw79hK796vEjt4mGx8guzoOBMvd5OJjlFx2QaMqOzaciClZZkrOZshnpnm+dFB5juZHGNqNkPP5AjzRdJJjoydIaVlmSs5myGemeb50UHmO5kcY2o2Q8/kCPNF0kmuCDRxvga/9SMmXu5mvvS5GIGrt3G+Br/1IyZe7ma+9LkYY4dfQktOM9fsZJLMSJzR3x1hvmTvG1RdeyWqzUoxSiydopijE8MYOToxTDGxTIpYOkUxRyeGMXJ0YphiYpkUC5EeilJMJjLCQqSHohSTiYyQjoxSzMRLXRiZGTyHEaXJWUYxVwSWUYxFUbnc10AxTc4ympxlFHNFYBnFWBSVy30NFNPkLGMhnM0NgAACCCCA4FzRyEI4mxsAAQQQQADBuaIRZ3MjIIAAAgggBK7ZDggggAACCIrFiqOpDiPKbY3rsCgqc7WXBOgMXcjOYAvz3VC/hs7QhYTsHuZymSzcWL+G2xrXYVFU5movCdAZupCdwRbmu6F+DZ2hCwnZPczlMlm4sX4NCxHs3IG9oQYEEEDA5HFSv+c6FiLYuQN7Qw0IIICAyeOkfs91NN55A4rVAgIIIFCyvo3QTR8k2Pl+EEAAAQTq91yH6rBhRPQ39Sfj/CbSz0gmRZvHz9VVzagi5B2KhvnBmdewqyauq13F+rIgedPaLI8OdvN0LMyakkqur11FwOYirz8Z5zeRfkYyKdo8fq6uakYVIe93sVO8OHYWi6Ky2VvL+rIgedPaLI8P9dCfjBOwOrmmqpmAzcVCaakZhh77Bcm+MNagn6pdV2IL+vlrdE0jdfI0oqo4ltVSoKVmGHrsFyT7wliDfqp2XYkt6Ccv2Rcm8sunyURG8Ky5gKpd70NUlbzoE4c5892foNrt1N6yi7JL1lKgpWZI9Q9gC1VhLvWQJ/qbMNAzOcKX+35PJD1FXpOzjP3NmwnZPTw+1Mu3B46SyWnkvTewjD1NG1FFeKea7H6dvrsfYGYoSp6zuYGWr+zFXl/NQkx2v07f3Q8wMxQlz9ncQMtX9mKvr2bosV9y6l8fIZfJkhe4ZhvLv/hJFAxMa7Pc0/sskfQUBf3JOF/ue46X40P8e/iPZHIaBQcjJ/nBmWO8U2mpGXo/dz8zQ1EKkn1heu9+gIXQUjP0fu5+ZoaiFCT7wvTe/QDxF47yxte+Qy6TpSDys6fIUzDQNREhlkkxX38yziODr1LMc6Oneaea+NMx0tFREEAAAQSSr4dJ9Z/mfE386Rjp6CgIIIAAAsnXw5z+5g9AAAEEEED4byYMaHoOI9PaLMVkchrvVLqmAUIx+qzG+dI1DRCK0VJpQChGwUCbx4/LZAZ0QAd0QCdgdXJtzQWADuiADuiAzsbyat6pPKtbMbmdzGcL+nEsq+V8eVa3YnI7mc8W9FPz0Z0YUTBQYrayb0UHLrMFBBDwWR3sb97MVl8jO4MtIIAAAmtKK7k+1M47lbnUw4p79mByOymwBipovvcORFU5X+ZSDyvu2YPJ7aTAGqig+d478L/vXQR3X8VcpRtWkSf6m3gLE9k0xyajqCK0eyqxqyYKhmYm6ZsapdrmZoWrgr8F2fEEiVd6EFWl5KI2VIeN/4/seILEKz2IqlJyURuqw0bBzOA5Jo/3Yw9V4bqgiTwTf0WJ2UpHeYhigjY3QZubvyXmUg8Vl23k7WIu9VBx2UaKsYWqsIWqmEthyaKisGRRUViyqCgsWVQUliwqCksWFYUli4rCkkVFYcmiorBkUVFYsqgoLFlUFJYsKgpLFhWFJYuKwpJFRWHJoqKwZFFRWLKoKCxZVBSWLCoKSxYVhSWLisKSRUVhyaLyXzz0VFwHq2HJAAAAAElFTkSuQmCC', + image = require('../images/IS-QR'), + options = { + startingX : 100, + startingY : 100, + aspectRatio : '1:2' + }; + +testModule('constrained-crop', options, benchmark, image); \ No newline at end of file