diff --git a/docs/kcl-std/functions/std-sketch-rectangle.md b/docs/kcl-std/functions/std-sketch-rectangle.md new file mode 100644 index 000000000..5654a837b --- /dev/null +++ b/docs/kcl-std/functions/std-sketch-rectangle.md @@ -0,0 +1,55 @@ +--- +title: "rectangle" +subtitle: "Function in std::sketch" +excerpt: "Sketch a rectangle." +layout: manual +--- + +Sketch a rectangle. + +```kcl +rectangle( + @sketchOrSurface: Sketch | Plane | Face, + width: number(Length), + height: number(Length), + center?: Point2d, + corner?: Point2d, +): Sketch +``` + + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `sketchOrSurface` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Sketch to extend, or plane or surface to sketch on. | Yes | +| `width` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Rectangle's width along X axis. | Yes | +| `height` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Rectangle's height along Y axis. | Yes | +| `center` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The center of the rectangle. Incompatible with `corner`. | No | +| `corner` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The corner of the rectangle. Incompatible with `center`. This will be the corner which is most negative on both X and Y axes. | No | + +### Returns + +[`Sketch`](/docs/kcl-std/types/std-types-Sketch) - A sketch is a collection of paths. + + +### Examples + +```kcl +exampleSketch = startSketchOn(-XZ) + |> rectangle(center = [0, 0], width = 10, height = 5) + +``` + +![Rendered example of rectangle 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABebUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqmf5pm/6pqdz1VVXXXXVVVdd9X+YJNk2DyBJts0DSJJt8wCSZNs8gCTZNg8gSbbNA0iSbfMAkmTbPIAk2TYPIEm2zQNIkm3zAJJk2wAf8iEf8hCuuuqqq64CoHLVVVddddVln/u5n/tbr/u6r/tgrrrqqquuuuqqq676X++bvumbnv4hH/IhD+Gqq6666ioqV1111VVXPct6vWZ7e5urrrrqqquuuuqqq/73GoaBq6666qqrnoXKVVddddVVV1111VVXXXXVVVf9H7K/v88//MM//DZXXXXVVVcBEFx11VVXXXXZ3//93//2wcEBV1111VVXXXXVVVf97zYMA/fdd9+tXHXVVVddBUBw1VVXXXXVZf/wD//wO3fffTdXXXXVVVddddVVV/3vNgwDZ8+efQZXXXXVVVcBULnqqquuuuqqq6666qqrrrrqqv9D9vf3+Yd/+Iff5qqrrrrqKgAqV1111VVXXXb27Nlbueqqq6666qqrrrrqf71hGLjqqquuuupZCK666qqrrrrsvvvuu/W+++67dRgGrrrqqquuuuqqq6763+2+++67lauuuuqqqwAIrrrqqquuepazZ8/eul6vueqqq6666qqrrrrqf6fz58/zW7/1W9/NVVddddVV9yO46qqrrrrqWe67775bDw4OuOqqq6666qqrrrrqqquuuuqq/yMIrrrqqquuepb77rvv1rvvvpurrrrqqquuuuqqq/53Ojg44B/+4R9+h6uuuuqqq+5H5aqrrrrqqmf5h3/4h9/hqquuuuqqq6666qqrrrrqqqv+76By1VVXXXXVs5w9e/ZWrrrqqquuuuqqq676X2t/f59/+Id/+G2uuuqqq666H5Wrrrrqqque5b777ruVq6666qqrrrrqqqv+1xqGgfvuu+9Wrrrqqquuuh/BVVddddVVz+Ef/uEffnt/f5+rrrrqqquuuuqqq/53OTg44B/+4R9+m6uuuuqqqx6IylVXXXXVVVddddVVV1111VVX/R+wXq+57777buWqq6666qoHIrjqqquuuuo5/P3f//1vP/nJT+aqq6666qqrrrrqqv9dhmHgvvvuu5WrrrrqqqseiMpVV1111VXP4R/+4R9+h6uuuuqqq6666qqr/tcZhoGzZ88+g6uuuuqqqx6IylVXXXXVVc/h7Nmzt3LVVVddddVVV1111f86+/v7/MM//MNvc9VVV1111QNRueqqq6666qqrrrrqqquuuuqq/wOGYeC+++67lauuuuqqqx6I4Kqrrrrqqudw33333XrffffdOgwDV1111VVXXXXVVVf97zAMA1ddddVVVz1fBFddddVVVz2Ps2fP3rper7nqqquuuuqqq6666n+H/f19fuu3fut7uOqqq6666rkRXHXVVVdd9Tz+/u///rcPDg646qqrrrrqqquuuuqqq6666qr/5Qiuuuqqq656HmfPnn3G3XffzVVXXXXVVVddddVV/zscHBzwD//wD7/NVVddddVVz43KVVddddVVz+O+++67lauuuuqqq6666qqr/tdYr9ecPXv2Vq666qqrrnpuVK666qqrrnoeZ8+evZWrrrrqqquuuuqqq/7XGIaB++6771auuuqqq656bgRXXXXVVVc9j/vuu+9WgGEYuOqqq6666qqrrrrqf75hGLjvvvtu5aqrrrrqqudGcNVVV1111fP1D//wD7+9Xq+56qqrrrrqqquuuup/tv39ff7hH/7ht7nqqquuuur5oXLVVVddddXzdd999906DANXXXXVVVddddVVV/3PNgwD9913361cddVVV131/BBcddVVV131fN133323PuMZz+Cqq6666qqrrrrqqv/ZDg4OuO+++27lqquuuuqq54fKVVddddVVz9c//MM//A5XXXXVVVddddVVV/2vcPbs2Wdw1VVXXXXV80Plqquuuuqq5+vs2bO3ctVVV1111VVXXXXV/3j7+/v8wz/8w29z1VVXXXXV80Plqquuuuqqq6666qqrrrrqqqv+FxuGgfvuu+9Wrrrqqquuen4Irrrqqquuer7uu+++W//hH/7ht/f397nqqquuuuqqq6666n+mYRi47777buWqq6666qoXhMpVV1111VVXXXXVVVddddVVV/0vtb+/zz/8wz/8NlddddVVV70gBFddddVVV71Af//3f//bBwcHXHXVVVddddVVV131P9MwDNx33323ctVVV1111QtCcNVVV1111Qv0D//wD79z9913c9VVV1111VVXXXXV/0zDMHD27NlncNVVV1111QtC5aqrrrrqqquuuuqqq6666qqr/pfa39/nH/7hH36bq6666qqrXhAqV1111VVXvUBnz569lauuuuqqq6666qqr/scahoGrrrrqqqteKIKrrrrqqqteoPvuu+/W++6779ZhGLjqqquuuuqqq6666n+m++6771auuuqqq656QQiuuuqqq656oc6ePXvrer3mqquuuuqqq6666qr/Wc6fP89v/dZvfTdXXXXVVVe9MARXXXXVVVe9UPfdd9+tBwcHXHXVVVddddVVV1111VVXXXXV/0IEV1111VVXvVD33XffrXfffTdXXXXVVVddddVVV/3PcnBwwD/8wz/8DlddddVVV70wVK666qqrrnqh/uEf/uF3uOqqq6666qqrrrrqqquuuuqq/52oXHXVVVdd9UKdPXv2Vq666qqrrrrqqquu+h9nf3+ff/iHf/htrrrqqquuemGoXHXVVVdd9ULdd999t3LVVVddddVVV1111f84wzBw33333cpVV1111VUvDMFVV1111VX/on/4h3/47f39fa666qqrrrrqqquu+p/h4OCAf/iHf/htrrrqqquu+pdQueqqq6666qqrrrrqqquuuuqq/2XW6zX33XffrVx11VVXXfUvIbjqqquuuupf9Pd///e//eQnP5mrrrrqqquuuuqqq/5nGIaB++6771auuuqqq676l1C56qqrrrrqX/QP//APv8NVV1111VVXXXXVVf9jDMPA2bNnn8FVV1111VX/EipXXXXVVVf9i86ePXsrV1111VVXXXXVVVf9j7G/v88//MM//DZXXXXVVVf9S6hcddVVV1111VVXXXXVVVddddX/MsMwcN99993KVVddddVV/xKCq6666qqr/kX33Xffrffdd9+twzBw1VVXXXXVVVddddV/r2EYuOqqq6666kVGcNVVV1111Yvk7Nmzt67Xa6666qqrrrrqqquu+u+1v7/Pb/3Wb30PV1111VVXvSgIrrrqqquuepH8/d///W8fHBxw1VVXXXXVVVddddVVV1111VX/ixBcddVVV131Ijl79uwz7r77bq666qqrrrrqqquu+u91cHDAP/zDP/w2V1111VVXvSioXHXVVVdd9SK57777buWqq6666qqrrrrqqv926/Was2fP3spVV1111VUvCipXXXXVVVe9SM6ePXsrV1111VVXXXXVVVf9txuGgfvuu+9WrrrqqquuelEQXHXVVVdd9SK57777bgUYhoGrrrrqqquuuuqqq/77DMPAfffddytXXXXVVVe9KAiuuuqqq656kf3DP/zDb6/Xa6666qqrrrrqqquu+u+xv7/PP/zDP/w2V1111VVXvaioXHXVVVdd9SK77777bh2Ggauuuuqqq6666qqr/nsMw8B99913K1ddddVVV72oCK666qqrrnqR3Xfffbc+4xnP4Kqrrrrqqquuuuqq/x4HBwfcd999t3LVVVddddWLispVV1111VUvsn/4h3/4Ha666qqrrrrqqquu+m919uzZZ3DVVVddddWLispVV1111VUvsrNnz97KVVddddVVV1111VX/bfb39/mHf/iH3+aqq6666qoXFZWrrrrqqquuuuqqq6666qqrrvpfYhgG7rvvvlu56qqrrrrqRUVw1VVXXXXVi+y+++679R/+4R9+e39/n6uuuuqqq6666qqr/msNw8B99913K1ddddVVV/1rULnqqquuuuqqq6666qqrrrrqqv8F9vf3+Yd/+Iff5qqrrrrqqn8Ngquuuuqqq/5V/v7v//63Dw4OuOqqq6666qqrrrrqv9YwDNx33323ctVVV1111b8GwVVXXXXVVf8q//AP//A7d999N1ddddVVV1111VVX/dcahoGzZ88+g6uuuuqqq/41qFx11VVXXXXVVVddddVVV1111f8C+/v7/MM//MNvc9VVV1111b8Glauuuuqqq/5Vzp49eytXXXXVVVddddVVV/2XG4aBq6666qqr/tUIrrrqqquu+le57777br3vvvtuHYaBq6666qqrrrrqqqv+a9133323ctVVV1111b8GwVVXXXXVVf9qZ8+evXW9XnPVVVddddVVV1111X+N8+fP81u/9VvfzVVXXXXVVf9aBFddddVVV/2r3XfffbceHBxw1VVXXXXVVVddddVVV1111VX/wxFcddVVV131r3bffffdevfdd3PVVVddddVVV1111X+Ng4MD/uEf/uF3uOqqq6666l+LylVXXXXVVf9q//AP//A7XHXVVVddddVVV1111VVXXXXV/3xUrrrqqquu+lc7e/bsrVx11VVXXXXVVVdd9V9mf3+ff/iHf/htrrrqqquu+teictVVV1111b/afffddytXXXXVVVddddVVV/2XGYaB++6771auuuqqq6761yK46qqrrrrq3+Qf/uEffnt/f5+rrrrqqquuuuqqq/5zHRwc8A//8A+/zVVXXXXVVf8WVK666qqrrrrqqquuuuqqq6666n+w9XrNfffddytXXXXVVVf9WxBcddVVV131b/L3f//3v/3kJz+Zq6666qqrrrrqqqv+cw3DwH333XcrV1111VVX/VtQueqqq6666t/kH/7hH36Hq6666qqrrrrqqqv+0w3DwNmzZ5/BVVddddVV/xZUrrrqqquu+jc5e/bsrVx11VVXXXXVVVdd9Z9uf3+ff/iHf/htrrrqqquu+regctVVV1111VVXXXXVVVddddVV/4MNw8B99913K1ddddVVV/1bEFx11VVXXfVvct99991633333ToMA1ddddVVV1111VVX/ecYhoGrrrrqqqv+XQiuuuqqq676Nzt79uyt6/Waq6666qqrrrrqqqv+c+zv7/Nbv/Vb38NVV1111VX/VgRXXXXVVVf9m/393//9bx8cHHDVVVddddVVV1111VVXXXXVVf9DEVx11VVXXfVvdvbs2WfcfffdXHXVVVddddVVV131n+Pg4IB/+Id/+G2uuuqqq676t6Jy1VVXXXXVv9l99913K1ddddVVV1111VVX/adZr9ecPXv2Vq666qqrrvq3onLVVVddddW/2dmzZ2/lqquuuuqqq6666qr/NMMwcN99993KVVddddVV/1YEV1111VVX/Zvdd999twIMw8BVV1111VVXXXXVVf/xhmHgvvvuu5Wrrrrqqqv+rQiuuuqqq676d/mHf/iH316v11x11VVXXXXVVVdd9R9rf3+ff/iHf/htrrrqqquu+vegctVVV1111b/Lfffdd+swDFx11VVXXXXVVVdd9R9rGAbuu+++W7nqqquuuurfg+Cqq6666qp/l/vuu+/WZzzjGVx11VVXXXXVVVdd9R/r4OCA++6771auuuqqq67696By1VVXXXXVv8s//MM//A5XXXXVVVddddVVV/2nOHv27DO46qqrrrrq34PKVVddddVV/y5nz569lauuuuqqq6666qqr/sPt7+/zD//wD7/NVVddddVV/x5Urrrqqquuuuqqq6666qqrrrrqf6BhGLjvvvtu5aqrrrrqqn8Pgquuuuqqq/5d7rvvvlv/4R/+4bf39/e56qqrrrrqqquuuuo/xjAM3Hfffbdy1VVXXXXVvxeVq6666qqrrrrqqquuuuqqq676H2Z/f59/+Id/+G2uuuqqq6769yK46qqrrrrq3+3v//7vf/vg4ICrrrrqqquuuuqqq/5jDMPAfffddytXXXXVVVf9exFcddVVV1317/YP//APv3P33Xdz1VVXXXXVVVddddV/jGEYOHv27DO46qqrrrrq34vKVVddddVVV1111VVXXXXVVVf9D7O/v88//MM//DZXXXXVVVf9e1G56qqrrrrq3+3s2bO3ctVVV1111VVXXXXVf5hhGLjqqquuuuo/BMFVV1111VX/bvfdd9+t9913363DMHDVVVddddVVV1111X+M++6771auuuqqq6769yK46qqrrrrqP8TZs2dvXa/XXHXVVVddddVVV13173P+/Hl+67d+67u56qqrrrrqPwLBVVddddVV/yHuu+++Ww8ODrjqqquuuuqqq6666qqrrrrqqv9BCK666qqrrvoPcd9999169913c9VVV1111VVXXXXVv8/BwQH/8A//8DtcddVVV131H4HKVVddddVV/yH+4R/+4Xe46qqrrrrqqquuuuqqq6666qr/WahcddVVV131H+Ls2bO3ctVVV1111VVXXXXVv9v+/j7/8A//8NtcddVVV131H4HKVVddddVV/yHuu+++W7nqqquuuuqqq6666t9tGAbuu+++W7nqqquuuuo/AsFVV1111VX/Yf7hH/7ht/f397nqqquuuuqqq6666t/m4OCAf/iHf/htrrrqqquu+o9C5aqrrrrqqquuuuqqq6666qqr/odYr9fcd999t3LVVVddddV/FIKrrrrqqqv+w/z93//9bz/5yU/mqquuuuqqq6666qp/m2EYuO+++27lqquuuuqq/yhUrrrqqquu+g/zD//wD7/DVVddddVVV1111VX/ZsMwcPbs2Wdw1VVXXXXVfxQqV1111VVX/Yc5e/bsrVx11VVXXXXVVVdd9W+2v7/PP/zDP/w2V1111VVX/UehctVVV1111VVXXXXVVVddddVV/0MMw8B99913K1ddddVVV/1HIbjqqquuuuo/zH333Xfrfffdd+swDFx11VVXXXXVVVdd9a8zDANXXXXVVVf9hyO46qqrrrrqP9TZs2dvXa/XXHXVVVddddVVV131r7O/v89v/dZvfQ9XXXXVVVf9RyK46qqrrrrqP9Tf//3f//bBwQFXXXXVVVddddVVV1111VVXXfU/AMFVV1111VX/oc6ePfuMu+++m6uuuuqqq6666qqr/nUODg74h3/4h9/mqquuuuqq/0hUrrrqqquu+g9133333cpVV1111VVXXXXVVf9q6/Was2fP3spVV1111VX/kahcddVVV131H+rs2bO3ctVVV1111VVXXXXVv9owDNx33323ctVVV1111X8kgquuuuqqq/5D3XfffbcCDMPAVVddddVVV1111VUvumEYuO+++27lqquuuuqq/0gEV1111VVX/Yf7h3/4h99er9dcddVVV1111VVXXfWi2d/f5x/+4R9+m6uuuuqqq/6jUbnqqquuuuo/3H333XfrMAxcddVVV1111VVXXfWiGYaB++6771auuuqqq676j0Zw1VVXXXXVf7j77rvv1mc84xlcddVVV1111VVXXfWiOTg44L777ruVq6666qqr/qNRueqqq6666j/cP/zDP/wOV1111VVXXXXVVVf9q5w9e/YZXHXVVVdd9R+NylVXXXXVVf/hzp49eytXXXXVVVddddVVV73I9vf3+Yd/+Iff5qqrrrrqqv9oVK666qqrrrrqqquuuuqqq6666r/ZMAzcd999t3LVVVddddV/NIKrrrrqqqv+w9133323/sM//MNv7+/vc9VVV1111VVXXXXVCzcMA/fdd9+tXHXVVVdd9Z+BylVXXXXVVVddddVVV1111VVX/Tfa39/nH/7hH36bq6666qqr/jMQXHXVVVdd9Z/i7//+73/74OCAq6666qqrrrrqqqteuGEYuO+++27lqquuuuqq/wwEV1111VVX/af4h3/4h9+5++67ueqqq6666qqrrrrqhRuGgbNnzz6Dq6666qqr/jNQueqqq6666qqrrrrqqquuuuqq/0b7+/v8wz/8w29z1VVXXXXVfwYqV1111VVX/ac4e/bsrVx11VVXXXXVVVdd9S8ahoGrrrrqqqv+0xBcddVVV131n+K+++679b777rt1GAauuuqqq6666qqrrnrh7rvvvlu56qqrrrrqPwPBVVddddVV/2nOnj1763q95qqrrrrqqquuuuqq5+/8+fP81m/91ndz1VVXXXXVfxaCq6666qqr/tPcd999tx4cHHDVVVddddVVV1111VVXXXXVVf9NCK666qqrrvpPc99999169913c9VVV1111VVXXXXV83dwcMA//MM//A5XXXXVVVf9Z6Fy1VVXXXXVf5p/+Id/+B2uuuqqq6666qqrrrrqqquuuuq/D5Wrrrrqqqv+05w9e/ZWrrrqqquuuuqqq656gfb39/mHf/iH3+aqq6666qr/LFSuuuqqq676T3PffffdylVXXXXVVVddddVVL9AwDNx33323ctVVV1111X8Wgquuuuqqq/5T/cM//MNv7+/vc9VVV1111VVXXXXVczo4OOAf/uEffpurrrrqqqv+M1G56qqrrrrqqquuuuqqq6666qr/Buv1mvvuu+9Wrrrqqquu+s9EcNVVV1111X+qv//7v//tJz/5yVx11VVXXXXVVVdd9ZyGYeC+++67lauuuuqqq/4zUbnqqquuuuo/1T/8wz/8DlddddVVV1111VVXPY9hGDh79uwzuOqqq6666j8Tlauuuuqqq/5TnT179lauuuqqq6666qqrrnoe+/v7/MM//MNvc9VVV1111X8mKlddddVVV1111VVXXXXVVVdd9d9gGAbuu+++W7nqqquuuuo/E8FVV1111VX/qe67775b77vvvlv39/e56qqrrrrqqquuuuqKYRi46qqrrrrqvwTBVVddddVV/+nOnj17K1ddddVVV1111VVXPcv+/j6/9Vu/9T1cddVVV131n43gqquuuuqq/3R///d//9sHBwdcddVVV1111VVXXXXVVVddddV/MYKrrrrqqqv+0509e/YZd999N1ddddVVV1111VVXXXFwcMA//MM//DZXXXXVVVf9Z6Ny1VVXXXXVf7r77rvvVq666qqrrrrqqquuepb9/X3Onj17K1ddddVVV/1no3LVVVddddV/urNnz97KVVddddVVV1111VXP4b777ruVq6666qqr/rMRXHXVVVdd9Z/uvvvuuxVgGAauuuqqq6666qqrroJhGLjvvvtu5aqrrrrqqv9sBFddddVVV/2X+Id/+IffXq/XXHXVVVddddVVV/1/t7+/zz/8wz/8NlddddVVV/1XoHLVVVddddV/ifvuu+/WYRi46qqrrrrqqquu+v9uGAbuu+++W7nqqquuuuq/AsFVV1111VX/Je67775bn/GMZ3DVVVddddVVV131/93BwQH33XffrVx11VVXXfVfgcpVV1111VX/Jf7hH/7hd7jqqquuuuqqq6666rKzZ88+g6uuuuqqq/4rULnqqquuuuq/xNmzZ2/lqquuuuqqq6666ir29/f5h3/4h9/mqquuuuqq/wpUrrrqqquuuuqqq6666qqrrrrqv9AwDNx33323ctVVV1111X8Fgquuuuqqq/5L3Hfffbf+wz/8w2/v7+9z1VVXXXXVVVdd9f/VMAzcd999t3LVVVddddV/FSpXXXXVVVddddVVV1111VVXXfVfZH9/n3/4h3/4ba666qqrrvqvQnDVVVddddV/mb//+7//7YODA6666qqrrrrqqqv+vxqGgfvuu+9Wrrrqqquu+q9CcNVVV1111X+Zf/iHf/idu+++m6uuuuqqq6666qr/r4Zh4OzZs8/gqquuuuqq/ypUrrrqqquuuuqqq6666qqrrrrqv8j+/j7/8A//8NtcddVVV131X4XKVVddddVV/2XOnj17K1ddddVVV1111VX/jw3DwFVXXXXVVf+lCK666qqrrvovc999991633333ToMA1ddddVVV1111VX/X9133323ctVVV1111X8Vgquuuuqqq/5LnT179tb1es1VV1111VVXXXXV/zfnz5/nt37rt76bq6666qqr/isRXHXVVVdd9V/qvvvuu/Xg4ICrrrrqqquuuuqqq6666qqrrvovQHDVVVddddV/qfvuu+/Wu+++m6uuuuqqq6666qr/bw4ODviHf/iH3+Gqq6666qr/SlSuuuqqq676L/UP//APv8NVV1111VVXXXXVVVddddVVV/3XoHLVVVddddV/qbNnz97KVVddddVVV1111f9D+/v7/MM//MNvc9VVV1111X8lKlddddVVV/2Xuu+++27lqquuuuqqq6666v+hYRi47777buWqq6666qr/SgRXXXXVVVf9l/uHf/iH397f3+eqq6666qqrrrrq/4uDgwP+4R/+4be56qqrrrrqvxqVq6666qqrrrrqqquuuuqqq676T7Zer7nvvvtu5aqrrrrqqv9qBFddddVVV/2X+/u///vffvKTn8xVV1111VVXXXXV/xfDMHDffffdylVXXXXVVf/VqFx11VVXXfVf7h/+4R9+h6uuuuqqq6666qr/R4Zh4OzZs8/gqquuuuqq/2pUrrrqqquu+i939uzZW7nqqquuuuqqq676f2R/f59/+Id/+G2uuuqqq676r0blqquuuuqqq6666qqrrrrqqqv+kw3DwH333XcrV1111VVX/VcjuOqqq6666r/cfffdd+t999136/7+PlddddVVV1111VX/1w3DwFVXXXXVVf9tCK666qqrrvpvcfbs2Vu56qqrrrrqqquu+n9gf3+f3/qt3/oerrrqqquu+u9AcNVVV1111X+Lv//7v//tg4MDrrrqqquuuuqqq6666qqrrrrqPxHBVVddddVV/y3Onj37jLvvvpurrrrqqquuuuqq/+sODg74h3/4h9/mqquuuuqq/w5Urrrqqquu+m9x33333cpVV1111VVXXXXV/wP7+/ucPXv2Vq666qqrrvrvQOWqq6666qr/FmfPnr2Vq6666qqrrrrqqv8n7rvvvlu56qqrrrrqvwPBVVddddVV/y3uu+++WwGGYeCqq6666qqrrrrq/7JhGLjvvvtu5aqrrrrqqv8OBFddddVVV/23+Yd/+IffXq/XXHXVVVddddVVV/1ftb+/zz/8wz/8NlddddVVV/13oXLVVVddddV/m/vuu+/WYRi46qqrrrrqqquu+r9qGAbuu+++W7nqqquuuuq/C8FVV1111VX/be67775bn/GMZ3DVVVddddVVV131f9XBwQH33XffrVx11VVXXfXfhcpVV1111VX/bf7hH/7hd7jqqquuuuqqq676P+7s2bPP4Kqrrrrqqv8uVK666qqrrvpvc/bs2Vu56qqrrrrqqquu+j9sf3+ff/iHf/htrrrqqquu+u9C5aqrrrrqqquuuuqqq6666qqr/pMMw8B99913K1ddddVVV/13Ibjqqquuuuq/zX333XfrP/zDP/z2/v4+V1111VVXXXXVVf/XDMPAfffddytXXXXVVVf9d6Jy1VVXXXXVVVddddVVV1111VX/Cfb39/mHf/iH3+aqq6666qr/TgRXXXXVVVf9t/r7v//73z44OOCqq6666qqrrrrq/5phGLjvvvtu5aqrrrrqqv9OBFddddVVV/23+od/+Iffufvuu7nqqquuuuqqq676v2YYBs6ePfsMrrrqqquu+u9E5aqrrrrqqquuuuqqq6666qqr/hPs7+/zD//wD7/NVVddddVV/52oXHXVVVdd9d/q7Nmzt3LVVVddddVVV131f9AwDFx11VVXXfXfjuCqq6666qr/Vvfdd9+t9913363DMHDVVVddddVVV131f8199913K1ddddVVV/13Irjqqquuuuq/3dmzZ29dr9dcddVVV1111VVX/V9x/vx5fuu3fuu7ueqqq6666r8bwVVXXXXVVf/t/v7v//63Dw4OuOqqq6666qqrrrrqqquuuuqq/2AEV1111VVX/Y9w9913c9VVV1111VVXXfV/xcHBAf/wD//wO1x11VVXXfXfjcpVV1111VX/7f7hH/7hd7jqqquuuuqqq6666qqrrrrqqv94VK666qqrrvpvd/bs2Vu56qqrrrrqqquu+j9kf3+ff/iHf/htrrrqqquu+u9G5aqrrrrqqv929913361cddVVV1111VVX/R8yDAP33XffrVx11VVXXfXfjeCqq6666qr/Ef7hH/7ht/f397nqqquuuuqqq6763+7g4IB/+Id/+G2uuuqqq676n4DKVVddddVVV1111VVXXXXVVVf9B1qv19x33323ctVVV1111f8EBFddddVVV/2P8Pd///e//eQnP5mrrrrqqquuuuqq/+2GYeC+++67lauuuuqqq/4noHLVVVddddX/CP/wD//wO1x11VVXXXXVVVf9HzAMA2fPnn0GV1111VVX/U9A5aqrrrrqqv8Rzp49eytXXXXVVVddddVV/wfs7+/zD//wD7/NVVddddVV/xNQueqqq6666qqrrrrqqquuuuqq/0DDMHDffffdylVXXXXVVf8TEFx11VVXXfU/wn333Xfrfffdd+v+/j5XXXXVVVddddVV/1sNw8BVV1111VX/oxBcddVVV131P8bZs2dv5aqrrrrqqquuuup/sf39fX7rt37re7jqqquuuup/CoKrrrrqqqv+x/j7v//73z44OOCqq6666qqrrrrqqquuuuqqq/6DEFx11VVXXfU/xtmzZ59x9913c9VVV1111VVXXfW/1cHBAf/wD//w21x11VVXXfU/BZWrrrrqqqv+x7jvvvtu5aqrrrrqqquuuup/sf39fc6ePXsrV1111VVX/U9B5aqrrrrqqv8xzp49eytXXXXVVVddddVV/8vdd999t3LVVVddddX/FARXXXXVVVf9j3HffffdCjAMA1ddddVVV1111VX/Gw3DwH333XcrV1111VVX/U9BcNVVV1111f8o//AP//Db6/Waq6666qqrrrrqqv9t9vf3+Yd/+Iff5qqrrrrqqv9JqFx11VVXXfU/yn333XfrMAxcddVVV1111VVX/W8zDAP33XffrVx11VVXXfU/CcFVV1111VX/o9x33323PuMZz+Cqq6666qqrrrrqf5uDgwP+4R/+4Xe46qqrrrrqfxIqV1111VVX/Y/yD//wD7/DVVddddVVV1111VVXXXXVVVf9x6By1VVXXXXV/yhnz569lauuuuqqq6666qr/hfb39/mHf/iH3+aqq6666qr/SahcddVVV1111VVXXXXVVVddddV/gGEYuO+++27lqquuuuqq/0kIrrrqqquu+h/lvvvuu/Uf/uEffnt/f5+rrrrqqquuuuqq/y2GYeC+++67lauuuuqqq/6noXLVVVddddVVV1111VVXXXXVVf9O+/v7/MM//MNvc9VVV1111f80BFddddVVV/2P8/d///e/fXBwwFVXXXXVVVddddX/FsMwcN99993KVVddddVV/9MQXHXVVVdd9T/OP/zDP/zO3XffzVVXXXXVVVddddX/FsMwcPbs2Wdw1VVXXXXV/zRUrrrqqquuuuqqq6666qqrrrrq32l/f59/+Id/+G2uuuqqq676n4bKVVddddVV/+OcPXv2Vq666qqrrrrqqqv+FxmGgauuuuqqq/5HIrjqqquuuup/nPvuu+/W++6779ZhGLjqqquuuuqqq6763+K+++67lauuuuqqq/6nIbjqqquuuup/pLNnz966Xq+56qqrrrrqqquu+p/u/Pnz/NZv/dZ3c9VVV1111f9EBFddddVVV/2P9Pd///e/fXBwwFVXXXXVVVddddVVV1111VVX/TsQXHXVVVdd9T/W3XffzVVXXXXVVVddddX/dAcHB/zDP/zD73DVVVddddX/RFSuuuqqq676H+kf/uEffoerrrrqqquuuuqqq6666qqrrvr3oXLVVVddddX/SGfPnr2Vq6666qqrrrrqqv8F9vf3+Yd/+Iff5qqrrrrqqv+JqFx11VVXXfU/0n333XcrV1111VVXXXXVVf8LDMPAfffddytXXXXVVVf9T0Rw1VVXXXXV/1j/8A//8Nv7+/tcddVVV1111VVX/U91cHDAP/zDP/w2V1111VVX/U9F5aqrrrrqqquuuuqqq6666qqr/o3W6zX33XffrVx11VVXXfU/FcFVV1111VX/Y/393//9bz/5yU/mqquuuuqqq6666n+qYRi47777buWqq6666qr/qahcddVVV131P9Y//MM//A5XXXXVVVddddVV/4MNw8DZs2efwVVXXXXVVf9TUbnqqquuuup/rLNnz97KVVddddVVV1111f9g+/v7/MM//MNvc9VVV1111f9UVK666qqrrrrqqquuuuqqq6666t9oGAbuu+++W7nqqquuuup/KoKrrrrqqqv+x7rvvvtuve+++27d39/nqquuuuqqq6666n+aYRi46qqrrrrqfzyCq6666qqr/kc7e/bsrVx11VVXXXXVVVf9D7S/v89v/dZvfQ9XXXXVVVf9T0Zw1VVXXXXV/2h///d//9sHBwdcddVVV1111VVXXXXVVVddddW/AcFVV1111VX/o509e/YZd999N1ddddVVV1111VX/0xwcHPAP//APv81VV1111VX/k1G56qqrrrrqf7T77rvvVq666qqrrrrqqqv+B9rf3+fs2bO3ctVVV1111f9kVK666qqrrvof7ezZs7dy1VVXXXXVVVdd9T/UfffddytXXXXVVVf9T0Zw1VVXXXXV/2j33XffrQDDMHDVVVddddVVV131P8kwDNx33323ctVVV1111f9kBFddddVVV/2P9w//8A+/vV6vueqqq6666qqrrvqfYn9/n3/4h3/4ba666qqrrvqfjspVV1111VX/49133323DsPAVVddddVVV1111f8UwzBw33333cpVV1111VX/0xFcddVVV131P95999136zOe8Qyuuuqqq6666qqr/qc4ODjgH/7hH36Hq6666qqr/qejctVVV1111f94//AP//A7XHXVVVddddVVV1111VVXXXXVvx6Vq6666qqr/sc7e/bsrVx11VVXXXXVVVf9D7K/v88//MM//DZXXXXVVVf9T0flqquuuuqqq6666qqrrrrqqqv+lYZh4L777ruVq6666qqr/qcjuOqqq6666n+8++6779Z/+Id/+O39/X2uuuqqq6666qqr/rsNw8B99913K1ddddVVV/1vQOWqq6666qqrrrrqqquuuuqqq/4V9vf3+Yd/+Iff5qqrrrrqqv8NCK666qqrrvpf4e///u9/++DggKuuuuqqq6666qr/bsMwcN99993KVVddddVV/xsQXHXVVVdd9b/CP/zDP/zO3XffzVVXXXXVVVddddV/t2EYOHv27DO46qqrrrrqfwMqV1111VVXXXXVVVddddVVV131r7C/v88//MM//DZXXXXVVVf9b0Dlqquuuuqq/xXOnj17K1ddddVVV1111VX/AwzDwFVXXXXVVf9rEFx11VVXXfW/wn333Xfrfffdd+swDFx11VVXXXXVVVf9d7vvvvtu5aqrrrrqqv8NCK666qqrrvpf4+zZs7eu12uuuuqqq6666qqr/rucP3+e3/qt3/purrrqqquu+t+C4Kqrrrrqqv81/v7v//63Dw4OuOqqq6666qqrrrrqqquuuuqqFxHBVVddddVV/6vcfffdXHXVVVddddVVV/13ecYznsE//MM//A5XXXXVVVf9b0Hlqquuuuqq/zV++7d/+3vOnj37jA//8A//Lq666qqrrrrqqqv+G/zIj/zIZ//Wb/3Wd3PVVVddddX/FuhBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V/GPl+emO0MXBNcAAAAASUVORK5CYII=) + +```kcl +exampleSketch = startSketchOn(-XZ) + |> rectangle(corner = [0, 0], width = 10, height = 5) + +``` + +![Rendered example of rectangle 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABebUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqmf5pm/6pqdz1VVXXXXVVVdd9X+YJNk2DyBJts0DSJJt8wCSZNs8gCTZNg8gSbbNA0iSbfMAkmTbPIAk2TYPIEm2zQNIkm3zAJJk2wAf8iEf8hCuuuqqq64CoHLVVVddddVln/u5n/tbr/u6r/tgrrrqqquuuuqqq676X++bvumbnv4hH/IhD+Gqq6666ioqV1111VVXPct6vWZ7e5urrrrqqquuuuqqq/73GoaBq6666qqrnoXKVVddddVVV1111VVXXXXVVVf9H7K/v88//MM//DZXXXXVVVcBEFx11VVXXXXZ3//93//2wcEBV1111VVXXXXVVVf97zYMA/fdd9+tXHXVVVddBUBw1VVXXXXVZf/wD//wO3fffTdXXXXVVVddddVVV/3vNgwDZ8+efQZXXXXVVVcBULnqqquuuuqqq6666qqrrrrqqv9D9vf3+Yd/+Iff5qqrrrrqKgAqV1111VVXXXb27Nlbueqqq6666qqrrrrqf71hGLjqqquuuupZCK666qqrrrrsvvvuu/W+++67dRgGrrrqqquuuuqqq6763+2+++67lauuuuqqqwAIrrrqqquuepazZ8/eul6vueqqq6666qqrrrrqf6fz58/zW7/1W9/NVVddddVV9yO46qqrrrrqWe67775bDw4OuOqqq6666qqrrrrqqquuuuqq/yMIrrrqqquuepb77rvv1rvvvpurrrrqqquuuuqqq/53Ojg44B/+4R9+h6uuuuqqq+5H5aqrrrrqqmf5h3/4h9/hqquuuuqqq6666qqrrrrqqqv+76By1VVXXXXVs5w9e/ZWrrrqqquuuuqqq676X2t/f59/+Id/+G2uuuqqq666H5Wrrrrqqque5b777ruVq6666qqrrrrqqqv+1xqGgfvuu+9Wrrrqqquuuh/BVVddddVVz+Ef/uEffnt/f5+rrrrqqquuuuqqq/53OTg44B/+4R9+m6uuuuqqqx6IylVXXXXVVVddddVVV1111VVX/R+wXq+57777buWqq6666qoHIrjqqquuuuo5/P3f//1vP/nJT+aqq6666qqrrrrqqv9dhmHgvvvuu5WrrrrqqqseiMpVV1111VXP4R/+4R9+h6uuuuqqq6666qqr/tcZhoGzZ88+g6uuuuqqqx6IylVXXXXVVc/h7Nmzt3LVVVddddVVV1111f86+/v7/MM//MNvc9VVV1111QNRueqqq6666qqrrrrqqquuuuqq/wOGYeC+++67lauuuuqqqx6I4Kqrrrrqqudw33333XrffffdOgwDV1111VVXXXXVVVf97zAMA1ddddVVVz1fBFddddVVVz2Ps2fP3rper7nqqquuuuqqq6666n+H/f19fuu3fut7uOqqq6666rkRXHXVVVdd9Tz+/u///rcPDg646qqrrrrqqquuuuqqq6666qr/5Qiuuuqqq656HmfPnn3G3XffzVVXXXXVVVddddVV/zscHBzwD//wD7/NVVddddVVz43KVVddddVVz+O+++67lauuuuqqq6666qqr/tdYr9ecPXv2Vq666qqrrnpuVK666qqrrnoeZ8+evZWrrrrqqquuuuqqq/7XGIaB++6771auuuqqq656bgRXXXXVVVc9j/vuu+9WgGEYuOqqq6666qqrrrrqf75hGLjvvvtu5aqrrrrqqudGcNVVV1111fP1D//wD7+9Xq+56qqrrrrqqquuuup/tv39ff7hH/7ht7nqqquuuur5oXLVVVddddXzdd999906DANXXXXVVVddddVVV/3PNgwD9913361cddVVV131/BBcddVVV131fN133323PuMZz+Cqq6666qqrrrrqqv/ZDg4OuO+++27lqquuuuqq54fKVVddddVVz9c//MM//A5XXXXVVVddddVVV/2vcPbs2Wdw1VVXXXXV80Plqquuuuqq5+vs2bO3ctVVV1111VVXXXXV/3j7+/v8wz/8w29z1VVXXXXV80Plqquuuuqqq6666qqrrrrqqqv+FxuGgfvuu+9Wrrrqqquuen4Irrrqqquuer7uu+++W//hH/7ht/f397nqqquuuuqqq6666n+mYRi47777buWqq6666qoXhMpVV1111VVXXXXVVVddddVVV/0vtb+/zz/8wz/8NlddddVVV70gBFddddVVV71Af//3f//bBwcHXHXVVVddddVVV131P9MwDNx33323ctVVV1111QtCcNVVV1111Qv0D//wD79z9913c9VVV1111VVXXXXV/0zDMHD27NlncNVVV1111QtC5aqrrrrqqquuuuqqq6666qqr/pfa39/nH/7hH36bq6666qqrXhAqV1111VVXvUBnz569lauuuuqqq6666qqr/scahoGrrrrqqqteKIKrrrrqqqteoPvuu+/W++6779ZhGLjqqquuuuqqq6666n+m++6771auuuqqq656QQiuuuqqq656oc6ePXvrer3mqquuuuqqq6666qr/Wc6fP89v/dZvfTdXXXXVVVe9MARXXXXVVVe9UPfdd9+tBwcHXHXVVVddddVVV1111VVXXXXV/0IEV1111VVXvVD33XffrXfffTdXXXXVVVddddVVV/3PcnBwwD/8wz/8DlddddVVV70wVK666qqrrnqh/uEf/uF3uOqqq6666qqrrrrqqquuuuqq/52oXHXVVVdd9UKdPXv2Vq666qqrrrrqqquu+h9nf3+ff/iHf/htrrrqqquuemGoXHXVVVdd9ULdd999t3LVVVddddVVV1111f84wzBw33333cpVV1111VUvDMFVV1111VX/on/4h3/47f39fa666qqrrrrqqquu+p/h4OCAf/iHf/htrrrqqquu+pdQueqqq6666qqrrrrqqquuuuqq/2XW6zX33XffrVx11VVXXfUvIbjqqquuuupf9Pd///e//eQnP5mrrrrqqquuuuqqq/5nGIaB++6771auuuqqq676l1C56qqrrrrqX/QP//APv8NVV1111VVXXXXVVf9jDMPA2bNnn8FVV1111VX/EipXXXXVVVf9i86ePXsrV1111VVXXXXVVVf9j7G/v88//MM//DZXXXXVVVf9S6hcddVVV1111VVXXXXVVVddddX/MsMwcN99993KVVddddVV/xKCq6666qqr/kX33Xffrffdd9+twzBw1VVXXXXVVVddddV/r2EYuOqqq6666kVGcNVVV1111Yvk7Nmzt67Xa6666qqrrrrqqquu+u+1v7/Pb/3Wb30PV1111VVXvSgIrrrqqquuepH8/d///W8fHBxw1VVXXXXVVVddddVVV1111VX/ixBcddVVV131Ijl79uwz7r77bq666qqrrrrqqquu+u91cHDAP/zDP/w2V1111VVXvSioXHXVVVdd9SK57777buWqq6666qqrrrrqqv926/Was2fP3spVV1111VUvCipXXXXVVVe9SM6ePXsrV1111VVXXXXVVVf9txuGgfvuu+9WrrrqqquuelEQXHXVVVdd9SK57777bgUYhoGrrrrqqquuuuqqq/77DMPAfffddytXXXXVVVe9KAiuuuqqq656kf3DP/zDb6/Xa6666qqrrrrqqquu+u+xv7/PP/zDP/w2V1111VVXvaioXHXVVVdd9SK77777bh2Ggauuuuqqq6666qqr/nsMw8B99913K1ddddVVV72oCK666qqrrnqR3Xfffbc+4xnP4Kqrrrrqqquuuuqq/x4HBwfcd999t3LVVVddddWLispVV1111VUvsn/4h3/4Ha666qqrrrrqqquu+m919uzZZ3DVVVddddWLispVV1111VUvsrNnz97KVVddddVVV1111VX/bfb39/mHf/iH3+aqq6666qoXFZWrrrrqqquuuuqqq6666qqrrvpfYhgG7rvvvlu56qqrrrrqRUVw1VVXXXXVi+y+++679R/+4R9+e39/n6uuuuqqq6666qqr/msNw8B99913K1ddddVVV/1rULnqqquuuuqqq6666qqrrrrqqv8F9vf3+Yd/+Iff5qqrrrrqqn8Ngquuuuqqq/5V/v7v//63Dw4OuOqqq6666qqrrrrqv9YwDNx33323ctVVV1111b8GwVVXXXXVVf8q//AP//A7d999N1ddddVVV1111VVX/dcahoGzZ88+g6uuuuqqq/41qFx11VVXXXXVVVddddVVV1111f8C+/v7/MM//MNvc9VVV1111b8Glauuuuqqq/5Vzp49eytXXXXVVVddddVVV/2XG4aBq6666qqr/tUIrrrqqquu+le57777br3vvvtuHYaBq6666qqrrrrqqqv+a9133323ctVVV1111b8GwVVXXXXVVf9qZ8+evXW9XnPVVVddddVVV1111X+N8+fP81u/9VvfzVVXXXXVVf9aBFddddVVV/2r3XfffbceHBxw1VVXXXXVVVddddVVV1111VX/wxFcddVVV131r3bffffdevfdd3PVVVddddVVV1111X+Ng4MD/uEf/uF3uOqqq6666l+LylVXXXXVVf9q//AP//A7XHXVVVddddVVV1111VVXXXXV/3xUrrrqqquu+lc7e/bsrVx11VVXXXXVVVdd9V9mf3+ff/iHf/htrrrqqquu+teictVVV1111b/afffddytXXXXVVVddddVVV/2XGYaB++6771auuuqqq6761yK46qqrrrrq3+Qf/uEffnt/f5+rrrrqqquuuuqqq/5zHRwc8A//8A+/zVVXXXXVVf8WVK666qqrrrrqqquuuuqqq6666n+w9XrNfffddytXXXXVVVf9WxBcddVVV131b/L3f//3v/3kJz+Zq6666qqrrrrqqqv+cw3DwH333XcrV1111VVX/VtQueqqq6666t/kH/7hH36Hq6666qqrrrrqqqv+0w3DwNmzZ5/BVVddddVV/xZUrrrqqquu+jc5e/bsrVx11VVXXXXVVVdd9Z9uf3+ff/iHf/htrrrqqquu+regctVVV1111VVXXXXVVVddddVV/4MNw8B99913K1ddddVVV/1bEFx11VVXXfVvct99991633333ToMA1ddddVVV1111VVX/ecYhoGrrrrqqqv+XQiuuuqqq676Nzt79uyt6/Waq6666qqrrrrqqqv+c+zv7/Nbv/Vb38NVV1111VX/VgRXXXXVVVf9m/393//9bx8cHHDVVVddddVVV1111VVXXXXVVf9DEVx11VVXXfVvdvbs2WfcfffdXHXVVVddddVVV131n+Pg4IB/+Id/+G2uuuqqq676t6Jy1VVXXXXVv9l99913K1ddddVVV1111VVX/adZr9ecPXv2Vq666qqrrvq3onLVVVddddW/2dmzZ2/lqquuuuqqq6666qr/NMMwcN99993KVVddddVV/1YEV1111VVX/Zvdd999twIMw8BVV1111VVXXXXVVf/xhmHgvvvuu5Wrrrrqqqv+rQiuuuqqq676d/mHf/iH316v11x11VVXXXXVVVdd9R9rf3+ff/iHf/htrrrqqquu+vegctVVV1111b/Lfffdd+swDFx11VVXXXXVVVdd9R9rGAbuu+++W7nqqquuuurfg+Cqq6666qp/l/vuu+/WZzzjGVx11VVXXXXVVVdd9R/r4OCA++6771auuuqqq67696By1VVXXXXVv8s//MM//A5XXXXVVVddddVVV/2nOHv27DO46qqrrrrq34PKVVddddVV/y5nz569lauuuuqqq6666qqr/sPt7+/zD//wD7/NVVddddVV/x5Urrrqqquuuuqqq6666qqrrrrqf6BhGLjvvvtu5aqrrrrqqn8Pgquuuuqqq/5d7rvvvlv/4R/+4bf39/e56qqrrrrqqquuuuo/xjAM3Hfffbdy1VVXXXXVvxeVq6666qqrrrrqqquuuuqqq676H2Z/f59/+Id/+G2uuuqqq6769yK46qqrrrrq3+3v//7vf/vg4ICrrrrqqquuuuqqq/5jDMPAfffddytXXXXVVVf9exFcddVVV1317/YP//APv3P33Xdz1VVXXXXVVVddddV/jGEYOHv27DO46qqrrrrq34vKVVddddVVV1111VVXXXXVVVf9D7O/v88//MM//DZXXXXVVVf9e1G56qqrrrrq3+3s2bO3ctVVV1111VVXXXXVf5hhGLjqqquuuuo/BMFVV1111VX/bvfdd9+t9913363DMHDVVVddddVVV1111X+M++6771auuuqqq6769yK46qqrrrrqP8TZs2dvXa/XXHXVVVddddVVV13173P+/Hl+67d+67u56qqrrrrqPwLBVVddddVV/yHuu+++Ww8ODrjqqquuuuqqq6666qqrrrrqqv9BCK666qqrrvoPcd9999169913c9VVV1111VVXXXXVv8/BwQH/8A//8DtcddVVV131H4HKVVddddVV/yH+4R/+4Xe46qqrrrrqqquuuuqqq6666qr/WahcddVVV131H+Ls2bO3ctVVV1111VVXXXXVv9v+/j7/8A//8NtcddVVV131H4HKVVddddVV/yHuu+++W7nqqquuuuqqq6666t9tGAbuu+++W7nqqquuuuo/AsFVV1111VX/Yf7hH/7ht/f397nqqquuuuqqq6666t/m4OCAf/iHf/htrrrqqquu+o9C5aqrrrrqqquuuuqqq6666qqr/odYr9fcd999t3LVVVddddV/FIKrrrrqqqv+w/z93//9bz/5yU/mqquuuuqqq6666qp/m2EYuO+++27lqquuuuqq/yhUrrrqqquu+g/zD//wD7/DVVddddVVV1111VX/ZsMwcPbs2Wdw1VVXXXXVfxQqV1111VVX/Yc5e/bsrVx11VVXXXXVVVdd9W+2v7/PP/zDP/w2V1111VVX/UehctVVV1111VVXXXXVVVddddVV/0MMw8B99913K1ddddVVV/1HIbjqqquuuuo/zH333Xfrfffdd+swDFx11VVXXXXVVVdd9a8zDANXXXXVVVf9hyO46qqrrrrqP9TZs2dvXa/XXHXVVVddddVVV131r7O/v89v/dZvfQ9XXXXVVVf9RyK46qqrrrrqP9Tf//3f//bBwQFXXXXVVVddddVVV1111VVXXfU/AMFVV1111VX/oc6ePfuMu+++m6uuuuqqq6666qqr/nUODg74h3/4h9/mqquuuuqq/0hUrrrqqquu+g9133333cpVV1111VVXXXXVVf9q6/Was2fP3spVV1111VX/kahcddVVV131H+rs2bO3ctVVV1111VVXXXXVv9owDNx33323ctVVV1111X8kgquuuuqqq/5D3XfffbcCDMPAVVddddVVV1111VUvumEYuO+++27lqquuuuqq/0gEV1111VVX/Yf7h3/4h99er9dcddVVV1111VVXXfWi2d/f5x/+4R9+m6uuuuqqq/6jUbnqqquuuuo/3H333XfrMAxcddVVV1111VVXXfWiGYaB++6771auuuqqq676j0Zw1VVXXXXVf7j77rvv1mc84xlcddVVV1111VVXXfWiOTg44L777ruVq6666qqr/qNRueqqq6666j/cP/zDP/wOV1111VVXXXXVVVf9q5w9e/YZXHXVVVdd9R+NylVXXXXVVf/hzp49eytXXXXVVVddddVVV73I9vf3+Yd/+Iff5qqrrrrqqv9oVK666qqrrrrqqquuuuqqq6666r/ZMAzcd999t3LVVVddddV/NIKrrrrqqqv+w9133323/sM//MNv7+/vc9VVV1111VVXXXXVCzcMA/fdd9+tXHXVVVdd9Z+BylVXXXXVVVddddVVV1111VVX/Tfa39/nH/7hH36bq6666qqr/jMQXHXVVVdd9Z/i7//+73/74OCAq6666qqrrrrqqqteuGEYuO+++27lqquuuuqq/wwEV1111VVX/af4h3/4h9+5++67ueqqq6666qqrrrrqhRuGgbNnzz6Dq6666qqr/jNQueqqq6666qqrrrrqqquuuuqq/0b7+/v8wz/8w29z1VVXXXXVfwYqV1111VVX/ac4e/bsrVx11VVXXXXVVVdd9S8ahoGrrrrqqqv+0xBcddVVV131n+K+++679b777rt1GAauuuqqq6666qqrrnrh7rvvvlu56qqrrrrqPwPBVVddddVV/2nOnj1763q95qqrrrrqqquuuuqq5+/8+fP81m/91ndz1VVXXXXVfxaCq6666qqr/tPcd999tx4cHHDVVVddddVVV1111VVXXXXVVf9NCK666qqrrvpPc99999169913c9VVV1111VVXXXXV83dwcMA//MM//A5XXXXVVVf9Z6Fy1VVXXXXVf5p/+Id/+B2uuuqqq6666qqrrrrqqquuuuq/D5Wrrrrqqqv+05w9e/ZWrrrqqquuuuqqq656gfb39/mHf/iH3+aqq6666qr/LFSuuuqqq676T3PffffdylVXXXXVVVddddVVL9AwDNx33323ctVVV1111X8Wgquuuuqqq/5T/cM//MNv7+/vc9VVV1111VVXXXXVczo4OOAf/uEffpurrrrqqqv+M1G56qqrrrrqqquuuuqqq6666qr/Buv1mvvuu+9Wrrrqqquu+s9EcNVVV1111X+qv//7v//tJz/5yVx11VVXXXXVVVdd9ZyGYeC+++67lauuuuqqq/4zUbnqqquuuuo/1T/8wz/8DlddddVVV1111VVXPY9hGDh79uwzuOqqq6666j8Tlauuuuqqq/5TnT179lauuuqqq6666qqrrnoe+/v7/MM//MNvc9VVV1111X8mKlddddVVV1111VVXXXXVVVdd9d9gGAbuu+++W7nqqquuuuo/E8FVV1111VX/qe67775b77vvvlv39/e56qqrrrrqqquuuuqKYRi46qqrrrrqvwTBVVddddVV/+nOnj17K1ddddVVV1111VVXPcv+/j6/9Vu/9T1cddVVV131n43gqquuuuqq/3R///d//9sHBwdcddVVV1111VVXXXXVVVddddV/MYKrrrrqqqv+0509e/YZd999N1ddddVVV1111VVXXXFwcMA//MM//DZXXXXVVVf9Z6Ny1VVXXXXVf7r77rvvVq666qqrrrrqqquuepb9/X3Onj17K1ddddVVV/1no3LVVVddddV/urNnz97KVVddddVVV1111VXP4b777ruVq6666qqr/rMRXHXVVVdd9Z/uvvvuuxVgGAauuuqqq6666qqrroJhGLjvvvtu5aqrrrrqqv9sBFddddVVV/2X+Id/+IffXq/XXHXVVVddddVVV/1/t7+/zz/8wz/8NlddddVVV/1XoHLVVVddddV/ifvuu+/WYRi46qqrrrrqqquu+v9uGAbuu+++W7nqqquuuuq/AsFVV1111VX/Je67775bn/GMZ3DVVVddddVVV131/93BwQH33XffrVx11VVXXfVfgcpVV1111VX/Jf7hH/7hd7jqqquuuuqqq6666rKzZ88+g6uuuuqqq/4rULnqqquuuuq/xNmzZ2/lqquuuuqqq6666ir29/f5h3/4h9/mqquuuuqq/wpUrrrqqquuuuqqq6666qqrrrrqv9AwDNx33323ctVVV1111X8Fgquuuuqqq/5L3Hfffbf+wz/8w2/v7+9z1VVXXXXVVVdd9f/VMAzcd999t3LVVVddddV/FSpXXXXVVVddddVVV1111VVXXfVfZH9/n3/4h3/4ba666qqrrvqvQnDVVVddddV/mb//+7//7YODA6666qqrrrrqqqv+vxqGgfvuu+9Wrrrqqquu+q9CcNVVV1111X+Zf/iHf/idu+++m6uuuuqqq6666qr/r4Zh4OzZs8/gqquuuuqq/ypUrrrqqquuuuqqq6666qqrrrrqv8j+/j7/8A//8NtcddVVV131X4XKVVddddVV/2XOnj17K1ddddVVV1111VX/jw3DwFVXXXXVVf+lCK666qqrrvovc999991633333ToMA1ddddVVV1111VX/X9133323ctVVV1111X8Vgquuuuqqq/5LnT179tb1es1VV1111VVXXXXV/zfnz5/nt37rt76bq6666qqr/isRXHXVVVdd9V/qvvvuu/Xg4ICrrrrqqquuuuqqq6666qqrrvovQHDVVVddddV/qfvuu+/Wu+++m6uuuuqqq6666qr/bw4ODviHf/iH3+Gqq6666qr/SlSuuuqqq676L/UP//APv8NVV1111VVXXXXVVVddddVVV/3XoHLVVVddddV/qbNnz97KVVddddVVV1111f9D+/v7/MM//MNvc9VVV1111X8lKlddddVVV/2Xuu+++27lqquuuuqqq6666v+hYRi47777buWqq6666qr/SgRXXXXVVVf9l/uHf/iH397f3+eqq6666qqrrrrq/4uDgwP+4R/+4be56qqrrrrqvxqVq6666qqrrrrqqquuuuqqq676T7Zer7nvvvtu5aqrrrrqqv9qBFddddVVV/2X+/u///vffvKTn8xVV1111VVXXXXV/xfDMHDffffdylVXXXXVVf/VqFx11VVXXfVf7h/+4R9+h6uuuuqqq6666qr/R4Zh4OzZs8/gqquuuuqq/2pUrrrqqquu+i939uzZW7nqqquuuuqqq676f2R/f59/+Id/+G2uuuqqq676r0blqquuuuqqq6666qqrrrrqqqv+kw3DwH333XcrV1111VVX/VcjuOqqq6666r/cfffdd+t999136/7+PlddddVVV1111VX/1w3DwFVXXXXVVf9tCK666qqrrvpvcfbs2Vu56qqrrrrqqquu+n9gf3+f3/qt3/oerrrqqquu+u9AcNVVV1111X+Lv//7v//tg4MDrrrqqquuuuqqq6666qqrrrrqPxHBVVddddVV/y3Onj37jLvvvpurrrrqqquuuuqq/+sODg74h3/4h9/mqquuuuqq/w5Urrrqqquu+m9x33333cpVV1111VVXXXXV/wP7+/ucPXv2Vq666qqrrvrvQOWqq6666qr/FmfPnr2Vq6666qqrrrrqqv8n7rvvvlu56qqrrrrqvwPBVVddddVV/y3uu+++WwGGYeCqq6666qqrrrrq/7JhGLjvvvtu5aqrrrrqqv8OBFddddVVV/23+Yd/+IffXq/XXHXVVVddddVVV/1ftb+/zz/8wz/8NlddddVVV/13oXLVVVddddV/m/vuu+/WYRi46qqrrrrqqquu+r9qGAbuu+++W7nqqquuuuq/C8FVV1111VX/be67775bn/GMZ3DVVVddddVVV131f9XBwQH33XffrVx11VVXXfXfhcpVV1111VX/bf7hH/7hd7jqqquuuuqqq676P+7s2bPP4Kqrrrrqqv8uVK666qqrrvpvc/bs2Vu56qqrrrrqqquu+j9sf3+ff/iHf/htrrrqqquu+u9C5aqrrrrqqquuuuqqq6666qqr/pMMw8B99913K1ddddVVV/13Ibjqqquuuuq/zX333XfrP/zDP/z2/v4+V1111VVXXXXVVf/XDMPAfffddytXXXXVVVf9d6Jy1VVXXXXVVVddddVVV1111VX/Cfb39/mHf/iH3+aqq6666qr/TgRXXXXVVVf9t/r7v//73z44OOCqq6666qqrrrrq/5phGLjvvvtu5aqrrrrqqv9OBFddddVVV/23+od/+Iffufvuu7nqqquuuuqqq676v2YYBs6ePfsMrrrqqquu+u9E5aqrrrrqqquuuuqqq6666qqr/hPs7+/zD//wD7/NVVddddVV/52oXHXVVVdd9d/q7Nmzt3LVVVddddVVV131f9AwDFx11VVXXfXfjuCqq6666qr/Vvfdd9+t9913363DMHDVVVddddVVV131f8199913K1ddddVVV/13Irjqqquuuuq/3dmzZ29dr9dcddVVV1111VVX/V9x/vx5fuu3fuu7ueqqq6666r8bwVVXXXXVVf/t/v7v//63Dw4OuOqqq6666qqrrrrqqquuuuqq/2AEV1111VVX/Y9w9913c9VVV1111VVXXfV/xcHBAf/wD//wO1x11VVXXfXfjcpVV1111VX/7f7hH/7hd7jqqquuuuqqq6666qqrrrrqqv94VK666qqrrvpvd/bs2Vu56qqrrrrqqquu+j9kf3+ff/iHf/htrrrqqquu+u9G5aqrrrrqqv929913361cddVVV1111VVX/R8yDAP33XffrVx11VVXXfXfjeCqq6666qr/Ef7hH/7ht/f397nqqquuuuqqq6763+7g4IB/+Id/+G2uuuqqq676n4DKVVddddVVV1111VVXXXXVVVf9B1qv19x33323ctVVV1111f8EBFddddVVV/2P8Pd///e//eQnP5mrrrrqqquuuuqq/+2GYeC+++67lauuuuqqq/4noHLVVVddddX/CP/wD//wO1x11VVXXXXVVVf9HzAMA2fPnn0GV1111VVX/U9A5aqrrrrqqv8Rzp49eytXXXXVVVddddVV/wfs7+/zD//wD7/NVVddddVV/xNQueqqq6666qqrrrrqqquuuuqq/0DDMHDffffdylVXXXXVVf8TEFx11VVXXfU/wn333Xfrfffdd+v+/j5XXXXVVVddddVV/1sNw8BVV1111VX/oxBcddVVV131P8bZs2dv5aqrrrrqqquuuup/sf39fX7rt37re7jqqquuuup/CoKrrrrqqqv+x/j7v//73z44OOCqq6666qqrrrrqqquuuuqqq/6DEFx11VVXXfU/xtmzZ59x9913c9VVV1111VVXXfW/1cHBAf/wD//w21x11VVXXfU/BZWrrrrqqqv+x7jvvvtu5aqrrrrqqquuuup/sf39fc6ePXsrV1111VVX/U9B5aqrrrrqqv8xzp49eytXXXXVVVddddVV/8vdd999t3LVVVddddX/FARXXXXVVVf9j3HffffdCjAMA1ddddVVV1111VX/Gw3DwH333XcrV1111VVX/U9BcNVVV1111f8o//AP//Db6/Waq6666qqrrrrqqv9t9vf3+Yd/+Iff5qqrrrrqqv9JqFx11VVXXfU/yn333XfrMAxcddVVV1111VVX/W8zDAP33XffrVx11VVXXfU/CcFVV1111VX/o9x33323PuMZz+Cqq6666qqrrrrqf5uDgwP+4R/+4Xe46qqrrrrqfxIqV1111VVX/Y/yD//wD7/DVVddddVVV1111VVXXXXVVVf9x6By1VVXXXXV/yhnz569lauuuuqqq6666qr/hfb39/mHf/iH3+aqq6666qr/SahcddVVV1111VVXXXXVVVddddV/gGEYuO+++27lqquuuuqq/0kIrrrqqquu+h/lvvvuu/Uf/uEffnt/f5+rrrrqqquuuuqq/y2GYeC+++67lauuuuqqq/6noXLVVVddddVVV1111VVXXXXVVf9O+/v7/MM//MNvc9VVV1111f80BFddddVVV/2P8/d///e/fXBwwFVXXXXVVVddddX/FsMwcN99993KVVddddVV/9MQXHXVVVdd9T/OP/zDP/zO3XffzVVXXXXVVVddddX/FsMwcPbs2Wdw1VVXXXXV/zRUrrrqqquuuuqqq6666qqrrrrq32l/f59/+Id/+G2uuuqqq676n4bKVVddddVV/+OcPXv2Vq666qqrrrrqqqv+FxmGgauuuuqqq/5HIrjqqquuuup/nPvuu+/W++6779ZhGLjqqquuuuqqq6763+K+++67lauuuuqqq/6nIbjqqquuuup/pLNnz966Xq+56qqrrrrqqquu+p/u/Pnz/NZv/dZ3c9VVV1111f9EBFddddVVV/2P9Pd///e/fXBwwFVXXXXVVVddddVVV1111VVX/TsQXHXVVVdd9T/W3XffzVVXXXXVVVddddX/dAcHB/zDP/zD73DVVVddddX/RFSuuuqqq676H+kf/uEffoerrrrqqquuuuqqq6666qqrrvr3oXLVVVddddX/SGfPnr2Vq6666qqrrrrqqv8F9vf3+Yd/+Iff5qqrrrrqqv+JqFx11VVXXfU/0n333XcrV1111VVXXXXVVf8LDMPAfffddytXXXXVVVf9T0Rw1VVXXXXV/1j/8A//8Nv7+/tcddVVV1111VVX/U91cHDAP/zDP/w2V1111VVX/U9F5aqrrrrqqquuuuqqq6666qqr/o3W6zX33XffrVx11VVXXfU/FcFVV1111VX/Y/393//9bz/5yU/mqquuuuqqq6666n+qYRi47777buWqq6666qr/qahcddVVV131P9Y//MM//A5XXXXVVVddddVV/4MNw8DZs2efwVVXXXXVVf9TUbnqqquuuup/rLNnz97KVVddddVVV1111f9g+/v7/MM//MNvc9VVV1111f9UVK666qqrrrrqqquuuuqqq6666t9oGAbuu+++W7nqqquuuup/KoKrrrrqqqv+x7rvvvtuve+++27d39/nqquuuuqqq6666n+aYRi46qqrrrrqfzyCq6666qqr/kc7e/bsrVx11VVXXXXVVVf9D7S/v89v/dZvfQ9XXXXVVVf9T0Zw1VVXXXXV/2h///d//9sHBwdcddVVV1111VVXXXXVVVddddW/AcFVV1111VX/o509e/YZd999N1ddddVVV1111VX/0xwcHPAP//APv81VV1111VX/k1G56qqrrrrqf7T77rvvVq666qqrrrrqqqv+B9rf3+fs2bO3ctVVV1111f9kVK666qqrrvof7ezZs7dy1VVXXXXVVVdd9T/UfffddytXXXXVVVf9T0Zw1VVXXXXV/2j33XffrQDDMHDVVVddddVVV131P8kwDNx33323ctVVV1111f9kBFddddVVV/2P9w//8A+/vV6vueqqq6666qqrrvqfYn9/n3/4h3/4ba666qqrrvqfjspVV1111VX/49133323DsPAVVddddVVV1111f8UwzBw33333cpVV1111VX/0xFcddVVV131P95999136zOe8Qyuuuqqq6666qqr/qc4ODjgH/7hH36Hq6666qqr/qejctVVV1111f94//AP//A7XHXVVVddddVVV1111VVXXXXVvx6Vq6666qqr/sc7e/bsrVx11VVXXXXVVVf9D7K/v88//MM//DZXXXXVVVf9T0flqquuuuqqq6666qqrrrrqqqv+lYZh4L777ruVq6666qqr/qcjuOqqq6666n+8++6779Z/+Id/+O39/X2uuuqqq6666qqr/rsNw8B99913K1ddddVVV/1vQOWqq6666qqrrrrqqquuuuqqq/4V9vf3+Yd/+Iff5qqrrrrqqv8NCK666qqrrvpf4e///u9/++DggKuuuuqqq6666qr/bsMwcN99993KVVddddVV/xsQXHXVVVdd9b/CP/zDP/zO3XffzVVXXXXVVVddddV/t2EYOHv27DO46qqrrrrqfwMqV1111VVXXXXVVVddddVVV131r7C/v88//MM//DZXXXXVVVf9b0Dlqquuuuqq/xXOnj17K1ddddVVV1111VX/AwzDwFVXXXXVVf9rEFx11VVXXfW/wn333Xfrfffdd+swDFx11VVXXXXVVVf9d7vvvvtu5aqrrrrqqv8NCK666qqrrvpf4+zZs7eu12uuuuqqq6666qqr/rucP3+e3/qt3/purrrqqquu+t+C4Kqrrrrqqv81/v7v//63Dw4OuOqqq6666qqrrrrqqquuuuqqFxHBVVddddVV/6vcfffdXHXVVVddddVVV/13ecYznsE//MM//A5XXXXVVVf9b0Hlqquuuuqq/zV++7d/+3vOnj37jA//8A//Lq666qqrrrrqqqv+G/zIj/zIZ//Wb/3Wd3PVVVddddX/FuhBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V/GPl+emO0MXBNcAAAAASUVORK5CYII=) + + diff --git a/docs/kcl-std/index.md b/docs/kcl-std/index.md index 4a31d1d64..7a0c8f7e5 100644 --- a/docs/kcl-std/index.md +++ b/docs/kcl-std/index.md @@ -72,6 +72,7 @@ layout: manual * [`profileStart`](/docs/kcl-std/functions/std-sketch-profileStart) * [`profileStartX`](/docs/kcl-std/functions/std-sketch-profileStartX) * [`profileStartY`](/docs/kcl-std/functions/std-sketch-profileStartY) + * [`rectangle`](/docs/kcl-std/functions/std-sketch-rectangle) * [`revolve`](/docs/kcl-std/functions/std-sketch-revolve) * [`segAng`](/docs/kcl-std/functions/std-sketch-segAng) * [`segEnd`](/docs/kcl-std/functions/std-sketch-segEnd) diff --git a/docs/kcl-std/modules/std-sketch.md b/docs/kcl-std/modules/std-sketch.md index a96536547..d9cf7079e 100644 --- a/docs/kcl-std/modules/std-sketch.md +++ b/docs/kcl-std/modules/std-sketch.md @@ -37,6 +37,7 @@ This module contains functions for creating and manipulating sketches, and makin * [`profileStart`](/docs/kcl-std/functions/std-sketch-profileStart) * [`profileStartX`](/docs/kcl-std/functions/std-sketch-profileStartX) * [`profileStartY`](/docs/kcl-std/functions/std-sketch-profileStartY) +* [`rectangle`](/docs/kcl-std/functions/std-sketch-rectangle) * [`revolve`](/docs/kcl-std/functions/std-sketch-revolve) * [`segAng`](/docs/kcl-std/functions/std-sketch-segAng) * [`segEnd`](/docs/kcl-std/functions/std-sketch-segEnd) diff --git a/rust/kcl-derive-docs/src/example_tests.rs b/rust/kcl-derive-docs/src/example_tests.rs index 27ba9fcf9..94a64f9f6 100644 --- a/rust/kcl-derive-docs/src/example_tests.rs +++ b/rust/kcl-derive-docs/src/example_tests.rs @@ -100,6 +100,8 @@ pub const TEST_NAMES: &[&str] = &[ "std-sketch-planeOf-0", "std-sketch-circle-0", "std-sketch-circle-1", + "std-sketch-rectangle-0", + "std-sketch-rectangle-1", "std-sketch-patternTransform2d-0", "std-sketch-revolve-0", "std-sketch-revolve-1", diff --git a/rust/kcl-lib/src/execution/geometry.rs b/rust/kcl-lib/src/execution/geometry.rs index 4745c6e94..658da8bf2 100644 --- a/rust/kcl-lib/src/execution/geometry.rs +++ b/rust/kcl-lib/src/execution/geometry.rs @@ -1031,7 +1031,7 @@ pub struct GeoMeta { #[ts(export)] #[serde(tag = "type")] pub enum Path { - /// A path that goes to a point. + /// A straight line which ends at the given point. ToPoint { #[serde(flatten)] base: BasePath, diff --git a/rust/kcl-lib/src/simulation_tests.rs b/rust/kcl-lib/src/simulation_tests.rs index 40a507ba0..d49079e1b 100644 --- a/rust/kcl-lib/src/simulation_tests.rs +++ b/rust/kcl-lib/src/simulation_tests.rs @@ -3632,6 +3632,48 @@ mod non_english_identifiers { super::execute(TEST_NAME, true).await } } +mod rect { + const TEST_NAME: &str = "rect"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[tokio::test(flavor = "multi_thread")] + async fn unparse() { + super::unparse(TEST_NAME).await + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod rect_helper { + const TEST_NAME: &str = "rect_helper"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[tokio::test(flavor = "multi_thread")] + async fn unparse() { + super::unparse(TEST_NAME).await + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} mod plane_of { const TEST_NAME: &str = "plane_of"; diff --git a/rust/kcl-lib/src/std/mod.rs b/rust/kcl-lib/src/std/mod.rs index 152cd4be1..ab34ce0f9 100644 --- a/rust/kcl-lib/src/std/mod.rs +++ b/rust/kcl-lib/src/std/mod.rs @@ -256,6 +256,10 @@ pub(crate) fn std_fn(path: &str, fn_name: &str) -> (crate::std::StdFn, StdFnProp |e, a| Box::pin(crate::std::shapes::circle(e, a)), StdFnProps::default("std::sketch::circle"), ), + ("sketch", "rectangle") => ( + |e, a| Box::pin(crate::std::shapes::rectangle(e, a)), + StdFnProps::default("std::sketch::rectangle"), + ), ("sketch", "planeOf") => ( |e, a| Box::pin(crate::std::planes::plane_of(e, a)), StdFnProps::default("std::sketch::planeOf"), diff --git a/rust/kcl-lib/src/std/shapes.rs b/rust/kcl-lib/src/std/shapes.rs index 5518f228b..7c3379c4d 100644 --- a/rust/kcl-lib/src/std/shapes.rs +++ b/rust/kcl-lib/src/std/shapes.rs @@ -38,6 +38,119 @@ pub enum SketchOrSurface { Sketch(Box), } +/// Sketch a rectangle. +pub async fn rectangle(exec_state: &mut ExecState, args: Args) -> Result { + let sketch_or_surface = + args.get_unlabeled_kw_arg("sketchOrSurface", &RuntimeType::sketch_or_surface(), exec_state)?; + let center = args.get_kw_arg_opt("center", &RuntimeType::point2d(), exec_state)?; + let corner = args.get_kw_arg_opt("corner", &RuntimeType::point2d(), exec_state)?; + let width: TyF64 = args.get_kw_arg("width", &RuntimeType::length(), exec_state)?; + let height: TyF64 = args.get_kw_arg("height", &RuntimeType::length(), exec_state)?; + + inner_rectangle(sketch_or_surface, center, corner, width, height, exec_state, args) + .await + .map(Box::new) + .map(|value| KclValue::Sketch { value }) +} + +async fn inner_rectangle( + sketch_or_surface: SketchOrSurface, + center: Option<[TyF64; 2]>, + corner: Option<[TyF64; 2]>, + width: TyF64, + height: TyF64, + exec_state: &mut ExecState, + args: Args, +) -> Result { + let sketch_surface = match sketch_or_surface { + SketchOrSurface::SketchSurface(surface) => surface, + SketchOrSurface::Sketch(s) => s.on, + }; + + // Find the corner in the negative quadrant + let (ty, corner) = match (center, corner) { + (Some(center), None) => ( + center[0].ty, + [center[0].n - width.n / 2.0, center[1].n - height.n / 2.0], + ), + (None, Some(corner)) => (corner[0].ty, [corner[0].n, corner[1].n]), + (None, None) => { + return Err(KclError::new_semantic(KclErrorDetails::new( + "You must supply either `corner` or `center` arguments, but not both".to_string(), + vec![args.source_range], + ))); + } + (Some(_), Some(_)) => { + return Err(KclError::new_semantic(KclErrorDetails::new( + "You must supply either `corner` or `center` arguments, but not both".to_string(), + vec![args.source_range], + ))); + } + }; + let units = ty.expect_length(); + let corner_t = [TyF64::new(corner[0], ty), TyF64::new(corner[1], ty)]; + + // Start the sketch then draw the 4 lines. + let sketch = + crate::std::sketch::inner_start_profile(sketch_surface, corner_t, None, exec_state, args.clone()).await?; + let sketch_id = sketch.id; + let deltas = [[width.n, 0.0], [0.0, height.n], [-width.n, 0.0], [0.0, -height.n]]; + let ids = [ + exec_state.next_uuid(), + exec_state.next_uuid(), + exec_state.next_uuid(), + exec_state.next_uuid(), + ]; + for (id, delta) in ids.iter().copied().zip(deltas) { + exec_state + .batch_modeling_cmd( + ModelingCmdMeta::from_args_id(&args, id), + ModelingCmd::from(mcmd::ExtendPath { + path: sketch.id.into(), + segment: PathSegment::Line { + end: KPoint2d::from(untyped_point_to_mm(delta, units)) + .with_z(0.0) + .map(LengthUnit), + relative: true, + }, + }), + ) + .await?; + } + exec_state + .batch_modeling_cmd( + ModelingCmdMeta::from_args_id(&args, sketch_id), + ModelingCmd::from(mcmd::ClosePath { path_id: sketch.id }), + ) + .await?; + + // Update the sketch in KCL memory. + let mut new_sketch = sketch.clone(); + fn add(a: [f64; 2], b: [f64; 2]) -> [f64; 2] { + [a[0] + b[0], a[1] + b[1]] + } + let a = (corner, add(corner, deltas[0])); + let b = (a.1, add(a.1, deltas[1])); + let c = (b.1, add(b.1, deltas[2])); + let d = (c.1, add(c.1, deltas[3])); + for (id, (from, to)) in ids.into_iter().zip([a, b, c, d]) { + let current_path = Path::ToPoint { + base: BasePath { + from, + to, + tag: None, + units, + geo_meta: GeoMeta { + id, + metadata: args.source_range.into(), + }, + }, + }; + new_sketch.paths.push(current_path); + } + Ok(new_sketch) +} + /// Sketch a circle. pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result { let sketch_or_surface = diff --git a/rust/kcl-lib/std/sketch.kcl b/rust/kcl-lib/std/sketch.kcl index 864b0246e..396581dd1 100644 --- a/rust/kcl-lib/std/sketch.kcl +++ b/rust/kcl-lib/std/sketch.kcl @@ -234,6 +234,39 @@ export fn startProfile( tag?: TagDecl, ): Sketch {} +/// Sketch a rectangle. +/// +/// ``` +/// exampleSketch = startSketchOn(-XZ) +/// |> rectangle(center = [0, 0], width = 10, height = 5) +// |> extrude(length = 2) +/// ``` +/// +/// ``` +/// exampleSketch = startSketchOn(-XZ) +/// |> rectangle(corner = [0, 0], width = 10, height = 5) +// |> extrude(length = 2) +/// ``` +@(impl = std_rust) +export fn rectangle( + /// Sketch to extend, or plane or surface to sketch on. + @sketchOrSurface: Sketch | Plane | Face, + /// Rectangle's width along X axis. + width: number(Length), + /// Rectangle's height along Y axis. + height: number(Length), + /// The center of the rectangle. + /// Incompatible with `corner`. + @(snippetArray = ["0", "0"]) + center?: Point2d, + /// The corner of the rectangle. + /// Incompatible with `center`. + /// This will be the corner which is most negative on + /// both X and Y axes. + @(snippetArray = ["0", "0"]) + corner?: Point2d, +): Sketch {} + /// Construct a 2-dimensional circle, of the specified radius, centered at /// the provided (x, y) origin point. /// diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-rectangle0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-rectangle0.png new file mode 100644 index 000000000..be2d109a1 Binary files /dev/null and b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-rectangle0.png differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-rectangle1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-rectangle1.png new file mode 100644 index 000000000..be2d109a1 Binary files /dev/null and b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-rectangle1.png differ diff --git a/rust/kcl-lib/tests/rect/artifact_commands.snap b/rust/kcl-lib/tests/rect/artifact_commands.snap new file mode 100644 index 000000000..fd195b67a --- /dev/null +++ b/rust/kcl-lib/tests/rect/artifact_commands.snap @@ -0,0 +1,163 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact commands rect.kcl +--- +{ + "rust/kcl-lib/tests/rect/input.kcl": [ + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -2.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 3.0, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.00000000000000012246467991473532, + "y": 2.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -3.0, + "y": -0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -2.0, + "y": -1.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + } + ], + "std::appearance": [], + "std::array": [], + "std::math": [], + "std::prelude": [], + "std::sketch": [], + "std::solid": [], + "std::sweep": [], + "std::transform": [], + "std::turns": [], + "std::types": [], + "std::units": [] +} diff --git a/rust/kcl-lib/tests/rect/artifact_graph_flowchart.snap b/rust/kcl-lib/tests/rect/artifact_graph_flowchart.snap new file mode 100644 index 000000000..626a011cd --- /dev/null +++ b/rust/kcl-lib/tests/rect/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact graph flowchart rect.kcl +extension: md +snapshot_kind: binary +--- diff --git a/rust/kcl-lib/tests/rect/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/rect/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..4414db6b1 --- /dev/null +++ b/rust/kcl-lib/tests/rect/artifact_graph_flowchart.snap.md @@ -0,0 +1,27 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[27, 54, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 3["Segment
[60, 103, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] + 4["Segment
[109, 155, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] + 5["Segment
[161, 211, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] + 6["Segment
[217, 273, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] + 7["Segment
[279, 286, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] + 8[Solid2d] + end + 1["Plane
[4, 21, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 +``` diff --git a/rust/kcl-lib/tests/rect/ast.snap b/rust/kcl-lib/tests/rect/ast.snap new file mode 100644 index 000000000..42dc11681 --- /dev/null +++ b/rust/kcl-lib/tests/rect/ast.snap @@ -0,0 +1,701 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of parsing rect.kcl +--- +{ + "Ok": { + "body": [ + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "XY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "at", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "moduleId": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "startProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "a" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "angledLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "arguments": [], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "segAng", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "a", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "moduleId": 0, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "angledLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "segAng", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "a", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "arguments": [], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "segLen", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "a", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "angledLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "arguments": [], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "profileStartX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + }, + { + "arguments": [], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "profileStartY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "end": 0, + "moduleId": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "line", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "close", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "moduleId": 0, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "moduleId": 0, + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0 + } +} diff --git a/rust/kcl-lib/tests/rect/input.kcl b/rust/kcl-lib/tests/rect/input.kcl new file mode 100644 index 000000000..2ed70845f --- /dev/null +++ b/rust/kcl-lib/tests/rect/input.kcl @@ -0,0 +1,7 @@ +x = startSketchOn(XY) + |> startProfile(at = [-2, -1]) + |> angledLine(angle = 0, length = 3, tag = $a) + |> angledLine(angle = segAng(a) + 90, length = 2) + |> angledLine(angle = segAng(a), length = -segLen(a)) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() diff --git a/rust/kcl-lib/tests/rect/ops.snap b/rust/kcl-lib/tests/rect/ops.snap new file mode 100644 index 000000000..cf120d1ec --- /dev/null +++ b/rust/kcl-lib/tests/rect/ops.snap @@ -0,0 +1,128 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Operations executed rect.kcl +--- +{ + "rust/kcl-lib/tests/rect/input.kcl": [ + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 0 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 0 + } + ] + }, + "sourceRange": [] + } + ], + "std::appearance": [], + "std::array": [], + "std::math": [ + { + "type": "VariableDeclaration", + "name": "PI", + "value": { + "type": "Number", + "value": 3.141592653589793, + "ty": { + "type": "Unknown" + } + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + }, + { + "type": "VariableDeclaration", + "name": "E", + "value": { + "type": "Number", + "value": 2.718281828459045, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + }, + { + "type": "VariableDeclaration", + "name": "TAU", + "value": { + "type": "Number", + "value": 6.283185307179586, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + } + ], + "std::prelude": [ + { + "type": "VariableDeclaration", + "name": "START", + "value": { + "type": "String", + "value": "start" + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + }, + { + "type": "VariableDeclaration", + "name": "END", + "value": { + "type": "String", + "value": "end" + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + } + ], + "std::sketch": [], + "std::solid": [], + "std::sweep": [], + "std::transform": [], + "std::turns": [], + "std::types": [], + "std::units": [] +} diff --git a/rust/kcl-lib/tests/rect/program_memory.snap b/rust/kcl-lib/tests/rect/program_memory.snap new file mode 100644 index 000000000..a93bc3091 --- /dev/null +++ b/rust/kcl-lib/tests/rect/program_memory.snap @@ -0,0 +1,181 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Variables in memory after executing rect.kcl +--- +{ + "a": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "a" + }, + "x": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -2.0, + -1.0 + ], + "tag": { + "commentStart": 100, + "end": 102, + "moduleId": 0, + "start": 100, + "type": "TagDeclarator", + "value": "a" + }, + "to": [ + 1.0, + -1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 1.0, + -1.0 + ], + "tag": null, + "to": [ + 1.0000000000000002, + 1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 1.0000000000000002, + 1.0 + ], + "tag": null, + "to": [ + -1.9999999999999998, + 1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -1.9999999999999998, + 1.0 + ], + "tag": null, + "to": [ + -2.0, + -1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -2.0, + -1.0 + ], + "tag": null, + "to": [ + -2.0, + -1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XY", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + -2.0, + -1.0 + ], + "to": [ + -2.0, + -1.0 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "a": { + "type": "TagIdentifier", + "value": "a" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Mm" + } + } + } +} diff --git a/rust/kcl-lib/tests/rect/rendered_model.png b/rust/kcl-lib/tests/rect/rendered_model.png new file mode 100644 index 000000000..d67607ac6 Binary files /dev/null and b/rust/kcl-lib/tests/rect/rendered_model.png differ diff --git a/rust/kcl-lib/tests/rect/unparsed.snap b/rust/kcl-lib/tests/rect/unparsed.snap new file mode 100644 index 000000000..99637e205 --- /dev/null +++ b/rust/kcl-lib/tests/rect/unparsed.snap @@ -0,0 +1,11 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of unparsing rect.kcl +--- +x = startSketchOn(XY) + |> startProfile(at = [-2, -1]) + |> angledLine(angle = 0, length = 3, tag = $a) + |> angledLine(angle = segAng(a) + 90, length = 2) + |> angledLine(angle = segAng(a), length = -segLen(a)) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() diff --git a/rust/kcl-lib/tests/rect_helper/artifact_commands.snap b/rust/kcl-lib/tests/rect_helper/artifact_commands.snap new file mode 100644 index 000000000..3071652d6 --- /dev/null +++ b/rust/kcl-lib/tests/rect_helper/artifact_commands.snap @@ -0,0 +1,163 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact commands rect_helper.kcl +--- +{ + "rust/kcl-lib/tests/rect_helper/input.kcl": [ + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -2.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 3.0, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": 2.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -3.0, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -2.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + } + ], + "std::appearance": [], + "std::array": [], + "std::math": [], + "std::prelude": [], + "std::sketch": [], + "std::solid": [], + "std::sweep": [], + "std::transform": [], + "std::turns": [], + "std::types": [], + "std::units": [] +} diff --git a/rust/kcl-lib/tests/rect_helper/artifact_graph_flowchart.snap b/rust/kcl-lib/tests/rect_helper/artifact_graph_flowchart.snap new file mode 100644 index 000000000..fa21abca9 --- /dev/null +++ b/rust/kcl-lib/tests/rect_helper/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact graph flowchart rect_helper.kcl +extension: md +snapshot_kind: binary +--- diff --git a/rust/kcl-lib/tests/rect_helper/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/rect_helper/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..a082bd808 --- /dev/null +++ b/rust/kcl-lib/tests/rect_helper/artifact_graph_flowchart.snap.md @@ -0,0 +1,24 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[25, 76, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 3["Segment
[25, 76, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 4["Segment
[25, 76, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 5["Segment
[25, 76, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 6["Segment
[25, 76, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 7[Solid2d] + end + 1["Plane
[4, 21, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 +``` diff --git a/rust/kcl-lib/tests/rect_helper/ast.snap b/rust/kcl-lib/tests/rect_helper/ast.snap new file mode 100644 index 000000000..9c157979f --- /dev/null +++ b/rust/kcl-lib/tests/rect_helper/ast.snap @@ -0,0 +1,233 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of parsing rect_helper.kcl +--- +{ + "Ok": { + "body": [ + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "XY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "width", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "3", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 3.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "height", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "corner", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "moduleId": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": { + "commentStart": 0, + "end": 0, + "moduleId": 0, + "name": "rectangle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "moduleId": 0, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "moduleId": 0, + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "commentStart": 0, + "end": 0, + "moduleId": 0, + "start": 0 + } +} diff --git a/rust/kcl-lib/tests/rect_helper/input.kcl b/rust/kcl-lib/tests/rect_helper/input.kcl new file mode 100644 index 000000000..3e041e728 --- /dev/null +++ b/rust/kcl-lib/tests/rect_helper/input.kcl @@ -0,0 +1,2 @@ +x = startSketchOn(XY) +|> rectangle(width = 3, height = 2, corner = [-2, -1]) diff --git a/rust/kcl-lib/tests/rect_helper/ops.snap b/rust/kcl-lib/tests/rect_helper/ops.snap new file mode 100644 index 000000000..a34c67bb0 --- /dev/null +++ b/rust/kcl-lib/tests/rect_helper/ops.snap @@ -0,0 +1,128 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Operations executed rect_helper.kcl +--- +{ + "rust/kcl-lib/tests/rect_helper/input.kcl": [ + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "nodePath": { + "steps": [ + { + "type": "ProgramBodyItem", + "index": 0 + }, + { + "type": "VariableDeclarationDeclaration" + }, + { + "type": "VariableDeclarationInit" + }, + { + "type": "PipeBodyItem", + "index": 0 + } + ] + }, + "sourceRange": [] + } + ], + "std::appearance": [], + "std::array": [], + "std::math": [ + { + "type": "VariableDeclaration", + "name": "PI", + "value": { + "type": "Number", + "value": 3.141592653589793, + "ty": { + "type": "Unknown" + } + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + }, + { + "type": "VariableDeclaration", + "name": "E", + "value": { + "type": "Number", + "value": 2.718281828459045, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + }, + { + "type": "VariableDeclaration", + "name": "TAU", + "value": { + "type": "Number", + "value": 6.283185307179586, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + } + ], + "std::prelude": [ + { + "type": "VariableDeclaration", + "name": "START", + "value": { + "type": "String", + "value": "start" + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + }, + { + "type": "VariableDeclaration", + "name": "END", + "value": { + "type": "String", + "value": "end" + }, + "visibility": "export", + "nodePath": { + "steps": [] + }, + "sourceRange": [] + } + ], + "std::sketch": [], + "std::solid": [], + "std::sweep": [], + "std::transform": [], + "std::turns": [], + "std::types": [], + "std::units": [] +} diff --git a/rust/kcl-lib/tests/rect_helper/program_memory.snap b/rust/kcl-lib/tests/rect_helper/program_memory.snap new file mode 100644 index 000000000..d2fd3a45a --- /dev/null +++ b/rust/kcl-lib/tests/rect_helper/program_memory.snap @@ -0,0 +1,144 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Variables in memory after executing rect_helper.kcl +--- +{ + "x": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -2.0, + -1.0 + ], + "tag": null, + "to": [ + 1.0, + -1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 1.0, + -1.0 + ], + "tag": null, + "to": [ + 1.0, + 1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 1.0, + 1.0 + ], + "tag": null, + "to": [ + -2.0, + 1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -2.0, + 1.0 + ], + "tag": null, + "to": [ + -2.0, + -1.0 + ], + "type": "ToPoint", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XY", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + -2.0, + -1.0 + ], + "to": [ + -2.0, + -1.0 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Mm" + } + } + } +} diff --git a/rust/kcl-lib/tests/rect_helper/rendered_model.png b/rust/kcl-lib/tests/rect_helper/rendered_model.png new file mode 100644 index 000000000..d67607ac6 Binary files /dev/null and b/rust/kcl-lib/tests/rect_helper/rendered_model.png differ diff --git a/rust/kcl-lib/tests/rect_helper/unparsed.snap b/rust/kcl-lib/tests/rect_helper/unparsed.snap new file mode 100644 index 000000000..f8376774d --- /dev/null +++ b/rust/kcl-lib/tests/rect_helper/unparsed.snap @@ -0,0 +1,6 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of unparsing rect_helper.kcl +--- +x = startSketchOn(XY) + |> rectangle(width = 3, height = 2, corner = [-2, -1])