diff --git a/README.md b/README.md index df89009e..127a1a6c 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ -# diffCheck -

+

+ +

+

-Temporary repository for diffCheck - ## Roadmap ```mermaid diff --git a/assets/logo/ViewCapture20240412_103050.png b/assets/logo/ViewCapture20240412_103050.png new file mode 100644 index 00000000..4ed5bf34 Binary files /dev/null and b/assets/logo/ViewCapture20240412_103050.png differ diff --git a/assets/logo/logo_pixelized.xcf b/assets/logo/logo_pixelized.xcf new file mode 100644 index 00000000..5bf8af35 Binary files /dev/null and b/assets/logo/logo_pixelized.xcf differ diff --git a/assets/logo/logo_pixelized_596_618.png b/assets/logo/logo_pixelized_596_618.png new file mode 100644 index 00000000..5da32d42 Binary files /dev/null and b/assets/logo/logo_pixelized_596_618.png differ diff --git a/assets/logo/logo_pixelized_64_64.png b/assets/logo/logo_pixelized_64_64.png new file mode 100644 index 00000000..9c63053c Binary files /dev/null and b/assets/logo/logo_pixelized_64_64.png differ diff --git a/assets/logo/logo_pixelized_64_64.xcf b/assets/logo/logo_pixelized_64_64.xcf new file mode 100644 index 00000000..00cc168c Binary files /dev/null and b/assets/logo/logo_pixelized_64_64.xcf differ diff --git a/assets/logo/logo_raw.png b/assets/logo/logo_raw.png new file mode 100644 index 00000000..87292a01 Binary files /dev/null and b/assets/logo/logo_raw.png differ diff --git a/assets/logo/logotests.3dm b/assets/logo/logotests.3dm new file mode 100644 index 00000000..4a19bf17 Binary files /dev/null and b/assets/logo/logotests.3dm differ diff --git a/assets/logo/logotests.3dmbak b/assets/logo/logotests.3dmbak new file mode 100644 index 00000000..94756b83 Binary files /dev/null and b/assets/logo/logotests.3dmbak differ diff --git a/deps/eigen b/deps/eigen index b5feca5d..2265242a 160000 --- a/deps/eigen +++ b/deps/eigen @@ -1 +1 @@ -Subproject commit b5feca5d03185d99fe011bcade16a181f567fca0 +Subproject commit 2265242aa121742dd7e80a0167228b43e95bec62 diff --git a/src/gh/diffCheck/diffCheck.egg-info/PKG-INFO b/src/gh/diffCheck/diffCheck.egg-info/PKG-INFO new file mode 100644 index 00000000..b6273c49 --- /dev/null +++ b/src/gh/diffCheck/diffCheck.egg-info/PKG-INFO @@ -0,0 +1,18 @@ +Metadata-Version: 2.1 +Name: diffCheck +Version: 0.0.3 +Summary: DiffCheck is a package to check the differences between two timber structures +Home-page: https://github.com/diffCheckOrg/diffCheck +Author: Andrea Settimi, Damien Gilliard, Eleni Skevaki, Marirena Kladeftira, Julien Gamerro, Stefana Parascho, and Yves Weinand +Author-email: andrea.settimi@epfl.ch +License: UNKNOWN +Description: # DiffCheck Grasshopper Plugin + + DiffCheck is a plugin for Rhino/Grasshopper that allows the user to compare a 3D model with its scan. + + More information to come +Platform: UNKNOWN +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Description-Content-Type: text/markdown diff --git a/src/gh/diffCheck/diffCheck.egg-info/SOURCES.txt b/src/gh/diffCheck/diffCheck.egg-info/SOURCES.txt new file mode 100644 index 00000000..501a0009 --- /dev/null +++ b/src/gh/diffCheck/diffCheck.egg-info/SOURCES.txt @@ -0,0 +1,13 @@ +README.md +setup.py +diffCheck/__init__.py +diffCheck/df_geometries.py +diffCheck/df_joint_detector.py +diffCheck/df_transformations.py +diffCheck/df_util.py +diffCheck/diffCheck_app.py +diffCheck/test.py +diffCheck.egg-info/PKG-INFO +diffCheck.egg-info/SOURCES.txt +diffCheck.egg-info/dependency_links.txt +diffCheck.egg-info/top_level.txt \ No newline at end of file diff --git a/src/gh/diffCheck/diffCheck.egg-info/dependency_links.txt b/src/gh/diffCheck/diffCheck.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/gh/diffCheck/diffCheck.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/gh/diffCheck/diffCheck.egg-info/requires.txt b/src/gh/diffCheck/diffCheck.egg-info/requires.txt new file mode 100644 index 00000000..24ce15ab --- /dev/null +++ b/src/gh/diffCheck/diffCheck.egg-info/requires.txt @@ -0,0 +1 @@ +numpy diff --git a/src/gh/diffCheck/diffCheck.egg-info/top_level.txt b/src/gh/diffCheck/diffCheck.egg-info/top_level.txt new file mode 100644 index 00000000..ac76f019 --- /dev/null +++ b/src/gh/diffCheck/diffCheck.egg-info/top_level.txt @@ -0,0 +1 @@ +diffCheck diff --git a/src/gh/diffCheck/diffCheck/__pycache__/__init__.cpython-38.pyc b/src/gh/diffCheck/diffCheck/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 00000000..b13b9668 Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/__init__.cpython-38.pyc differ diff --git a/src/gh/diffCheck/diffCheck/__pycache__/__init__.cpython-39.pyc b/src/gh/diffCheck/diffCheck/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 00000000..c0735ba9 Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/__init__.cpython-39.pyc differ diff --git a/src/gh/diffCheck/diffCheck/__pycache__/df_geometries.cpython-39.pyc b/src/gh/diffCheck/diffCheck/__pycache__/df_geometries.cpython-39.pyc new file mode 100644 index 00000000..e1237df4 Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/df_geometries.cpython-39.pyc differ diff --git a/src/gh/diffCheck/diffCheck/__pycache__/df_joint_detector.cpython-39.pyc b/src/gh/diffCheck/diffCheck/__pycache__/df_joint_detector.cpython-39.pyc new file mode 100644 index 00000000..3a848217 Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/df_joint_detector.cpython-39.pyc differ diff --git a/src/gh/diffCheck/diffCheck/__pycache__/df_transformations.cpython-39.pyc b/src/gh/diffCheck/diffCheck/__pycache__/df_transformations.cpython-39.pyc new file mode 100644 index 00000000..d784fb97 Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/df_transformations.cpython-39.pyc differ diff --git a/src/gh/diffCheck/diffCheck/__pycache__/df_util.cpython-39.pyc b/src/gh/diffCheck/diffCheck/__pycache__/df_util.cpython-39.pyc new file mode 100644 index 00000000..daa54480 Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/df_util.cpython-39.pyc differ diff --git a/src/gh/diffCheck/diffCheck/__pycache__/geometries.cpython-38.pyc b/src/gh/diffCheck/diffCheck/__pycache__/geometries.cpython-38.pyc new file mode 100644 index 00000000..1c31d060 Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/geometries.cpython-38.pyc differ diff --git a/src/gh/diffCheck/diffCheck/__pycache__/geometries.cpython-39.pyc b/src/gh/diffCheck/diffCheck/__pycache__/geometries.cpython-39.pyc new file mode 100644 index 00000000..624f1cda Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/geometries.cpython-39.pyc differ diff --git a/src/gh/diffCheck/diffCheck/__pycache__/test.cpython-39.pyc b/src/gh/diffCheck/diffCheck/__pycache__/test.cpython-39.pyc new file mode 100644 index 00000000..99feaa44 Binary files /dev/null and b/src/gh/diffCheck/diffCheck/__pycache__/test.cpython-39.pyc differ diff --git a/src/gh/diffCheck/dist/diffCheck-0.0.3-py3-none-any.whl b/src/gh/diffCheck/dist/diffCheck-0.0.3-py3-none-any.whl new file mode 100644 index 00000000..faa4a55e Binary files /dev/null and b/src/gh/diffCheck/dist/diffCheck-0.0.3-py3-none-any.whl differ diff --git a/src/gh/diffCheck/dist/diffCheck-0.0.3.tar.gz b/src/gh/diffCheck/dist/diffCheck-0.0.3.tar.gz new file mode 100644 index 00000000..882c8b66 Binary files /dev/null and b/src/gh/diffCheck/dist/diffCheck-0.0.3.tar.gz differ diff --git a/src/gh/diffCheck/dist/diffCheck-0.0.9-py3-none-any.whl b/src/gh/diffCheck/dist/diffCheck-0.0.9-py3-none-any.whl new file mode 100644 index 00000000..2c20bda8 Binary files /dev/null and b/src/gh/diffCheck/dist/diffCheck-0.0.9-py3-none-any.whl differ diff --git a/src/gh/diffCheck/dist/diffCheck-0.0.9.tar.gz b/src/gh/diffCheck/dist/diffCheck-0.0.9.tar.gz new file mode 100644 index 00000000..37235594 Binary files /dev/null and b/src/gh/diffCheck/dist/diffCheck-0.0.9.tar.gz differ diff --git a/src/gh/tester.ghx b/src/gh/tester.ghx index 6ccbdaa3..904d106d 100644 --- a/src/gh/tester.ghx +++ b/src/gh/tester.ghx @@ -49,10 +49,10 @@ - 284 - -384 + 320 + 6 - 1.7647059 + 0.25101504 @@ -68,9 +68,11 @@ - + F:\diffCheck\src\gh\diffCheck\diffCheck_app.py F:\diffCheck\src\gh\diffCheck\diffCheck_app.py + not_found + F:\diffCheck\src\gh\diffCheck\diffCheck_app.py F:\diffCheck\src\gh\diffCheck\diffCheck\diffCheck_app.py F:\diffCheck\src\gh\diffCheck\diffCheck\test.py @@ -102,9 +104,9 @@ - 44 + 52 - + c9b2d725-6f87-4b07-af90-bd9aefef68eb @@ -706,10 +708,11 @@ - + Allows for customized geometry previews true 6f2c8a4b-d787-4606-9170-900f972641c6 + true Custom Preview Preview @@ -730,10 +733,11 @@ - + Geometry to preview true 43f69636-7c49-4472-9329-bd25ec713d12 + true Geometry G false @@ -758,9 +762,10 @@ - + The material override e22d7711-ceb9-48df-9270-b376fcd13ae6 + true Material M false @@ -825,10 +830,11 @@ - + Allows for customized geometry previews true 53c99f0b-499f-4471-9227-acc96558bfea + true Custom Preview Preview @@ -849,10 +855,11 @@ - + Geometry to preview true 525f46ad-33c4-44dc-8862-35b0ddce4d1d + true Geometry G false @@ -877,9 +884,10 @@ - + The material override 2e7559ef-c4d5-4ffe-a304-c34c078e5af0 + true Material M false @@ -944,9 +952,10 @@ - + Colour (palette) swatch b14c32be-c541-4fae-93c2-449d7543457e + true Colour Swatch Swatch false @@ -1125,9 +1134,10 @@ - + Colour (palette) swatch fc5dba97-2c1a-4749-9c61-3f88abff00ff + true Colour Swatch Swatch false @@ -1280,9 +1290,10 @@ - + Colour (palette) swatch 83adf7c8-580d-4af6-a713-84bf5f8bd2d3 + true Colour Swatch Swatch false @@ -3896,11 +3907,12 @@ - + Button object with two values False True ef4234f1-74d1-42d5-8449-ae68033cb1a1 + true Button false @@ -3928,10 +3940,11 @@ - + Contains a collection of Breps (Boundary REPresentations) true 07b41f33-b1e8-491e-82ae-3da0f5326222 + true Brep Brep false @@ -3983,11 +3996,12 @@ - + Button object with two values False True d89a87be-095f-41ba-bcfa-14a27b69959f + true Button dump! false @@ -4015,11 +4029,12 @@ - + Contains a collection of file paths false All files|*.* 78f00f3a-c6ac-40ac-9725-ad949c6e7593 + true File Path Path false @@ -4072,9 +4087,10 @@ - + A panel for custom notes and text values c4486e03-f65b-4cbb-aaea-81fdbdcd7cf0 + true Panel false @@ -4124,9 +4140,10 @@ - + A panel for custom notes and text values f98c6a9b-86ca-429d-8692-dcc245c0e6e5 + true Panel false @@ -4177,14 +4194,15 @@ - - This allows to run the current active cpython file from vscode to grasshopper. + + true 2 - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABhmlDQ1BJQ0MgcHJvZmlsZQAAKM+VkTtIw1AUhv+mSkUqDhZ84JChCoIFURFHiWIRLJS2QqsOJjd9QZOGJMXFUXAtOPhYrDq4OOvq4CoIgg8QZwcnRRcp8dyk0CJU8MDlfvz3/j/nngsItRLTrI4JQNNtMxGVxHRmVQy8wodB9EPAmMwsI5ZcTKFtfd3Tbaq7CM/C/6pHzVoM8InEc8wwbeIN4plN2+C8TxxiBVklPiceN6lB4keuKx6/cc67LPDMkJlKzBOHiMV8CystzAqmRjxNHFY1nfKFtMcq5y3OWqnCGn3yFwaz+kqS67SGEcUSYohDhIIKiijBRoR2nRQLCTqX2viHXH+cXAq5imDkWEAZGmTXD/4Hv2dr5aYmvaSgBHS+OM7HCBDYBepVx/k+dpz6CeB/Bq70pr9cA2Y/Sa82tfAR0LsNXFw3NWUPuNwBBp4M2ZRdyU9LyOWA9zP6pgzQdwt0r3lza5zj9AFI0ayWb4CDQ2A0T9nrbd7d1Tq3P++484P0A3o2cqrMnZbPAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAB3RJTUUH6AEZFwkM569AfQAABNpJREFUSEu9kntMU3cYhguoOOZ1ujmFXqQtBcEpIwoTxOGQolLwUp24OFS0sEqh0oIV0CIg1FLKsbTlNooFKhRF8TajziW6zYFxcckW9bhlm9uiLk6nAyuWy7tTc0iI4w9l2Z7k++/7nveX9xzGfw+LWMhgV4hd48Y2iN1ZBvEoFiH2ZOrFXkydeJzPvsn05ghhmxIZnCq4xo1TCXe2GaPZJniyKvAqi8AEps5Eb/4LOJVfDQZ4PAswYizLgHHMckxi6vqmeJfMpjdHCNscQgUMDAaMoQJeoQLGUwGTfXR43bvkM3pz5LhxzHXuVMAoqp4x7Ap4sfZT9ejxmk8ppnlrEDE142bCxA3k2vHryKSZYnJrcPxS+vTFcGMR09w55keuAFf/Xs/612OKjxZvepdAMF2NFROT8IHv+5CEroZskeiaJC7Cgz5/MTzYRsVg/64PPJFZhqlUwHTvYrBmFGBZsAybw9ZCGr0SyhXLoVobk0Gfvhju/CJPD2GnY7SwE57CDngJL2FCzBeYsuQC/OM/Rdiq45AsWQP5ygSoEpdi94fRDyslc6SWNH9pvVwgtWb7SQ/k8CfRumHY2ithpACD45YyAA9JP3ykPQiQdSNh4zlsS1gFZaIIuZuEKEx5DwZZKKyZAWhUCdC0i5o9fIK2Pcfm7gmMlIF7zwd4b3MiMMOBhdvvQLJ6C+TrV0CVvBz5qTEoTo+CThmBAzlBaNotgK3AD80av97mUt4s2joESX/ZULlr3pD2I1Deg/nKLiQmN0O2Xoys5HjsksaiUB6Nfcp3UZ67ANX5IThYRMn38dFSxoed4J+lrTRbngio1zuHyid9NABeei+CFQ5EZ91FcsZZyBTtUGUfRGFuLXRqAuaCEtQX51GvlqCllBLr+Wg18HDIzIO9xnc5baeQ9J0YKncNU9aPOYoeLNzZhXWZV5CiOI3MHW3Iy21AsboSRIEe1ZpCNGh3okUXjhaCkhspeRUPh2u5aLNwb1isM0a7Xi98Xj49rR8CuRPvqBxYtuNXbFKcR5rqBLLz7MjPt0BbZIRRo0WdLh82fRLs+/k4ZKLk1ZT4Yy6O1FPT6IujzTMzqT/HGUv1nzp0eOnO1JAsR+rinPuZiYrOPonqLOS57chRH8TevbUo01D16IrRSOSgwxCJK6ZgXK2ZjW/rZuGa1Q+kjYfvW7i40ep7ne5oeNbIL6mTsi9gW95pKNVtUBc1QKOpwn5dGarLC3GxYiN+Mkfgds183LcEo8sahB6bP3rtfAwc5qK3nbORVv0TUdpF1jplx+OtueeRvvskVIV2FJTUQ1tqgpHQotm4EzeMi3GrKhx36+bhgXUuum2B6LEL0NfGQ/8x38u0anhWbe/Yu0H1OZm66wyZuecomVfSRBZpa0h9OUGaK4rJL43rcbN6EX6xhOF3awge2mbjcWsAnrb5oe84F49PcUJp1ctz2SCM+64qGj/URuK3A6G4Z5uLR/YgONoEcB7jwXlqZiO9+vKcIaLHfG2KJa/VLMaPlnDcts3DHy1z8NfhQDxp96Pk3O77Z9gz6PWXp7MiTnG1MhbX66Lwc8MC3GkOwYNDb6GrPQA9J/lwnPbNo1dHRqdJFPVNbYyItEaKbjWFie62vi3680iQqPu4v+jpJzzRg3PssfTq/wGD8Tedsdp6457pjwAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABhmlDQ1BJQ0MgcHJvZmlsZQAAKM+VkTtIw1AUhv+mSkUqDhZ84JChCoIFURFHiWIRLJS2QqsOJjd9QZOGJMXFUXAtOPhYrDq4OOvq4CoIgg8QZwcnRRcp8dyk0CJU8MDlfvz3/j/nngsItRLTrI4JQNNtMxGVxHRmVQy8wodB9EPAmMwsI5ZcTKFtfd3Tbaq7CM/C/6pHzVoM8InEc8wwbeIN4plN2+C8TxxiBVklPiceN6lB4keuKx6/cc67LPDMkJlKzBOHiMV8CystzAqmRjxNHFY1nfKFtMcq5y3OWqnCGn3yFwaz+kqS67SGEcUSYohDhIIKiijBRoR2nRQLCTqX2viHXH+cXAq5imDkWEAZGmTXD/4Hv2dr5aYmvaSgBHS+OM7HCBDYBepVx/k+dpz6CeB/Bq70pr9cA2Y/Sa82tfAR0LsNXFw3NWUPuNwBBp4M2ZRdyU9LyOWA9zP6pgzQdwt0r3lza5zj9AFI0ayWb4CDQ2A0T9nrbd7d1Tq3P++484P0A3o2cqrMnZbPAAAACXBIWXMAAAsOAAALDgFAvuFBAAAAB3RJTUUH6AEZFwkM569AfQAABNpJREFUSEu9kntMU3cYhguoOOZ1ujmFXqQtBcEpIwoTxOGQolLwUp24OFS0sEqh0oIV0CIg1FLKsbTlNooFKhRF8TajziW6zYFxcckW9bhlm9uiLk6nAyuWy7tTc0iI4w9l2Z7k++/7nveX9xzGfw+LWMhgV4hd48Y2iN1ZBvEoFiH2ZOrFXkydeJzPvsn05ghhmxIZnCq4xo1TCXe2GaPZJniyKvAqi8AEps5Eb/4LOJVfDQZ4PAswYizLgHHMckxi6vqmeJfMpjdHCNscQgUMDAaMoQJeoQLGUwGTfXR43bvkM3pz5LhxzHXuVMAoqp4x7Ap4sfZT9ejxmk8ppnlrEDE142bCxA3k2vHryKSZYnJrcPxS+vTFcGMR09w55keuAFf/Xs/612OKjxZvepdAMF2NFROT8IHv+5CEroZskeiaJC7Cgz5/MTzYRsVg/64PPJFZhqlUwHTvYrBmFGBZsAybw9ZCGr0SyhXLoVobk0Gfvhju/CJPD2GnY7SwE57CDngJL2FCzBeYsuQC/OM/Rdiq45AsWQP5ygSoEpdi94fRDyslc6SWNH9pvVwgtWb7SQ/k8CfRumHY2ithpACD45YyAA9JP3ykPQiQdSNh4zlsS1gFZaIIuZuEKEx5DwZZKKyZAWhUCdC0i5o9fIK2Pcfm7gmMlIF7zwd4b3MiMMOBhdvvQLJ6C+TrV0CVvBz5qTEoTo+CThmBAzlBaNotgK3AD80av97mUt4s2joESX/ZULlr3pD2I1Deg/nKLiQmN0O2Xoys5HjsksaiUB6Nfcp3UZ67ANX5IThYRMn38dFSxoed4J+lrTRbngio1zuHyid9NABeei+CFQ5EZ91FcsZZyBTtUGUfRGFuLXRqAuaCEtQX51GvlqCllBLr+Wg18HDIzIO9xnc5baeQ9J0YKncNU9aPOYoeLNzZhXWZV5CiOI3MHW3Iy21AsboSRIEe1ZpCNGh3okUXjhaCkhspeRUPh2u5aLNwb1isM0a7Xi98Xj49rR8CuRPvqBxYtuNXbFKcR5rqBLLz7MjPt0BbZIRRo0WdLh82fRLs+/k4ZKLk1ZT4Yy6O1FPT6IujzTMzqT/HGUv1nzp0eOnO1JAsR+rinPuZiYrOPonqLOS57chRH8TevbUo01D16IrRSOSgwxCJK6ZgXK2ZjW/rZuGa1Q+kjYfvW7i40ep7ne5oeNbIL6mTsi9gW95pKNVtUBc1QKOpwn5dGarLC3GxYiN+Mkfgds183LcEo8sahB6bP3rtfAwc5qK3nbORVv0TUdpF1jplx+OtueeRvvskVIV2FJTUQ1tqgpHQotm4EzeMi3GrKhx36+bhgXUuum2B6LEL0NfGQ/8x38u0anhWbe/Yu0H1OZm66wyZuecomVfSRBZpa0h9OUGaK4rJL43rcbN6EX6xhOF3awge2mbjcWsAnrb5oe84F49PcUJp1ctz2SCM+64qGj/URuK3A6G4Z5uLR/YgONoEcB7jwXlqZiO9+vKcIaLHfG2KJa/VLMaPlnDcts3DHy1z8NfhQDxp96Pk3O77Z9gz6PWXp7MiTnG1MhbX66Lwc8MC3GkOwYNDb6GrPQA9J/lwnPbNo1dHRqdJFPVNbYyItEaKbjWFie62vi3680iQqPu4v+jpJzzRg3PssfTq/wGD8Tedsdp6457pjwAAAABJRU5ErkJggg== 08fe15ed-12b6-4c72-a8ba-350c0da17df3 + true true false true @@ -4228,13 +4246,14 @@ - + true Connect a button to open a file dialog to select a cpython file to run. - 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 f703fbba-ff07-4709-8112-cd955660e259 + true btn btn true @@ -4263,14 +4282,15 @@ - + 1 true Pass a list with the name of the custom packages you want to reload. This function is useful if you are developing a i.e. PyPI package and you want to reload the submodules after you modified something. The function will reload the package and all its submodules. If you want to reload the package and all its submodules, just pass the package name. If you want to reload only a submodule, pass the package name and the submodule name separated by a dot. If you want to reload multiple submodules, pass the package - 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 0484038e-7609-494e-abc2-e4c58b9763d1 + true packages_2_reload packages_2_reload true @@ -4279,7 +4299,7 @@ f98c6a9b-86ca-429d-8692-dcc245c0e6e5 1 Pass a list with the name of the custom packages you want to reload. This function is useful if you are developing a i.e. PyPI package and you want to reload the submodules after you modified something. The function will reload the package and all its submodules. If you want to reload the package and all its submodules, just pass the package name. If you want to reload only a submodule, pass the package name and the submodule name separated by a dot. If you want to reload multiple submodules, pass the package - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + 1c282eeb-dd16-439f-94e4-7d92b542fe8b @@ -4299,13 +4319,14 @@ - + true - Converts to collection of text fragments + rhinoscriptsyntax geometry - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAO8SURBVEhL1VVLLJxhFB3ERMT7zXgb71e8X/GId2IhQZTuJGwktjaNxqpYNAQbsWBHiDRsbNgIC4lWYiUs7LSVtLqY6UNNTu+58/9Caaurpie5md/85px7z733+yz/CnYPD4/P8om/iCcSj4OPj8/r+fl57O3tYWdnB9vb29jc3MTa2hoWFxcxMTGB/v5+tLW1oaqqCqmpqZCE3spPrW6G38DLy6tdfvh9YWEBZWVlGqWlpSguLkZhYSHy8/ORk5ODjIwMJU5KSkJWVhb8/Pwcnp6ezwyaX8IaGBj4YWlpCZ2dnZodo7KyEu3t7TBxcnKipGlpaUhJSdFITk6GCDiFw+amegDe3t4v+vr6rkdHR1FdXY3a2loNPs/NzcHlchkSQHNzM9LT05U8MTFRK5HkvolVrwy6e7BHRUV9nZ6eRkNDgxLX19dr8Pns7AwrKysGPTA5Oak22e12FYiLi0NsbCx7wSqK3JS3IN7vdHR0oLe3V225LTAwMIDj4+M7Nh0dHd0RIHl0dDSCg4NdIvLGoL1BW1hY2Jfu7m5tKj2/bdHy8jKmpqa02aenp4YEUFdXd2MRBcQBxMfHQ6bQIZxP3dTSWMn+XXl5ORicFlOElVDo4uICLS0t+m52dtagB8bGxlQgISEBNpsNkZGRKkJBqeKjcPtZpPPPQ0NDv5CcI8hRJBGzpdDQ0JDugjmmXV1dBj1wcHCgzaX/MTExiIiIQEhIiIrKMxf1pUWUPmVmZupsMyhSUFCAoqIijY2NDQwPD+t35g6cn58bEtBKTf/Dw8PZAxXKy8vjdn+iwEsZL2dubi5MIT6TjBU4HA6D6mGMjIxo9rRHnEBQUJDySFXuCugT/WKpnAoGlyg7O1szX11d1Wd+x3dcrp6eHoMe2N/fV9+ZPe1hJbRX+urugYGnVqvVwR9z/fnJJTo8PMTg4KA+m+/oL0fz8vJSBa6vr7VaM3tWLRZxF26mSMHZpXdceZKMj48rAQX4N4NVmku1u7ur74mZmRklp3BJSYlL6O7tAVHKs4QEXCITTqdTjwmOIonZo/X1dVxdXRn/4cbW1haampoQEBBA7+9vMiFVvBIfvzFbTsbt4JyzmfSYDaXnpi1CqiMsk3MlNL88iwgbq6DfzJbNM4OktNAkZkNl+uDv76/veTdIH39/mhp4JrPs5OTI8XETJinn3Mxa7gD4+vrqeSVVk/yP9wFhFavecywrKipQU1OjBPS3tbVVM+Whx4ORW83zq7Gx8fE3mgHerz/fuX+Kx9/J/xEslh9QdsIn89F0TQAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== 23c12915-418c-45d4-8a9f-82667941634f + true i_export_dir i_export_dir true @@ -4314,7 +4335,7 @@ 78f00f3a-c6ac-40ac-9725-ad949c6e7593 1 - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + 1c282eeb-dd16-439f-94e4-7d92b542fe8b @@ -4334,14 +4355,15 @@ - + 1 true A generic x input. - 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 770c2c41-936b-4563-8085-69258fb43fe4 + true i_breps i_breps true @@ -4370,13 +4392,14 @@ - + true - Converts to collection of text fragments + rhinoscriptsyntax geometry - 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 c87fd4ae-11b7-4647-804e-d9cf678a79b3 + true i_assembly_name i_assembly_name true @@ -4385,7 +4408,7 @@ c4486e03-f65b-4cbb-aaea-81fdbdcd7cf0 1 - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88 + 1c282eeb-dd16-439f-94e4-7d92b542fe8b @@ -4405,13 +4428,14 @@ - + true Converts to collection of boolean values iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC de47b8a3-cb7b-43e4-b958-28f86271d143 + true i_dump i_dump true @@ -4440,13 +4464,14 @@ - + false The redirected standard output of the component scriptsync. - iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAWJQAAFiUBSVIk8AAABBNJREFUSEvVVVsorWkYXshKcj6znM/n81nORCiFTFxRLtw4JFe2JDQy2pLkggunwo22K0opCZHsRHEhKWXPTBp2sazN0DPf8631r+wxe9tzNc1bb+tvrfU/z/s+7/N+n+q/Cj8TE5Mv4hP/In8S+WNhYWHxcWJiAltbW9jY2MDa2hpWVlawuLiIqakpDAwMoKGhAaWlpcjIyEBQUBBEQb+KV9V6hO+EmZlZuXjxz8nJSaSkpMhMTk5GYmIi4uPjERMTg8jISISGhkpgPz8/hIeHw8rK6s7U1PSdAeaboba1tf1jfn4elZWVsjpmenq6JCJJXFwcoqKiJGhwcDACAgJk+vv7QxBoBYZGD/UPYW5u/nN9ff1Td3c3MjMz0djYiP7+fszNzWFzcxPT09NISEiQXURERCAnJ0f+trq6itraWojiHoRUHwxwr8LPzc3ty8jICPLz85Gbm4u6ujqMjo7i6uoK19fX8rOsrAyxsbEoLCzE0dERzs/PcXh4iPHxcXh6enIW7CJBD/kihPYbFRUVqKmpkbJkZ2cjLy9P5v7+Pm5vb3F/fy+BkpKSsL29jYWFBdAMy8vLUlJ3d3fY29s/C5KPBlhjlDo5Oemqq6ul1tScEpGE2dfXB51Oh4eHB5ycnEiStrY2hISESP19fX1l9UIBeHt7Q7jwTmDW6qHFYEX1v6WmpoLJQSokypCLiookwdPTE56fn7G0tPTVkH18fKDRaODq6ipJSCi6uBbYViox+S5HR0cdwTk8WpEktOZLm+7t7UlwRk9Pz1c29fLygoeHB1xcXODg4CBJxfO9IHivEkyfw8LCpLeZJKEV6ZaXOTw8bOxgfX3dWL0iD/V3dnbmDCRRdHQ0t/szCd4Le2npbYWIzySiW5h85hZzBo+Pj3LYJH1ZPeURSsDOzk7iiO/ZwS8iVVbUi39m20zqS58rXXV1daG3txenp6cSXKvVorOzUw6U2rNjVk952AklFXPVz8AQtWq1+o5tM1taWjA2Nob29nYMDQ1hZmZGfj84OIibmxu5E8fHx7KYkpIStLa2GqvnzIRE3AWji2TQu9SO1mtubpYbysNudnbWaEfKcnZ2hsvLS1xcXODg4AA8s1g9wQMDA7kjzwLu1R4wknmWcGhZWVnS501NTcZB0orUm4u4u7uLnZ0ddHR0KMsl5eF229jYUPvXm8wQXXwQf3wgKJ3xMqk1h0lADpRVK7IIUGlv4ZxHAfPNs4ihYRfUm9VyaZQkKCVUgFmxcB+sra3l77wbxBy/f5oa4p1oWUsXiePDmAoo5VCqFncALC0t5Xkluib4m/cBQy2k+p1WTUtLk/MgAPUtLi6WlZaXl4MHY1VVFXh+FRQU8Gj4xHf1EG8H79e/37lv5Y/fyf+jUKn+AkB0rPmebpkgAAAAAElFTkSuQmCC 99e48b23-64d9-4e2f-859d-62348fa491ae + true stdout stdout false @@ -4474,13 +4499,14 @@ - + false Generic example output of the component - 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 58680e01-bd51-44b8-bac4-82d9b43f37b0 + true o_xml o_xml false @@ -4508,13 +4534,14 @@ - + false rhinoscriptsyntax geometry iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== d9399b7b-ece0-4d60-ba8e-0bb8c0bdf01a + true o_joints o_joints false @@ -4542,13 +4569,14 @@ - + false rhinoscriptsyntax geometry iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== 8051ced1-c685-4aac-b373-3da1f25a7345 + true o_sides o_sides false @@ -4580,7 +4608,7 @@ false - ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKY2xhc3MgRmlsZUNoYW5nZWRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICAgICAgQSB0aHJlYWQgdG8gY2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQgb24gZGlzay4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICBwYXRoIDogc3RyLAogICAgICAgICAgICAgICAgbmFtZSA6IHN0cgogICAgICAgICAgICAgICAgKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5yZWZyZXNoX3JhdGUgPSAxMDAwICAjIG1pbGxpc2Vjb25kcwogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZCA9IHRocmVhZGluZy5FdmVudCgpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQgb24gZGlzay4KICAgICAgICAiIiIKICAgICAgICBsYXN0X21vZGlmaWVkID0gb3MucGF0aC5nZXRtdGltZShzZWxmLnBhdGgpCiAgICAgICAgd2hpbGUgc2VsZi5jb21wb25lbnRfb25fY2FudmFzIGFuZCBub3Qgc2VsZi5fb25fZmlsZV9jaGFuZ2VkLmlzX3NldCgpOgogICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChzZWxmLnJlZnJlc2hfcmF0ZSkKICAgICAgICAgICAgbGFzdF9tb2RpZmllZCA9IHNlbGYuaXNfZmlsZV9tb2RpZmllZChsYXN0X21vZGlmaWVkKQogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHN0b3Aoc2VsZik6CiAgICAgICAgIiIiIFN0b3AgdGhlIHRocmVhZC4gIiIiCiAgICAgICAgc2VsZi5fb25fZmlsZV9jaGFuZ2VkLnNldCgpCgogICAgZGVmIGlzX2ZpbGVfbW9kaWZpZWQoc2VsZiwgbGFzdF9tb2RpZmllZCk6CiAgICAgICAgY3VycmVudF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIGlmIGN1cnJlbnRfbW9kaWZpZWQgIT0gbGFzdF9tb2RpZmllZDoKICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbW9kaWZpZWQKICAgICAgICByZXR1cm4gbGFzdF9tb2RpZmllZAoKCmNsYXNzIFNjcmlwdFN5bmNDUHkoY29tcG9uZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTY3JpcHRTeW5jQ1B5LCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fdmFyX291dHB1dCA9IFtdCgogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IEZhbHNlCgogICAgICAgIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIDogc3RyID0gZiJzY3JpcHQtc3luYy1jbGllbnQtdGhyZWFkOjp7Z2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZH0iCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX2lwID0gIjEyNy4wLjAuMSIKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCA9IDU4MjYwCiAgICAgICAgc2VsZi5zdGRvdXQgPSBOb25lCiAgICAgICAgc2VsZi5xdWV1ZV9tc2cgPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnID0gdGhyZWFkaW5nLkV2ZW50KCkKCiAgICAgICAgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtZmlsZUNoYW5nZWQtdGhyZWFkOjp7Z2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZH0iCiAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSA9ICJzY3JpcHQtc3luYzo6IiArICJwYXRoOjoiICsgc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpCiAgICAgICAgaWYgc2VsZi5wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gInNlbGVjdC1zY3JpcHQiCgogICAgZGVmIFJlbW92ZWRGcm9tRG9jdW1lbnQoc2VsZiwgZG9jKToKICAgICAgICAiIiIgUmVtb3ZlIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgZG9jdW1lbnQuICIiIgogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgY2xpZW50X3RocmVhZCA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5jbGllbnRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGNsaWVudF90aHJlYWQuam9pbigpCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZCA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0KICAgICAgICAgICAgZmlsZWNoYW5nZWRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYucXVldWVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZ19sb2NrIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZ19sb2NrLnJlbGVhc2UoKQogICAgICAgIGlmIHNlbGYuZXZlbnRfZmlyZV9tc2cgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAjIGNsZWFyIHRoZSBwYXRoIGZyb20gdGhlIHRhYmxlIHZpZXcKICAgICAgICBkZWwgc2VsZi5wYXRoCgogICAgZGVmIGluaXRfc2NyaXB0X3BhdGgoc2VsZiwgYnRuIDogYm9vbCA9IEZhbHNlKToKICAgICAgICAiIiIKICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCBsb2FkL2NoYW5nZSBwYXRoIHNjcmlwdC4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBidG46IEEgYm9vbGVhbiBvZiB0aGUgYnV0dG9uCiAgICAgICAgIiIiCiAgICAgICAgIyBjaGVjayBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIGlmIGJ0biBpcyBUcnVlOgogICAgICAgICAgICBkaWFsb2cgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5PcGVuRmlsZURpYWxvZygpCiAgICAgICAgICAgIGRpYWxvZy5GaWx0ZXIgPSAiUHl0aG9uIGZpbGVzICgqLnB5KXwqLnB5IgogICAgICAgICAgICBkaWFsb2cuVGl0bGUgPSAiU2VsZWN0IGEgUHl0aG9uIGZpbGUiCiAgICAgICAgICAgIGRpYWxvZy5Jbml0aWFsRGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKCIiKQogICAgICAgICAgICBkaWFsb2cuRmlsZU5hbWUgPSAiIgogICAgICAgICAgICBkaWFsb2cuTXVsdGlzZWxlY3QgPSBGYWxzZQogICAgICAgICAgICBkaWFsb2cuQ2hlY2tGaWxlRXhpc3RzID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuQ2hlY2tQYXRoRXhpc3RzID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuUmVzdG9yZURpcmVjdG9yeSA9IFRydWUKICAgICAgICAgICAgaWYgZGlhbG9nLlNob3dEaWFsb2coKSA9PSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EaWFsb2dSZXN1bHQuT0s6CiAgICAgICAgICAgICAgICBzZWxmLnBhdGggPSBkaWFsb2cuRmlsZU5hbWUKCiAgICAgICAgIyBkZWZhdWx0IGluaXQgc3RhdXRzCiAgICAgICAgaWYgc2VsZi5wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0LXN5bmM6OkZpbGUgbm90IHNlbGVjdGVkIikKCiAgICAgICAgIyBmaSBmaWxlIGlzIGluIHRhYmxlIHZpZXcgYmVmb3JlCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYucGF0aCk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0LXN5bmM6OkZpbGUgZG9lcyBub3QgZXhpc3QiKQogICAgCiAgICBkZWYgcmVsb2FkX2FsbF9tb2R1bGVzKHNlbGYsIGRpcmVjdG9yeSk6CiAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KToKICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpIGFuZCBmaWxlbmFtZSAhPSAnX19pbml0X18ucHknOgogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgPSBmaWxlbmFtZVs6LTNdICAjIHJlbW92ZSAnLnB5JyBmcm9tIGZpbGVuYW1lCiAgICAgICAgICAgICAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBpbXBvcnRsaWIucmVsb2FkKHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXSkKCiAgICBkZWYgc2FmZV9leGVjKHNlbGYsIHBhdGgsIGdsb2JhbHMsIGxvY2FscywgcGFja2FnZXNfMl9yZWxvYWQpOgogICAgICAgICIiIgogICAgICAgICAgICBFeGVjdXRlIFB5dGhvbjMgY29kZSBzYWZlbHkuIEl0IHJlZGlyZWN0cyB0aGUgb3V0cHV0IG9mIHRoZSBjb2RlCiAgICAgICAgICAgIHRvIGEgc3RyaW5nIGJ1ZmZlciAnc3Rkb3V0JyB0byBvdXRwdXQgdG8gdGhlIEdIIGNvbXBvbmVudCBwYXJhbS4KICAgICAgICAgICAgSXQgaXMgc2VuZCB0byB0aGUgdnNjb2RlIHNlcnZlci4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBleGVjdXRlLgogICAgICAgICAgICA6cGFyYW0gZ2xvYmFsczogVGhlIGdsb2JhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIGxvY2FsczogVGhlIGxvY2FscyBkaWN0aW9uYXJ5LgogICAgICAgICAgICA6cGFyYW0gcGFja2FnZXNfMl9yZWxvYWQ6IFRoZSBsaXN0IG9mIHBhY2thZ2VzIHRvIHJlbG9hZCwgdGhpcyBpcyB1c2VkIGZvciBjdXN0b20gcGFja2FnZXMgZGV2ZWxvcGVtZW50LgogICAgICAgICAgICBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSB2aWEgYW4gZWRpdGFibGUgcGlwIGluc3RhbGxhdGlvbiBmb3IgZXhhbXBsZS4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAncicpIGFzIGY6CiAgICAgICAgICAgICAgICAjIHJlbG9hZCB0aGUgc3BlY2lmeWVkIHBhY2thZ2VzCiAgICAgICAgICAgICAgICBpZiBwYWNrYWdlc18yX3JlbG9hZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBpZiBwYWNrYWdlc18yX3JlbG9hZC5fX2xlbl9fKCkgIT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBhY2thZ2UgaW4gcGFja2FnZXNfMl9yZWxvYWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGxpc3Qoc3lzLm1vZHVsZXMua2V5cygpKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwYWNrYWdlIGluIGtleToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLnJlbG9hZChzeXMubW9kdWxlc1trZXldKQoKICAgICAgICAgICAgICAgICMgYWRkIHRoZSBwYXRoIGFuZCBzdWIgZGlyZWN0b3JpZXMgdG8gIHRoZSBzeXMgcGF0aAogICAgICAgICAgICAgICAgcGF0aF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgICAgICAgICAgICAgIHN1Yl9kaXJzID0gW10KICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGhfZGlyKToKICAgICAgICAgICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgICAgICAgICBzdWJfZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc3lzLnBhdGguZXh0ZW5kKFtwYXRoX2Rpcl0gKyBzdWJfZGlycykKCiAgICAgICAgICAgICAgICAjIHJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgYWxzbyBvZiB0aGUgc3ViIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMob3MucGF0aC5qb2luKHJvb3QsIGQpKQogICAgICAgICAgICAgICAgc2VsZi5yZWxvYWRfYWxsX21vZHVsZXMocGF0aF9kaXIpCgogICAgICAgICAgICAgICAgIyByZWZyZXNoIHRoZSBweXRob24gaW50ZXJwcmV0ZXIKICAgICAgICAgICAgICAgIGltcG9ydGxpYi5pbnZhbGlkYXRlX2NhY2hlcygpCgogICAgICAgICAgICAgICAgIyBwYXJzZSB0aGUgY29kZQogICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIHBhdGgsICdleGVjJykKICAgICAgICAgICAgICAgIG91dHB1dCA9IGlvLlN0cmluZ0lPKCkKCiAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBxdWV1ZSBhbmQgZXZlbnQKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5xdWV1ZV9tc2dfbG9jazoKICAgICAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWV1ZV9tc2cuZW1wdHkoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cuZ2V0KCkKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAgICAgICAgICMgZXhlY3V0ZSB0aGUgY29kZQogICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZG91dChvdXRwdXQpOgogICAgICAgICAgICAgICAgICAgIGV4ZWMoY29kZSwgZ2xvYmFscywgbG9jYWxzKQogICAgICAgICAgICAgICAgbG9jYWxzWyJzdGRvdXQiXSA9IG91dHB1dC5nZXR2YWx1ZSgpCgogICAgICAgICAgICAgICAgIyBzZW5kIHRoZSBtc2cgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIG1zZ19qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiBvdXRwdXQuZ2V0dmFsdWUoKX0pCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IG1zZ19qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KG1zZ19qc29uKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQoKICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2NyaXB0IHZhcmlhYmxlcyB0byB0aGUgR0ggY29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgICAgIG91dHBhcmFtID0gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXQKICAgICAgICAgICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgICAgICAgICBmb3Igb3V0cCBpbiBvdXRwYXJhbV9uYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBvdXRwIGluIGxvY2Fscy5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKGxvY2Fsc1tvdXRwXSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChOb25lKQoKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwogICAgICAgICAgICByZXR1cm4gbG9jYWxzCgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKCiAgICAgICAgICAgICMgc2VuZCB0aGUgZXJyb3IgbWVzc2FnZSB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICBlcnJfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogImVycjoiICsgc3RyKGUpfSkKICAgICAgICAgICAgZXJyX2pzb24gPSBlcnJfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cucHV0KGVycl9qc29uKQogICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCiAgICAgICAgICAgIAogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KCiAgICAgICAgICAgIGVycl9tc2cgPSBmInNjcmlwdC1zeW5jOjpFcnJvciBpbiB0aGUgY29kZToge3N0cihlKX0iCiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihlcnJfbXNnKQoKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgYnRuOiBib29sLAogICAgICAgICAgICBwYWNrYWdlc18yX3JlbG9hZDogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3Rbc3RyXSwKICAgICAgICAgICAgaV9leHBvcnRfZGlyOiBzdHIsCiAgICAgICAgICAgIGlfYnJlcHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0W1JoaW5vLkdlb21ldHJ5LkJyZXBdLAogICAgICAgICAgICBpX2Fzc2VtYmx5X25hbWU6IHN0ciwKICAgICAgICAgICAgaV9kdW1wOiBib29sKToKICAgICAgICAiIiIgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaGFzIHRvIGJlIHJlY2FsY3VsYXRlZCBpdCdzIHRoZSBzb2x2ZSBtYWluIGluc3RhbmNlLiAiIiIKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHJlcyA9IHNlbGYuc2FmZV9leGVjKHNlbGYucGF0aCwgTm9uZSwgZ2xvYmFscygpLCBwYWNrYWdlc18yX3JlbG9hZCkKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBUcnVlCiAgICAgICAgcmV0dXJuCgogICAgZGVmIEFmdGVyUnVuU2NyaXB0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgY29tcG9uZW50IGhhcyBmaW5pc2hlZAogICAgICAgICAgICBpdHMgY2FsY3VsYXRpb24uIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUgR0hDb21wb25lbnQgb3V0cHV0cwogICAgICAgICAgICB3aXRoIHRoZSB2YWx1ZXMgY3JlYXRlZCBpbiB0aGUgc2NyaXB0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmlzX3N1Y2Nlc3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIG91dHBhcmFtID0gW3AgZm9yIHAgaW4gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRdCiAgICAgICAgb3V0cGFyYW1fbmFtZXMgPSBbcC5OaWNrTmFtZSBmb3IgcCBpbiBvdXRwYXJhbV0KICAgICAgICAKICAgICAgICAjIFRPRE86IGFkZCB0aGUgY29udmVyc2lvbiB0byBkYXRhdHJlZSBmb3IgbmVzdGVkIGxpc3RzIGFuZCB0dXBsZXMKICAgICAgICBmb3IgaWR4LCBvdXRwIGluIGVudW1lcmF0ZShvdXRwYXJhbSk6CiAgICAgICAgICAgICMgZGV0ZWN0IGlmIHRoZSBvdXRwdXQgaXMgYSBsaXN0CiAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSBsaXN0IG9yIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSB0dXBsZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhTGlzdChnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YShnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCAwLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgc2VsZi5fdmFyX291dHB1dC5jbGVhcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIHRhYmxlX3ZhbHVlID0gZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5HZXRWYWx1ZSgKICAgICAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgIm5vdF9mb3VuZCIKICAgICAgICApCiAgICAgICAgaWYgdGFibGVfdmFsdWUgIT0gIm5vdF9mb3VuZCI6CiAgICAgICAgICAgIHJldHVybiB0YWJsZV92YWx1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgQHBhdGguc2V0dGVyCiAgICBkZWYgcGF0aChzZWxmLCBwYXRoIDogc3RyKToKICAgICAgICAiIiIgU2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLlNldFZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsIHBhdGgpCgogICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gZiJ7c2NyaXB0X25hbWV9IgoKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgXyA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0uc3RvcCgpCgogICAgQHBhdGguZGVsZXRlcgogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIERlbGV0ZSB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IGlmIHRoZSBvYmplY3QgaXMgZXJhc2VkLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkRlbGV0ZVZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUpCg== + ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgaW5zcGVjdAppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKY2xhc3MgRmlsZUNoYW5nZWRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICAgICAgQSB0aHJlYWQgdG8gY2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQgb24gZGlzay4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICBwYXRoIDogc3RyLAogICAgICAgICAgICAgICAgbmFtZSA6IHN0cgogICAgICAgICAgICAgICAgKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5yZWZyZXNoX3JhdGUgPSAxMDAwICAjIG1pbGxpc2Vjb25kcwogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZCA9IHRocmVhZGluZy5FdmVudCgpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQgb24gZGlzay4KICAgICAgICAiIiIKICAgICAgICBsYXN0X21vZGlmaWVkID0gb3MucGF0aC5nZXRtdGltZShzZWxmLnBhdGgpCiAgICAgICAgd2hpbGUgc2VsZi5jb21wb25lbnRfb25fY2FudmFzIGFuZCBub3Qgc2VsZi5fb25fZmlsZV9jaGFuZ2VkLmlzX3NldCgpOgogICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChzZWxmLnJlZnJlc2hfcmF0ZSkKICAgICAgICAgICAgbGFzdF9tb2RpZmllZCA9IHNlbGYuaXNfZmlsZV9tb2RpZmllZChsYXN0X21vZGlmaWVkKQogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHN0b3Aoc2VsZik6CiAgICAgICAgIiIiIFN0b3AgdGhlIHRocmVhZC4gIiIiCiAgICAgICAgc2VsZi5fb25fZmlsZV9jaGFuZ2VkLnNldCgpCgogICAgZGVmIGlzX2ZpbGVfbW9kaWZpZWQoc2VsZiwgbGFzdF9tb2RpZmllZCk6CiAgICAgICAgY3VycmVudF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIGlmIGN1cnJlbnRfbW9kaWZpZWQgIT0gbGFzdF9tb2RpZmllZDoKICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbW9kaWZpZWQKICAgICAgICByZXR1cm4gbGFzdF9tb2RpZmllZAoKCmNsYXNzIFNjcmlwdFN5bmNDUHkoY29tcG9uZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTY3JpcHRTeW5jQ1B5LCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fdmFyX291dHB1dCA9IFtdCgogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IEZhbHNlCgogICAgICAgIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIDogc3RyID0gZiJzY3JpcHQtc3luYy1jbGllbnQtdGhyZWFkOjp7Z2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZH0iCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX2lwID0gIjEyNy4wLjAuMSIKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCA9IDU4MjYwCiAgICAgICAgc2VsZi5zdGRvdXQgPSBOb25lCiAgICAgICAgc2VsZi5xdWV1ZV9tc2cgPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnID0gdGhyZWFkaW5nLkV2ZW50KCkKCiAgICAgICAgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtZmlsZUNoYW5nZWQtdGhyZWFkOjp7Z2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZH0iCiAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSA9ICJzY3JpcHQtc3luYzo6IiArICJwYXRoOjoiICsgc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpCiAgICAgICAgaWYgc2VsZi5wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gInNlbGVjdC1zY3JpcHQiCgogICAgZGVmIFJlbW92ZWRGcm9tRG9jdW1lbnQoc2VsZiwgZG9jKToKICAgICAgICAiIiIgUmVtb3ZlIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgZG9jdW1lbnQuICIiIgogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgY2xpZW50X3RocmVhZCA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5jbGllbnRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGNsaWVudF90aHJlYWQuam9pbigpCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZCA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0KICAgICAgICAgICAgZmlsZWNoYW5nZWRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYucXVldWVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZ19sb2NrIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZ19sb2NrLnJlbGVhc2UoKQogICAgICAgIGlmIHNlbGYuZXZlbnRfZmlyZV9tc2cgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAjIGNsZWFyIHRoZSBwYXRoIGZyb20gdGhlIHRhYmxlIHZpZXcKICAgICAgICBkZWwgc2VsZi5wYXRoCgogICAgZGVmIGluaXRfc2NyaXB0X3BhdGgoc2VsZiwgYnRuIDogYm9vbCA9IEZhbHNlKToKICAgICAgICAiIiIKICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCBsb2FkL2NoYW5nZSBwYXRoIHNjcmlwdC4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBidG46IEEgYm9vbGVhbiBvZiB0aGUgYnV0dG9uCiAgICAgICAgIiIiCiAgICAgICAgIyBjaGVjayBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIGlmIGJ0biBpcyBUcnVlOgogICAgICAgICAgICBkaWFsb2cgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5PcGVuRmlsZURpYWxvZygpCiAgICAgICAgICAgIGRpYWxvZy5GaWx0ZXIgPSAiUHl0aG9uIGZpbGVzICgqLnB5KXwqLnB5IgogICAgICAgICAgICBkaWFsb2cuVGl0bGUgPSAiU2VsZWN0IGEgUHl0aG9uIGZpbGUiCiAgICAgICAgICAgIGRpYWxvZy5Jbml0aWFsRGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKCIiKQogICAgICAgICAgICBkaWFsb2cuRmlsZU5hbWUgPSAiIgogICAgICAgICAgICBkaWFsb2cuTXVsdGlzZWxlY3QgPSBGYWxzZQogICAgICAgICAgICBkaWFsb2cuQ2hlY2tGaWxlRXhpc3RzID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuQ2hlY2tQYXRoRXhpc3RzID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuUmVzdG9yZURpcmVjdG9yeSA9IFRydWUKICAgICAgICAgICAgaWYgZGlhbG9nLlNob3dEaWFsb2coKSA9PSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EaWFsb2dSZXN1bHQuT0s6CiAgICAgICAgICAgICAgICBzZWxmLnBhdGggPSBkaWFsb2cuRmlsZU5hbWUKCiAgICAgICAgIyBkZWZhdWx0IGluaXQgc3RhdXRzCiAgICAgICAgaWYgc2VsZi5wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0LXN5bmM6OkZpbGUgbm90IHNlbGVjdGVkIikKCiAgICAgICAgIyBmaSBmaWxlIGlzIGluIHRhYmxlIHZpZXcgYmVmb3JlCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYucGF0aCk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0LXN5bmM6OkZpbGUgZG9lcyBub3QgZXhpc3QiKQogICAgCiAgICBkZWYgcmVsb2FkX2FsbF9tb2R1bGVzKHNlbGYsIGRpcmVjdG9yeSk6CiAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KToKICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpIGFuZCBmaWxlbmFtZSAhPSAnX19pbml0X18ucHknOgogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgPSBmaWxlbmFtZVs6LTNdICAjIHJlbW92ZSAnLnB5JyBmcm9tIGZpbGVuYW1lCiAgICAgICAgICAgICAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBpbXBvcnRsaWIucmVsb2FkKHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXSkKCiAgICBkZWYgZ2V0X3JlbG9hZGFibGVfbW9kdWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgR2V0IGFsbCB0aGUgcmVsb2FkYWJsZSBtb2R1bGVzIGZyb20gdGhlIHN5cy5tb2R1bGVzLiBJdAogICAgICAgICAgICBtYWtlIHN1cmUgdG8gY2hlY2sgdGhlIG1vZHVsZSBzcGVjIGFuZCBsb2FkZXIgdG8gb25seSByZWxvYWQgbW9kdWxlcyAKICAgICAgICAgICAgdGhhdCBhcmUgYWN0dWFsbHkgbG9hZGVkIGZyb20gYSBmaWxlIG9yIGRpcmVjdG9yeQoKICAgICAgICAgICAgOnJldHVybjogVGhlIGxpc3Qgb2YgcmVsb2FkYWJsZSBtb2R1bGVzLgogICAgICAgICIiIgogICAgICAgIEJVSUxUSU5fT1JJR0lOUyA9IFsnYnVpbHQtaW4nLCAnZnJvemVuJ10KICAgICAgICByZWxvYWRhYmxlcyA9IFtdCiAgICAgICAgZm9yIG0gaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6CiAgICAgICAgICAgIGlmIGluc3BlY3QuaXNtb2R1bGUobSk6CiAgICAgICAgICAgICAgICBzcGVjID0gZ2V0YXR0cihtLCAiX19zcGVjX18iLCBOb25lKQogICAgICAgICAgICAgICAgaWYgc3BlYzoKICAgICAgICAgICAgICAgICAgICBpZiBzcGVjLm9yaWdpbiBpbiBCVUlMVElOX09SSUdJTlMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaXNpbnN0YW5jZShzcGVjLmxvYWRlciwgaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VsZXNzRmlsZUxvYWRlcik6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByZWxvYWRhYmxlcy5hcHBlbmQobSkKCiAgICAgICAgcmV0dXJuIHJlbG9hZGFibGVzCgogICAgZGVmIHNhZmVfZXhlYyhzZWxmLCBwYXRoLCBnbG9iYWxzLCBsb2NhbHMsIHBhY2thZ2VzXzJfcmVsb2FkKToKICAgICAgICAiIiIKICAgICAgICAgICAgRXhlY3V0ZSBQeXRob24zIGNvZGUgc2FmZWx5LiBJdCByZWRpcmVjdHMgdGhlIG91dHB1dCBvZiB0aGUgY29kZQogICAgICAgICAgICB0byBhIHN0cmluZyBidWZmZXIgJ3N0ZG91dCcgdG8gb3V0cHV0IHRvIHRoZSBHSCBjb21wb25lbnQgcGFyYW0uCiAgICAgICAgICAgIEl0IGlzIHNlbmQgdG8gdGhlIHZzY29kZSBzZXJ2ZXIuCiAgICAgICAgICAgIAogICAgICAgICAgICA6cGFyYW0gcGF0aDogVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gZXhlY3V0ZS4KICAgICAgICAgICAgOnBhcmFtIGdsb2JhbHM6IFRoZSBnbG9iYWxzIGRpY3Rpb25hcnkuCiAgICAgICAgICAgIDpwYXJhbSBsb2NhbHM6IFRoZSBsb2NhbHMgZGljdGlvbmFyeS4KICAgICAgICAgICAgOnBhcmFtIHBhY2thZ2VzXzJfcmVsb2FkOiBUaGUgbGlzdCBvZiBwYWNrYWdlcyB0byByZWxvYWQsIHRoaXMgaXMgdXNlZCBmb3IgY3VzdG9tIHBhY2thZ2VzIGRldmVsb3BlbWVudC4KICAgICAgICAgICAgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gdmlhIGFuIGVkaXRhYmxlIHBpcCBpbnN0YWxsYXRpb24gZm9yIGV4YW1wbGUuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3InKSBhcyBmOgogICAgICAgICAgICAgICAgIyByZWxvYWQgdGhlIHNwZWNpZnllZCBwYWNrYWdlcwogICAgICAgICAgICAgICAgcGFja2FnZXNfMl9yZWxvYWQgPSBzZWxmLmdldF9yZWxvYWRhYmxlX21vZHVsZXMoKQogICAgICAgICAgICAgICAgIyBpZiBwYWNrYWdlc18yX3JlbG9hZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgICAgIGlmIHBhY2thZ2VzXzJfcmVsb2FkLl9fbGVuX18oKSAhPSAwOgogICAgICAgICAgICAgICAgIyAgICAgICAgIGZvciBwYWNrYWdlIGluIHBhY2thZ2VzXzJfcmVsb2FkOgogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICBmb3Iga2V5IGluIGxpc3Qoc3lzLm1vZHVsZXMua2V5cygpKToKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgIGlmIHBhY2thZ2UgaW4ga2V5OgogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgIGltcG9ydGxpYi5yZWxvYWQoc3lzLm1vZHVsZXNba2V5XSkKCiAgICAgICAgICAgICAgICAjIGFkZCB0aGUgcGF0aCBhbmQgc3ViIGRpcmVjdG9yaWVzIHRvICB0aGUgc3lzIHBhdGgKICAgICAgICAgICAgICAgIHBhdGhfZGlyID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICBzdWJfZGlycyA9IFtdCiAgICAgICAgICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmV4dGVuZChbcGF0aF9kaXJdICsgc3ViX2RpcnMpCgogICAgICAgICAgICAgICAgIyByZWxvYWQgYWxsIHRoZSBtb2R1bGVzIGFsc28gb2YgdGhlIHN1YiBkaXJlY3RvcmllcwogICAgICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOgogICAgICAgICAgICAgICAgICAgIGZvciBkIGluIGRpcnM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKG9zLnBhdGguam9pbihyb290LCBkKSkKICAgICAgICAgICAgICAgIHNlbGYucmVsb2FkX2FsbF9tb2R1bGVzKHBhdGhfZGlyKQoKICAgICAgICAgICAgICAgICMgcmVmcmVzaCB0aGUgcHl0aG9uIGludGVycHJldGVyCiAgICAgICAgICAgICAgICBpbXBvcnRsaWIuaW52YWxpZGF0ZV9jYWNoZXMoKQoKICAgICAgICAgICAgICAgICMgcGFyc2UgdGhlIGNvZGUKICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGYucmVhZCgpLCBwYXRoLCAnZXhlYycpCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBpby5TdHJpbmdJTygpCgogICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgcXVldWUgYW5kIGV2ZW50CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYucXVldWVfbXNnX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLmdldCgpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnRhc2tfZG9uZSgpCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLmNsZWFyKCkKCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUKICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5yZWRpcmVjdF9zdGRvdXQob3V0cHV0KToKICAgICAgICAgICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMsIGxvY2FscykKICAgICAgICAgICAgICAgIGxvY2Fsc1sic3Rkb3V0Il0gPSBvdXRwdXQuZ2V0dmFsdWUoKQoKICAgICAgICAgICAgICAgICMgc2VuZCB0aGUgbXNnIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgICAgICBtc2dfanNvbiA9IGpzb24uZHVtcHMoeyJzY3JpcHRfcGF0aCI6IHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWlkIjogc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXNnIjogb3V0cHV0LmdldHZhbHVlKCl9KQogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBtc2dfanNvbi5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChtc2dfanNvbikKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKCiAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNjcmlwdCB2YXJpYWJsZXMgdG8gdGhlIEdIIGNvbXBvbmVudCBvdXRwdXRzCiAgICAgICAgICAgICAgICBvdXRwYXJhbSA9IGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0CiAgICAgICAgICAgICAgICBvdXRwYXJhbV9uYW1lcyA9IFtwLk5pY2tOYW1lIGZvciBwIGluIG91dHBhcmFtXQogICAgICAgICAgICAgICAgZm9yIG91dHAgaW4gb3V0cGFyYW1fbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgb3V0cCBpbiBsb2NhbHMua2V5cygpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YXJfb3V0cHV0LmFwcGVuZChsb2NhbHNbb3V0cF0pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQoTm9uZSkKCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLl9fc3Rkb3V0X18KICAgICAgICAgICAgcmV0dXJuIGxvY2FscwoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CgogICAgICAgICAgICAjIHNlbmQgdGhlIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICAgICAgZXJyX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6ICJlcnI6IiArIHN0cihlKX0pCiAgICAgICAgICAgIGVycl9qc29uID0gZXJyX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLnB1dChlcnJfanNvbikKICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5zZXQoKQogICAgICAgICAgICAKICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCgogICAgICAgICAgICBlcnJfbXNnID0gZiJzY3JpcHQtc3luYzo6RXJyb3IgaW4gdGhlIGNvZGU6IHtzdHIoZSl9IgogICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oZXJyX21zZykKCiAgICBkZWYgUnVuU2NyaXB0KHNlbGYsCiAgICAgICAgICAgIGJ0bjogYm9vbCwKICAgICAgICAgICAgcGFja2FnZXNfMl9yZWxvYWQ6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0W29iamVjdF0sCiAgICAgICAgICAgIGlfZXhwb3J0X2RpciwKICAgICAgICAgICAgaV9icmVwczogU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSUxpc3RbUmhpbm8uR2VvbWV0cnkuQnJlcF0sCiAgICAgICAgICAgIGlfYXNzZW1ibHlfbmFtZSwKICAgICAgICAgICAgaV9kdW1wOiBib29sKToKICAgICAgICAiIiIgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb21wb25lbnQgaGFzIHRvIGJlIHJlY2FsY3VsYXRlZCBpdCdzIHRoZSBzb2x2ZSBtYWluIGluc3RhbmNlLiAiIiIKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBGYWxzZQoKICAgICAgICAjIHNldCB0aGUgcGF0aCBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIHNlbGYuaW5pdF9zY3JpcHRfcGF0aChidG4pCgogICAgICAgICMgZmlsZSBjaGFuZ2UgbGlzdGVuZXIgdGhyZWFkCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBGaWxlQ2hhbmdlZFRocmVhZChzZWxmLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgc2V0IHVwIHRoZSB0Y3AgY2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIHZzY29kZSBzZXJ2ZXIKICAgICAgICBfID0gW3ByaW50KHQubmFtZSkgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXQogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIG5vdCBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIENsaWVudFRocmVhZChzZWxmLnZzY29kZV9zZXJ2ZXJfaXAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudnNjb2RlX3NlcnZlcl9wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnX2xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cKICAgICAgICAgICAgICAgICAgICAgICAgKS5zdGFydCgpCgogICAgICAgICMgYWRkIHRvIHRoZSBnbG9iYWxzIGFsbCB0aGUgaW5wdXQgcGFyYW1ldGVycyBvZiB0aGUgY29tcG9uZW50ICh0aGUgbG9jYWxzKQogICAgICAgIGdsb2JhbHMoKS51cGRhdGUobG9jYWxzKCkpCgogICAgICAgIHJlcyA9IHNlbGYuc2FmZV9leGVjKHNlbGYucGF0aCwgTm9uZSwgZ2xvYmFscygpLCBwYWNrYWdlc18yX3JlbG9hZCkKICAgICAgICBzZWxmLmlzX3N1Y2Nlc3MgPSBUcnVlCiAgICAgICAgcmV0dXJuCgogICAgZGVmIEFmdGVyUnVuU2NyaXB0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXMgc29vbiBhcyB0aGUgY29tcG9uZW50IGhhcyBmaW5pc2hlZAogICAgICAgICAgICBpdHMgY2FsY3VsYXRpb24uIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUgR0hDb21wb25lbnQgb3V0cHV0cwogICAgICAgICAgICB3aXRoIHRoZSB2YWx1ZXMgY3JlYXRlZCBpbiB0aGUgc2NyaXB0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmlzX3N1Y2Nlc3M6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIG91dHBhcmFtID0gW3AgZm9yIHAgaW4gZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRdCiAgICAgICAgb3V0cGFyYW1fbmFtZXMgPSBbcC5OaWNrTmFtZSBmb3IgcCBpbiBvdXRwYXJhbV0KICAgICAgICAKICAgICAgICAjIFRPRE86IGFkZCB0aGUgY29udmVyc2lvbiB0byBkYXRhdHJlZSBmb3IgbmVzdGVkIGxpc3RzIGFuZCB0dXBsZXMKICAgICAgICBmb3IgaWR4LCBvdXRwIGluIGVudW1lcmF0ZShvdXRwYXJhbSk6CiAgICAgICAgICAgICMgZGV0ZWN0IGlmIHRoZSBvdXRwdXQgaXMgYSBsaXN0CiAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSBsaXN0IG9yIHR5cGUoc2VsZi5fdmFyX291dHB1dFtpZHhdKSA9PSB0dXBsZToKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uVm9sYXRpbGVEYXRhLkNsZWFyKCkKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0W2lkeF0uQWRkVm9sYXRpbGVEYXRhTGlzdChnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YShnaC5LZXJuZWwuRGF0YS5HSF9QYXRoKDApLCAwLCBzZWxmLl92YXJfb3V0cHV0W2lkeF0pCiAgICAgICAgc2VsZi5fdmFyX291dHB1dC5jbGVhcigpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGF0aChzZWxmKToKICAgICAgICAiIiIgR2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIGZyb20gdGhlIHRhYmxlIHZpZXcgdG8gYmUgc3RpY2tpbmcgYmV0d2VlbiB0aGUgc2Vzc2lvbnMuICIiIgogICAgICAgIHRhYmxlX3ZhbHVlID0gZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5HZXRWYWx1ZSgKICAgICAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSwgIm5vdF9mb3VuZCIKICAgICAgICApCiAgICAgICAgaWYgdGFibGVfdmFsdWUgIT0gIm5vdF9mb3VuZCI6CiAgICAgICAgICAgIHJldHVybiB0YWJsZV92YWx1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgQHBhdGguc2V0dGVyCiAgICBkZWYgcGF0aChzZWxmLCBwYXRoIDogc3RyKToKICAgICAgICAiIiIgU2V0IHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLlNldFZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsIHBhdGgpCgogICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQogICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gZiJ7c2NyaXB0X25hbWV9IgoKICAgICAgICBpZiBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgXyA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0uc3RvcCgpCgogICAgQHBhdGguZGVsZXRlcgogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIERlbGV0ZSB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IGlmIHRoZSBvYmplY3QgaXMgZXJhc2VkLiAiIiIKICAgICAgICBnaGVudi5Db21wb25lbnQuT25QaW5nRG9jdW1lbnQoKS5WYWx1ZVRhYmxlLkRlbGV0ZVZhbHVlKHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUpCg== S @@ -4596,6 +4624,695 @@ + + + c9b2d725-6f87-4b07-af90-bd9aefef68eb + 066d0a87-236f-4eae-a0f4-9e42f5327962 + script-sync cpython + + + + + + true + 2 + + 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 + + 6b67286b-4ffe-43c4-921e-806b10a83b8f + true + false + true + script-sync cpython + scsy-cpy + 1 + + false + false + false + + + + + + 236 + 527 + 173 + 124 + + + 351 + 589 + + + + + + 6 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + 2 + 08908df5-fa14-4982-9ab2-1aa0927566aa + 08908df5-fa14-4982-9ab2-1aa0927566aa + + + + + true + Connect a button to open a file dialog to select a cpython file to run. + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC + + f694cce9-2bb5-4c5e-a912-37ca1fe650c9 + btn + btn + true + 0 + true + 37a1fdbe-f895-4bf0-a740-19a73fe2889b + 1 + Connect a button to open a file dialog to select a cpython file to run. + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 238 + 529 + 98 + 20 + + + 288.5 + 539 + + + + + + + + 1 + true + Pass a list with the name of the custom packages you want to reload. This function is useful if you are developing a i.e. PyPI package and you want to reload the submodules after you modified something. The function will reload the package and all its submodules. If you want to reload the package and all its submodules, just pass the package name. If you want to reload only a submodule, pass the package name and the submodule name separated by a dot. If you want to reload multiple submodules, pass the package + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 1facc5d0-c7a9-4cbb-95f5-7d3a7ef123b5 + packages_2_reload + packages_2_reload + true + 1 + true + 0 + Pass a list with the name of the custom packages you want to reload. This function is useful if you are developing a i.e. PyPI package and you want to reload the submodules after you modified something. The function will reload the package and all its submodules. If you want to reload the package and all its submodules, just pass the package name. If you want to reload only a submodule, pass the package name and the submodule name separated by a dot. If you want to reload multiple submodules, pass the package + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 238 + 549 + 98 + 20 + + + 288.5 + 559 + + + + + + + + true + rhinoscriptsyntax geometry + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 6ceb5c7a-499d-4deb-9d2c-d1a955effa73 + i_export_dir + i_export_dir + true + 0 + true + bee0b3ef-7bf0-49f6-8e1d-71c7765756d0 + 1 + + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 238 + 569 + 98 + 20 + + + 288.5 + 579 + + + + + + + + 1 + true + A generic x input. + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAPkSURBVEhL1VVbKOV7FN7ITnK/RYNcNrkrx11SbokHuWQyb0ryRN5ocuLBKadELsktHuTywKBcXgiRUiYvJOVSknNw5LK3OWbO9J31/famOWfPGPN0OqtW+7/r9/vWWt/61vpp/ivTWVhY3MsvfsBfi7/MbGxstvr6+rC+vo7V1VUsLi5ifn4eExMTGBoaQnNzM8rLy5GXl4eUlBQEBQVBEjqTq1ojwjNmZWWVLxc/DQ4OIiEhQXl8fDxiY2MRExOD6OhoREREICQkRAH7+/sjLCwMdnZ2ektLy7cmmG+a1tHR8Y/R0VEUFRWp7OjJyclISkrC8PAwHh4ecHNzg4WFBeTm5iIwMFB5QEAAJIBBMF4Zob5i1tbWv5SVlf3V0NCA1NRUpKWlPTmpOjw8RHd3N3p7e7G0tITb21v138/PT1UiyT0IVe9McGam8/T0/LO9vR0ZGRkKND09HZmZmVhbW4Ner0dnZycmJydRUVGBqqoq1NfX4+joSPWHQby9vdkLVvGTEfILE+5XSUtpaamihQEIzkYT/PLyEgy+ubmJ2tpa1eiBgQG0trbi4OAAXV1d8PLygrOz82cJ8t4E+2R5bm5uH0pKSlRTyTkDPGZO8OPjY4yPj2Nubg4rKysKfHp6Wp3hN+li5b6+vhAV6gXzjRFaGivZ/5aYmAg61cKGkvMvwXd2dlT2LS0tODs7U98E39vbw/7+vurJ7OwshGZFl1RxJdh2Gun8z66urh8ITglSiiMjIzAYDGbgBBkbG0NHRwfOz89xcXGhztB6enpwfX0NFxcXpSp3d3cO6q8aiXQdGhqqtE1nEIJfXV2Zgc/MzIASZrMbGxsVVScnJ9jY2FDKYsXSA3h4eCAqKorTfc0ALSIvQ2RkJB4D3d/fq4tfA+/v70dbWxuamppQWVmJ6upq9X93d1cFcXJyUjjSC2MF5Il8UcecTjozOz09fRa8rq5OSZWS3draUvwLLUpJnHzpq7EHJnuj1Wr1wcHBavwLCgpwd3eH5eXlF4OTFmZPFco3Z+FJRcqkivc8xJFnk3iJFfwIuE6nQ1xc3GeBM5sDWjx3CSVGp6qoEMqVqnkOnI2lerKysuDg4EDuzSeZJlW8k4MPrIBjz3K5BqioqakpNcE1NTXY3t7+R+YCquQtyvkoMN/cRbRXrIK98PHxUUNDz87OVhNM+bI3XBlsqKgP9vb26gzfBunj89vUZG+lZEN4eDhkfTy5DKOigXQ8Zi1vAGxtbdVSlKoJ/t33gKYVqn7nI/K4kwhAfnNyclSm+fn5KCwsRHFxMbi/uBTlzsteNJPxff33m/s9f/mb/D8yjeZvU880QlAx2/0AAAAASUVORK5CYII= + + e86775bd-fb57-4402-a56b-9a1fa88b3782 + i_breps + i_breps + true + 1 + true + a126a588-53d2-4d08-977f-68deff6a42c2 + 1 + A generic x input. + 2ceb0405-fdfe-403d-a4d6-8786da45fb9d + + + + + + 238 + 589 + 98 + 20 + + + 288.5 + 599 + + + + + + + + true + rhinoscriptsyntax geometry + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + 99293e71-3a24-4bb0-a208-4748b642d47c + i_assembly_name + i_assembly_name + true + 0 + true + aedebb31-f342-420e-ac55-d80e788a157f + 1 + + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 238 + 609 + 98 + 20 + + + 288.5 + 619 + + + + + + + + true + Converts to collection of boolean values + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAOsSURBVEhL1VU5S1xhFB0VB5Fx3x0Vl3Hf9w0VXEARVFQM2gmCgvgLBqIWBg0IoqWFdlaS0spGsIwiLmjhgoImRYKFZjSJnNxz5z0Rxy1VyIHLvHnLufeee77vs/wrOLy8vH7IL/4i3km8DX5+fp/n5+exvr6OtbU1rK6uYmVlBcvLy1hcXMTU1BQGBgbQ2tqK6upqpKamQgq6kE+tboYX4OPj0y4f/lpYWEB5eblGWVkZSkpKUFRUhPz8fOTk5CAjI0OJk5KSkJWVBZvNduXt7e00aJ6FNSgo6NvS0hK6urq0OkZVVZUmYpLCwkLk5uYqaVpaGlJSUjSSk5MhCa6Fw+6megK+vr4f+vv7f4+NjaGmpgZ1dXUavGYSdlJcXKxdZGdnIz09XckTExO1EynuVqT6ZNB5wBEdHX0zOzuLhoYGJa6vr0dLSwvm5uawu7sLE9vb25icnERBQQEcDocmiI+PR1xcHGfBLordlA8g2q91dnait7dXZWGCnp4eHB0dGbSeODg40HeZgOQxMTEICQm5kyQbBu09WsPDw10kpNaUg9UfHh4aVJ5wuVz6u7+/r8NmAlEACQkJEBdeCWefm1oGK9V/qaioAIODZJKZmRkleArn5+fo6OjA2dmZ/h8fH4fdbkdUVJQmYUfSxXfhtllk8u/DwsJcJOfwaEUmYftP4eLiAk1NTWrTkZERvbezs4PY2FhERkYiNDRUBy/XXKjTFsl0mZmZqd5mMAmteHNzox8/hEnO92lRDpmgXNQ/IiKCM9BEeXl5XN2XTDAt9rqmt81EvH6cgLKY5LQn3UMSggkojyiB4OBgfUdcxQ4+Slhs1Is+ZtsMLqKHtiQ5rctnrJzkfH9oaEifb21tafWUh51wvchc3TMw0Ge1Wq/4MR3B34mJCf2YnbS1tek9PqO+JGf1p6en+o7T6byvngYRibgW7l2koHepHZc8SVgtLUicnJxgeHhYW+f9wcFBHB8f67O9vT2tmuTsrLS09E7oPNYBUca9hBYzg84ykzwFknNmHCzl4YwCAwOpvedKJqSLT/LiLTvgwmFQjtHRUWxubhq0wMbGhspC77NyIVV7i2w/hebZvYiwswvqzb2Fi8YMuoQScpjUmxWL+xAQEKDPeTbIHF/eTQ04peVr7payfdyHSUo5zKrlDIC/v79uK9I1yV89DwirSPWVVq2srERtba0SUN/m5mattL29HdwYu7u7dUNsbGx8+4lmgOfr4zP3tXj7mfwfwWL5Ayn3+7H9F88PAAAAAElFTkSuQmCC + + 5d5ec1f4-2789-47cb-b7e0-5f1023ada8b4 + i_dump + i_dump + true + 0 + true + 51a09241-6321-4d8b-bfc9-536b009c6410 + 1 + + d60527f5-b5af-4ef6-8970-5f96fe412559 + + + + + + 238 + 629 + 98 + 20 + + + 288.5 + 639 + + + + + + + + false + The redirected standard output of the component scriptsync. + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + eba563ee-7094-4907-b35a-ee3a9d076495 + stdout + stdout + false + 0 + true + 0 + The redirected standard output of the component scriptsync. + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 366 + 529 + 41 + 60 + + + 386.5 + 559 + + + + + + + + false + Generic example output of the component + + iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAQTSURBVEhL1VVbKK1pGF7ISnI+s5zP5/NZzkQohUxcUS7cOCRXtiQ0MtqS5IILp8KNtitKKQmR7ERxISllz0wadrGszdAz3/Ot9a/sMXvbczXNW2/rb631P8/7Pu/zfp/qvwo/ExOTL+IT/yJ/EvljYWFh8XFiYgJbW1vY2NjA2toaVlZWsLi4iKmpKQwMDKChoQGlpaXIyMhAUFAQREG/ilfVeoTvhJmZWbl48c/JyUmkpKTITE5ORmJiIuLj4xETE4PIyEiEhoZKYD8/P4SHh8PKyurO1NT0nQHmm6G2tbX9Y35+HpWVlbI6Znp6uiQiSVxcHKKioiRocHAwAgICZPr7+0MQaAWGRg/1D2Fubv5zfX39U3d3NzIzM9HY2Ij+/n7Mzc1hc3MT09PTSEhIkF1EREQgJydH/ra6uora2lqI4h6EVB8McK/Cz83N7cvIyAjy8/ORm5uLuro6jI6O4urqCtfX1/KzrKwMsbGxKCwsxNHREc7Pz3F4eIjx8XF4enpyFuwiQQ/5IoT2GxUVFaipqZGyZGdnIy8vT+b+/j5ub29xf38vgZKSkrC9vY2FhQXQDMvLy1JSd3d32NvbPwuSjwZYY5Q6OTnpqqurpdbUnBKRhNnX1wedToeHhwecnJxIkra2NoSEhEj9fX19ZfVCAXh7e0O48E5g1uqhxWBF9b+lpqaCyUEqJMqQi4qKJMHT0xOen5+xtLT01ZB9fHyg0Wjg6uoqSUgourgW2FYqMfkuR0dHHcE5PFqRJLTmS5vu7e1JcEZPT89XNvXy8oKHhwdcXFzg4OAgScXzvSB4rxJMn8PCwqS3mSShFemWlzk8PGzsYH193Vi9Ig/1d3Z25gwkUXR0NLf7MwneC3tp6W2FiM8koluYfOYWcwaPj49y2CR9WT3lEUrAzs5O4ojv2cEvIlVW1It/ZttM6kufK111dXWht7cXp6enElyr1aKzs1MOlNqzY1ZPedgJJRVz1c/AELVqtfqObTNbWlowNjaG9vZ2DA0NYWZmRn4/ODiIm5sbuRPHx8eymJKSErS2thqr58yERNwFo4tk0LvUjtZrbm6WG8rDbnZ21mhHynJ2dobLy0tcXFzg4OAAPLNYPcEDAwO5I88C7tUeMJJ5lnBoWVlZ0udNTU3GQdKK1JuLuLu7i52dHXR0dCjLJeXhdtvY2FD715vMEF18EH98ICid8TKpNYdJQA6UVSuyCFBpb+GcRwHzzbOIoWEX1JvVcmmUJCglVIBZsXAfrK2t5e+8G8Qcv3+aGuKdaFlLF4njw5gKKOVQqhZ3ACwtLeV5Jbom+Jv3AUMtpPqdVk1LS5PzIAD1LS4ulpWWl5eDB2NVVRV4fhUUFPBo+MR39RBvB+/Xv9+5b+WP38n/o1Cp/gJAdKz5nm6ZIAAAAABJRU5ErkJggg== + + c98a3826-db80-4996-b56f-4d6ae964153a + a + a + false + 0 + true + 0 + Generic example output of the component + 1c282eeb-dd16-439f-94e4-7d92b542fe8b + + + + + + 366 + 589 + 41 + 60 + + + 386.5 + 619 + + + + + + + + + + false + ZnJvbSBnaHB5dGhvbmxpYi5jb21wb25lbnRiYXNlIGltcG9ydCBleGVjdXRpbmdjb21wb25lbnQgYXMgY29tcG9uZW50CgppbXBvcnQgU3lzdGVtCmltcG9ydCBTeXN0ZW0uRHJhd2luZwppbXBvcnQgU3lzdGVtLldpbmRvd3MuRm9ybXMKaW1wb3J0IFJoaW5vCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgR3Jhc3Nob3BwZXIgYXMgZ2gKZnJvbSBHcmFzc2hvcHBlci5LZXJuZWwgaW1wb3J0IEdIX1J1bnRpbWVNZXNzYWdlTGV2ZWwgYXMgUk1MCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KCmltcG9ydCBhYmMKaW1wb3J0IHNvY2tldAppbXBvcnQgdGhyZWFkaW5nCmltcG9ydCBxdWV1ZQppbXBvcnQganNvbgoKaW1wb3J0IGltcG9ydGxpYgppbXBvcnQgaW5zcGVjdAppbXBvcnQgc3lzCgoKY2xhc3MgR0hUaHJlYWQodGhyZWFkaW5nLlRocmVhZCwgbWV0YWNsYXNzPWFiYy5BQkNNZXRhKToKICAgICIiIgogICAgICAgIEEgYmFzZSBjbGFzcyBmb3IgR3Jhc3Nob3BwZXIgdGhyZWFkcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUgOiBzdHIpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lLCBkYWVtb249RmFsc2UpCiAgICAgICAgc2VsZi5fY29tcG9uZW50X29uX2NhbnZhcyA9IFRydWUKICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIiBSdW4gdGhlIHRocmVhZC4gIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcyhzZWxmKToKICAgICAgICAiIiIgQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBvbiBjYW52YXMgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKToKICAgICAgICAgICAgaWYgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2NvbXBvbmVudF9vbl9jYW52YXMgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X29uX2NhbnZhcykKICAgICAgICBSaGluby5SaGlub0FwcC5JbnZva2VPblVpVGhyZWFkKGFjdGlvbikKCiAgICBkZWYgX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgICIiIiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGVuYWJsZWQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCk6CiAgICAgICAgICAgIGlmIGdoZW52LkNvbXBvbmVudC5Mb2NrZWQ6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IEZhbHNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9jb21wb25lbnRfZW5hYmxlZCA9IFRydWUKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2hlY2tfaWZfY29tcG9uZW50X2VuYWJsZWQpCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGV4cGlyZV9jb21wb25lbnRfc29sdXRpb24oc2VsZik6CiAgICAgICAgIiIiIEZpcmUgdGhlIHJlY2FsY3VsYXRpb24gb2YgdGhlIGNvbXBvbmVudCBzb2x1dGlvbiBmcm9tIHRocmVhZC4gIiIiCiAgICAgICAgZGVmIF9fZXhwaXJlX2NvbXBvbmVudF9zb2x1dGlvbigpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFswXS5DbGVhckRhdGEoKSAgIyBjbGVhciB0aGUgb3V0cHV0CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5FeHBpcmVTb2x1dGlvbihUcnVlKSAgIyBleHBpcmUgdGhlIGNvbXBvbmVudAogICAgICAgIGFjdGlvbiA9IFN5c3RlbS5BY3Rpb24oX19leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBjbGVhcl9jb21wb25lbnQoc2VsZik6CiAgICAgICAgIiIiIENsZWFyIHRoZSBjb21wb25lbnQgZnJvbSB0aHJlYWQuICIiIgogICAgICAgIGRlZiBfX2NsZWFyX2NvbXBvbmVudCgpOgogICAgICAgICAgICBnaGVudi5Db21wb25lbnQuQ2xlYXJEYXRhKCkKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKF9fY2xlYXJfY29tcG9uZW50KQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIGRlZiBhZGRfcnVudGltZV93YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhIHdhcm5pbmcgdGFiIHRvIHRoZSBjb21wb25lbnQgZnJvbSBtYWluIHRocmVhZC4gIiIiCiAgICAgICAgYWN0aW9uID0gU3lzdGVtLkFjdGlvbigKICAgICAgICAgICAgbGFtYmRhOiBnaGVudi5Db21wb25lbnQuQWRkUnVudGltZU1lc3NhZ2UoUk1MLldhcm5pbmcsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX2Vycm9yKHNlbGYsIGV4Y2VwdGlvbiA6IHN0cik6CiAgICAgICAgIiIiIEFkZCBhbiBlcnJvciB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuRXJyb3IsIGV4Y2VwdGlvbikKICAgICAgICApCiAgICAgICAgUmhpbm8uUmhpbm9BcHAuSW52b2tlT25VaVRocmVhZChhY3Rpb24pCgogICAgZGVmIGFkZF9ydW50aW1lX3JlbWFyayhzZWxmLCBleGNlcHRpb24gOiBzdHIpOgogICAgICAgICIiIiBBZGQgYSBibGFuayB0YWIgdG8gdGhlIGNvbXBvbmVudCBmcm9tIG1haW4gdGhyZWFkLiAiIiIKICAgICAgICBhY3Rpb24gPSBTeXN0ZW0uQWN0aW9uKAogICAgICAgICAgICBsYW1iZGE6IGdoZW52LkNvbXBvbmVudC5BZGRSdW50aW1lTWVzc2FnZShSTUwuUmVtYXJrLCBleGNlcHRpb24pCiAgICAgICAgKQogICAgICAgIFJoaW5vLlJoaW5vQXBwLkludm9rZU9uVWlUaHJlYWQoYWN0aW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXBvbmVudF9lbmFibGVkKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9lbmFibGVkKCkKICAgICAgICByZXR1cm4gc2VsZi5fY29tcG9uZW50X2VuYWJsZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb21wb25lbnRfb25fY2FudmFzKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrX2lmX2NvbXBvbmVudF9vbl9jYW52YXMoKQogICAgICAgIHJldHVybiBzZWxmLl9jb21wb25lbnRfb25fY2FudmFzCgpjbGFzcyBDbGllbnRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICBBIHRocmVhZCB0byBjb25uZWN0IHRvIHRoZSBWU0NvZGUgc2VydmVyLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdnNjb2RlX3NlcnZlcl9pcDogc3RyLCB2c2NvZGVfc2VydmVyX3BvcnQ6IGludCwgbmFtZTogc3RyLAogICAgICAgICAgICAgICAgIHF1ZXVlX21zZzogcXVldWUuUXVldWUgPSBOb25lLCBsb2NrX3F1ZXVlX21zZzogdGhyZWFkaW5nLkxvY2sgPSBOb25lLAogICAgICAgICAgICAgICAgIGV2ZW50X2ZpcmVfbXNnOiB0aHJlYWRpbmcuRXZlbnQgPSBOb25lKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfaXAgPSB2c2NvZGVfc2VydmVyX2lwCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX3BvcnQgPSB2c2NvZGVfc2VydmVyX3BvcnQKICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jb25uZWN0X3JlZnJlc2hfcmF0ZSA9IDEgICMgc2Vjb25kcwogICAgICAgIHNlbGYucXVldWVfbXNnID0gcXVldWVfbXNnCiAgICAgICAgc2VsZi5sb2NrX3F1ZXVlX21zZyA9IGxvY2tfcXVldWVfbXNnCiAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZyA9IGV2ZW50X2ZpcmVfbXNnCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIiIiIFJ1biB0aGUgdGhyZWFkLiBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyLiIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgc2VsZi5jb21wb25lbnRfZW5hYmxlZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdF90b192c2NvZGVfc2VydmVyKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2NvbXBvbmVudCgpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cud2FpdCgpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmRfbWVzc2FnZV9mcm9tX3F1ZXVlKCkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3J1bnRpbWVfd2FybmluZyhmInNjcmlwdC1zeW5jOjpVbmtvd24gZXJyb3IgZnJvbSBydW46IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYuaXNfY29ubmVjdGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3NvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKCiAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LmNsb3NlKCkKCiAgICBkZWYgc2VuZF9tZXNzYWdlX2Zyb21fcXVldWUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2tfcXVldWVfbXNnOgogICAgICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZyBhbmQgbm90IHNlbGYucXVldWVfbXNnLmVtcHR5KCk6CiAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgc2VsZi5xdWV1ZV9tc2cudGFza19kb25lKCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQogICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc29ja2V0LnNlbmQobXNnKQoKICAgIGRlZiBjb25uZWN0X3RvX3ZzY29kZV9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiIENvbm5lY3QgdG8gdGhlIFZTQ29kZSBzZXJ2ZXIuICIiIgogICAgICAgIHdoaWxlIHNlbGYuY29tcG9uZW50X29uX2NhbnZhcyBhbmQgbm90IHNlbGYuaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuc2VuZChiIiIpCiAgICAgICAgICAgICAgICBzZWxmLmlzX2Nvbm5lY3RlZCA9IFRydWUKICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zb2NrZXQuY29ubmVjdCgoc2VsZi52c2NvZGVfc2VydmVyX2lwLCBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgKENvbm5lY3Rpb25SZWZ1c2VkRXJyb3IsIENvbm5lY3Rpb25SZXNldEVycm9yLCBzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdGlvbl9lcnJvcihlKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgdGltZS5zbGVlcChzZWxmLmNvbm5lY3RfcmVmcmVzaF9yYXRlKQoKICAgIGRlZiBoYW5kbGVfY29ubmVjdGlvbl9lcnJvcihzZWxmLCBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlcyA9IHsKICAgICAgICAgICAgQ29ubmVjdGlvblJlZnVzZWRFcnJvcjogInNjcmlwdC1zeW5jOjpDb25uZWN0aW9uIHJlZnVzZWQgYnkgdGhlIHZzY29kZSIsCiAgICAgICAgICAgIENvbm5lY3Rpb25SZXNldEVycm9yOiAic2NyaXB0LXN5bmM6OkNvbm5lY3Rpb24gd2FzIGZvcmNpYmx5IGNsb3NlZCBieSB0aGUgdnNjb2RlIiwKICAgICAgICAgICAgc29ja2V0LmVycm9yOiBmInNjcmlwdC1zeW5jOjpFcnJvciBjb25uZWN0aW5nIHRvIHRoZSB2c2NvZGU6IHtzdHIoZSl9IgogICAgICAgIH0KICAgICAgICBzZWxmLmFkZF9ydW50aW1lX3dhcm5pbmcoZXJyb3JfbWVzc2FnZXNbdHlwZShlKV0pCiAgICAgICAgc2VsZi5pc19jb25uZWN0ZWQgPSBGYWxzZSBpZiB0eXBlKGUpICE9IHNvY2tldC5lcnJvciBvciBlLndpbmVycm9yICE9IDEwMDU2IGVsc2UgVHJ1ZQoKY2xhc3MgRmlsZUNoYW5nZWRUaHJlYWQoR0hUaHJlYWQpOgogICAgIiIiCiAgICAgICAgQSB0aHJlYWQgdG8gY2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQgb24gZGlzay4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICBwYXRoIDogc3RyLAogICAgICAgICAgICAgICAgbmFtZSA6IHN0cgogICAgICAgICAgICAgICAgKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWU9bmFtZSkKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5yZWZyZXNoX3JhdGUgPSAxMDAwICAjIG1pbGxpc2Vjb25kcwogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZCA9IHRocmVhZGluZy5FdmVudCgpCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQgb24gZGlzay4KICAgICAgICAiIiIKICAgICAgICBsYXN0X21vZGlmaWVkID0gb3MucGF0aC5nZXRtdGltZShzZWxmLnBhdGgpCiAgICAgICAgd2hpbGUgc2VsZi5jb21wb25lbnRfb25fY2FudmFzIGFuZCBub3Qgc2VsZi5fb25fZmlsZV9jaGFuZ2VkLmlzX3NldCgpOgogICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChzZWxmLnJlZnJlc2hfcmF0ZSkKICAgICAgICAgICAgbGFzdF9tb2RpZmllZCA9IHNlbGYuaXNfZmlsZV9tb2RpZmllZChsYXN0X21vZGlmaWVkKQogICAgICAgIHNlbGYuX29uX2ZpbGVfY2hhbmdlZC5jbGVhcigpCiAgICAgICAgcmV0dXJuCgogICAgZGVmIHN0b3Aoc2VsZik6CiAgICAgICAgIiIiIFN0b3AgdGhlIHRocmVhZC4gIiIiCiAgICAgICAgc2VsZi5fb25fZmlsZV9jaGFuZ2VkLnNldCgpCgogICAgZGVmIGlzX2ZpbGVfbW9kaWZpZWQoc2VsZiwgbGFzdF9tb2RpZmllZCk6CiAgICAgICAgY3VycmVudF9tb2RpZmllZCA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5wYXRoKQogICAgICAgIGlmIGN1cnJlbnRfbW9kaWZpZWQgIT0gbGFzdF9tb2RpZmllZDoKICAgICAgICAgICAgc2VsZi5leHBpcmVfY29tcG9uZW50X3NvbHV0aW9uKCkKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRfbW9kaWZpZWQKICAgICAgICByZXR1cm4gbGFzdF9tb2RpZmllZAoKCmNsYXNzIFNjcmlwdFN5bmNDUHkoY29tcG9uZW50KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTY3JpcHRTeW5jQ1B5LCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fdmFyX291dHB1dCA9IFtdCgogICAgICAgIHNlbGYuaXNfc3VjY2VzcyA9IEZhbHNlCgogICAgICAgIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIDogc3RyID0gZiJzY3JpcHQtc3luYy1jbGllbnQtdGhyZWFkOjp7Z2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZH0iCiAgICAgICAgc2VsZi52c2NvZGVfc2VydmVyX2lwID0gIjEyNy4wLjAuMSIKICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCA9IDU4MjYwCiAgICAgICAgc2VsZi5zdGRvdXQgPSBOb25lCiAgICAgICAgc2VsZi5xdWV1ZV9tc2cgPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgc2VsZi5xdWV1ZV9tc2dfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnID0gdGhyZWFkaW5nLkV2ZW50KCkKCiAgICAgICAgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSA6IHN0ciA9IGYic2NyaXB0LXN5bmMtZmlsZUNoYW5nZWQtdGhyZWFkOjp7Z2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZH0iCiAgICAgICAgc2VsZi5fX3BhdGhfbmFtZV90YWJsZV92YWx1ZSA9ICJzY3JpcHQtc3luYzo6IiArICJwYXRoOjoiICsgc3RyKGdoZW52LkNvbXBvbmVudC5JbnN0YW5jZUd1aWQpCiAgICAgICAgaWYgc2VsZi5wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudC5NZXNzYWdlID0gInNlbGVjdC1zY3JpcHQiCgogICAgZGVmIFJlbW92ZWRGcm9tRG9jdW1lbnQoc2VsZiwgZG9jKToKICAgICAgICAiIiIgUmVtb3ZlIHRoZSBjb21wb25lbnQgZnJvbSB0aGUgZG9jdW1lbnQuICIiIgogICAgICAgIGlmIHNlbGYuY2xpZW50X3RocmVhZF9uYW1lIGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgY2xpZW50X3RocmVhZCA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5jbGllbnRfdGhyZWFkX25hbWVdWzBdCiAgICAgICAgICAgIGNsaWVudF90aHJlYWQuam9pbigpCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIGZpbGVjaGFuZ2VkX3RocmVhZCA9IFt0IGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKSBpZiB0Lm5hbWUgPT0gc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZV1bMF0KICAgICAgICAgICAgZmlsZWNoYW5nZWRfdGhyZWFkLmpvaW4oKQogICAgICAgIGlmIHNlbGYucXVldWVfbXNnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5qb2luKCkKICAgICAgICBpZiBzZWxmLnF1ZXVlX21zZ19sb2NrIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZ19sb2NrLnJlbGVhc2UoKQogICAgICAgIGlmIHNlbGYuZXZlbnRfZmlyZV9tc2cgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuY2xlYXIoKQoKICAgICAgICAjIGNsZWFyIHRoZSBwYXRoIGZyb20gdGhlIHRhYmxlIHZpZXcKICAgICAgICBkZWwgc2VsZi5wYXRoCgogICAgZGVmIGluaXRfc2NyaXB0X3BhdGgoc2VsZiwgYnRuIDogYm9vbCA9IEZhbHNlKToKICAgICAgICAiIiIKICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCBsb2FkL2NoYW5nZSBwYXRoIHNjcmlwdC4KICAgICAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbSBidG46IEEgYm9vbGVhbiBvZiB0aGUgYnV0dG9uCiAgICAgICAgIiIiCiAgICAgICAgIyBjaGVjayBpZiBidXR0b24gaXMgcHJlc3NlZAogICAgICAgIGlmIGJ0biBpcyBUcnVlOgogICAgICAgICAgICBkaWFsb2cgPSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5PcGVuRmlsZURpYWxvZygpCiAgICAgICAgICAgIGRpYWxvZy5GaWx0ZXIgPSAiUHl0aG9uIGZpbGVzICgqLnB5KXwqLnB5IgogICAgICAgICAgICBkaWFsb2cuVGl0bGUgPSAiU2VsZWN0IGEgUHl0aG9uIGZpbGUiCiAgICAgICAgICAgIGRpYWxvZy5Jbml0aWFsRGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKCIiKQogICAgICAgICAgICBkaWFsb2cuRmlsZU5hbWUgPSAiIgogICAgICAgICAgICBkaWFsb2cuTXVsdGlzZWxlY3QgPSBGYWxzZQogICAgICAgICAgICBkaWFsb2cuQ2hlY2tGaWxlRXhpc3RzID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuQ2hlY2tQYXRoRXhpc3RzID0gVHJ1ZQogICAgICAgICAgICBkaWFsb2cuUmVzdG9yZURpcmVjdG9yeSA9IFRydWUKICAgICAgICAgICAgaWYgZGlhbG9nLlNob3dEaWFsb2coKSA9PSBTeXN0ZW0uV2luZG93cy5Gb3Jtcy5EaWFsb2dSZXN1bHQuT0s6CiAgICAgICAgICAgICAgICBzZWxmLnBhdGggPSBkaWFsb2cuRmlsZU5hbWUKCiAgICAgICAgIyBkZWZhdWx0IGluaXQgc3RhdXRzCiAgICAgICAgaWYgc2VsZi5wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0LXN5bmM6OkZpbGUgbm90IHNlbGVjdGVkIikKCiAgICAgICAgIyBmaSBmaWxlIGlzIGluIHRhYmxlIHZpZXcgYmVmb3JlCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYucGF0aCk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigic2NyaXB0LXN5bmM6OkZpbGUgZG9lcyBub3QgZXhpc3QiKQogICAgCiAgICBkZWYgcmVsb2FkX2FsbF9tb2R1bGVzKHNlbGYsIGRpcmVjdG9yeSk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIFJlbG9hZCBhbGwgdGhlIG1vZHVsZXMgKGxvY2FsIGZpbGVzKSBpbiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBzY3JpcHQuCgogICAgICAgICAgICA6cGFyYW0gZGlyZWN0b3J5OiBUaGUgZGlyZWN0b3J5IG9mIHRoZSBzY3JpcHQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5KToKICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5weScpIGFuZCBmaWxlbmFtZSAhPSAnX19pbml0X18ucHknOgogICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgPSBmaWxlbmFtZVs6LTNdICAjIHJlbW92ZSAnLnB5JyBmcm9tIGZpbGVuYW1lCiAgICAgICAgICAgICAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBpbXBvcnRsaWIucmVsb2FkKHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXSkKCiAgICBkZWYgZ2V0X3JlbG9hZGFibGVfcGFja2FnZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgICAgIEdldCBhbGwgdGhlIHJlbG9hZGFibGUgbW9kdWxlcyBmcm9tIHRoZSBzeXMubW9kdWxlcy4gSXQKICAgICAgICAgICAgbWFrZSBzdXJlIHRvIGNoZWNrIHRoZSBtb2R1bGUgc3BlYyBhbmQgbG9hZGVyIHRvIG9ubHkgcmVsb2FkIG1vZHVsZXMgCiAgICAgICAgICAgIHRoYXQgYXJlIGFjdHVhbGx5IGxvYWRlZCBmcm9tIGEgZmlsZSBvciBkaXJlY3RvcnkKCiAgICAgICAgICAgIDpyZXR1cm46IFRoZSBsaXN0IG9mIHJlbG9hZGFibGUgbW9kdWxlcy4KICAgICAgICAiIiIKICAgICAgICBCVUlMVElOX09SSUdJTlMgPSBbJ2J1aWx0LWluJywgJ2Zyb3plbiddCiAgICAgICAgcmVsb2FkYWJsZXMgPSBbXQogICAgICAgIGZvciBtIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgogICAgICAgICAgICBpZiBpbnNwZWN0LmlzbW9kdWxlKG0pOgogICAgICAgICAgICAgICAgc3BlYyA9IGdldGF0dHIobSwgIl9fc3BlY19fIiwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIHNwZWM6CiAgICAgICAgICAgICAgICAgICAgaWYgc3BlYy5vcmlnaW4gaW4gQlVJTFRJTl9PUklHSU5TIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlzaW5zdGFuY2Uoc3BlYy5sb2FkZXIsIGltcG9ydGxpYi5tYWNoaW5lcnkuU291cmNlbGVzc0ZpbGVMb2FkZXIpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcmVsb2FkYWJsZXMuYXBwZW5kKG0pCgogICAgICAgIHJldHVybiByZWxvYWRhYmxlcwoKICAgIGRlZiBzYWZlX2V4ZWMoc2VsZiwgcGF0aCwgZ2xvYmFscywgbG9jYWxzLCBwYWNrYWdlc18yX3JlbG9hZCk6CiAgICAgICAgIiIiCiAgICAgICAgICAgIEV4ZWN1dGUgUHl0aG9uMyBjb2RlIHNhZmVseS4gSXQgcmVkaXJlY3RzIHRoZSBvdXRwdXQgb2YgdGhlIGNvZGUKICAgICAgICAgICAgdG8gYSBzdHJpbmcgYnVmZmVyICdzdGRvdXQnIHRvIG91dHB1dCB0byB0aGUgR0ggY29tcG9uZW50IHBhcmFtLgogICAgICAgICAgICBJdCBpcyBzZW5kIHRvIHRoZSB2c2NvZGUgc2VydmVyLgogICAgICAgICAgICAKICAgICAgICAgICAgOnBhcmFtIHBhdGg6IFRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIGV4ZWN1dGUuCiAgICAgICAgICAgIDpwYXJhbSBnbG9iYWxzOiBUaGUgZ2xvYmFscyBkaWN0aW9uYXJ5LgogICAgICAgICAgICA6cGFyYW0gbG9jYWxzOiBUaGUgbG9jYWxzIGRpY3Rpb25hcnkuCiAgICAgICAgICAgIDpwYXJhbSBwYWNrYWdlc18yX3JlbG9hZDogVGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gcmVsb2FkLCB0aGlzIGlzIHVzZWQgZm9yIGN1c3RvbSBwYWNrYWdlcyBkZXZlbG9wZW1lbnQuCiAgICAgICAgICAgIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIHZpYSBhbiBlZGl0YWJsZSBwaXAgaW5zdGFsbGF0aW9uIGZvciBleGFtcGxlLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyJykgYXMgZjoKICAgICAgICAgICAgICAgICMgcmVsb2FkIHRoZSBzcGVjaWZ5ZWQgcGFja2FnZXMKICAgICAgICAgICAgICAgICMgcmVsb2FkYWJsZXMgPSBzZWxmLmdldF9yZWxvYWRhYmxlX3BhY2thZ2VzKCkKICAgICAgICAgICAgICAgICMgIyBpZiBwYWNrYWdlc18yX3JlbG9hZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgIyAgICAgaWYgcGFja2FnZXNfMl9yZWxvYWQuX19sZW5fXygpICE9IDA6CiAgICAgICAgICAgICAgICAjICMgICAgICAgICBmb3IgcGFja2FnZSBpbiBwYWNrYWdlc18yX3JlbG9hZDoKICAgICAgICAgICAgICAgICMgIyAgICAgICAgICAgICBpZiBwYWNrYWdlIGluIHJlbG9hZGFibGVzOgogICAgICAgICAgICAgICAgIyAjICAgICAgICAgICAgICAgICBpbXBvcnRsaWIucmVsb2FkKHBhY2thZ2UpCiAgICAgICAgICAgICAgICAjIGZvciBwYWNrYWdlIGluIHBhY2thZ2VzXzJfcmVsb2FkOgogICAgICAgICAgICAgICAgIyAgICAgaWYgcGFja2FnZSBpbiByZWxvYWRhYmxlczoKICAgICAgICAgICAgICAgICMgICAgICAgICBpbXBvcnRsaWIucmVsb2FkKHBhY2thZ2UpCgogICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBhdGggYW5kIHN1YiBkaXJlY3RvcmllcyB0byAgdGhlIHN5cyBwYXRoCiAgICAgICAgICAgICAgICBwYXRoX2RpciA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICAgICAgc3ViX2RpcnMgPSBbXQogICAgICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aF9kaXIpOgogICAgICAgICAgICAgICAgICAgIGZvciBkIGluIGRpcnM6CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocm9vdCwgZCkpCiAgICAgICAgICAgICAgICBzeXMucGF0aC5leHRlbmQoW3BhdGhfZGlyXSArIHN1Yl9kaXJzKQoKICAgICAgICAgICAgICAgICMgcmVsb2FkIGFsbCB0aGUgbW9kdWxlcyBhbHNvIG9mIHRoZSBzdWIgZGlyZWN0b3JpZXMKICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGhfZGlyKToKICAgICAgICAgICAgICAgICAgICBmb3IgZCBpbiBkaXJzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhvcy5wYXRoLmpvaW4ocm9vdCwgZCkpCiAgICAgICAgICAgICAgICBzZWxmLnJlbG9hZF9hbGxfbW9kdWxlcyhwYXRoX2RpcikKCiAgICAgICAgICAgICAgICAjIHJlZnJlc2ggdGhlIHB5dGhvbiBpbnRlcnByZXRlcgogICAgICAgICAgICAgICAgaW1wb3J0bGliLmludmFsaWRhdGVfY2FjaGVzKCkKCiAgICAgICAgICAgICAgICAjIHBhcnNlIHRoZSBjb2RlCiAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmLnJlYWQoKSwgcGF0aCwgJ2V4ZWMnKQogICAgICAgICAgICAgICAgb3V0cHV0ID0gaW8uU3RyaW5nSU8oKQoKICAgICAgICAgICAgICAgICMgZW1wdHkgdGhlIHF1ZXVlIGFuZCBldmVudAogICAgICAgICAgICAgICAgd2l0aCBzZWxmLnF1ZXVlX21zZ19sb2NrOgogICAgICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1ZXVlX21zZy5lbXB0eSgpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5nZXQoKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy50YXNrX2RvbmUoKQogICAgICAgICAgICAgICAgc2VsZi5ldmVudF9maXJlX21zZy5jbGVhcigpCgogICAgICAgICAgICAgICAgIyBleGVjdXRlIHRoZSBjb2RlCiAgICAgICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIucmVkaXJlY3Rfc3Rkb3V0KG91dHB1dCk6CiAgICAgICAgICAgICAgICAgICAgZXhlYyhjb2RlLCBnbG9iYWxzLCBsb2NhbHMpCiAgICAgICAgICAgICAgICBsb2NhbHNbInN0ZG91dCJdID0gb3V0cHV0LmdldHZhbHVlKCkKCiAgICAgICAgICAgICAgICAjIHNlbmQgdGhlIG1zZyB0byB0aGUgdnNjb2RlIHNlcnZlcgogICAgICAgICAgICAgICAgbXNnX2pzb24gPSBqc29uLmR1bXBzKHsic2NyaXB0X3BhdGgiOiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3VpZCI6IHN0cihnaGVudi5Db21wb25lbnQuSW5zdGFuY2VHdWlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZyI6IG91dHB1dC5nZXR2YWx1ZSgpfSkKICAgICAgICAgICAgICAgIG1zZ19qc29uID0gbXNnX2pzb24uZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5wdXQobXNnX2pzb24pCiAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnLnNldCgpCgogICAgICAgICAgICAgICAgIyBwYXNzIHRoZSBzY3JpcHQgdmFyaWFibGVzIHRvIHRoZSBHSCBjb21wb25lbnQgb3V0cHV0cwogICAgICAgICAgICAgICAgb3V0cGFyYW0gPSBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dAogICAgICAgICAgICAgICAgb3V0cGFyYW1fbmFtZXMgPSBbcC5OaWNrTmFtZSBmb3IgcCBpbiBvdXRwYXJhbV0KICAgICAgICAgICAgICAgIGZvciBvdXRwIGluIG91dHBhcmFtX25hbWVzOgogICAgICAgICAgICAgICAgICAgIGlmIG91dHAgaW4gbG9jYWxzLmtleXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFyX291dHB1dC5hcHBlbmQobG9jYWxzW291dHBdKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuYXBwZW5kKE5vbmUpCgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCiAgICAgICAgICAgIHJldHVybiBsb2NhbHMKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgoKICAgICAgICAgICAgIyBzZW5kIHRoZSBlcnJvciBtZXNzYWdlIHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgICAgIGVycl9qc29uID0ganNvbi5kdW1wcyh7InNjcmlwdF9wYXRoIjogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImd1aWQiOiBzdHIoZ2hlbnYuQ29tcG9uZW50Lkluc3RhbmNlR3VpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtc2ciOiAiZXJyOiIgKyBzdHIoZSl9KQogICAgICAgICAgICBlcnJfanNvbiA9IGVycl9qc29uLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBzZWxmLnF1ZXVlX21zZy5wdXQoZXJyX2pzb24pCiAgICAgICAgICAgIHNlbGYuZXZlbnRfZmlyZV9tc2cuc2V0KCkKICAgICAgICAgICAgCiAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXwoKICAgICAgICAgICAgZXJyX21zZyA9IGYic2NyaXB0LXN5bmM6OkVycm9yIGluIHRoZSBjb2RlOiB7c3RyKGUpfSIKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKGVycl9tc2cpCgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICBidG46IGJvb2wsCiAgICAgICAgICAgIHBhY2thZ2VzXzJfcmVsb2FkOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JTGlzdFtvYmplY3RdLAogICAgICAgICAgICBpX2V4cG9ydF9kaXIsCiAgICAgICAgICAgIGlfYnJlcHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklMaXN0W1JoaW5vLkdlb21ldHJ5LkJyZXBdLAogICAgICAgICAgICBpX2Fzc2VtYmx5X25hbWUsCiAgICAgICAgICAgIGlfZHVtcDogYm9vbCk6CiAgICAgICAgIiIiIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgY29tcG9uZW50IGhhcyB0byBiZSByZWNhbGN1bGF0ZWQgaXQncyB0aGUgc29sdmUgbWFpbiBpbnN0YW5jZS4gIiIiCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gRmFsc2UKCiAgICAgICAgIyBzZXQgdGhlIHBhdGggaWYgYnV0dG9uIGlzIHByZXNzZWQKICAgICAgICBzZWxmLmluaXRfc2NyaXB0X3BhdGgoYnRuKQoKICAgICAgICAjIGZpbGUgY2hhbmdlIGxpc3RlbmVyIHRocmVhZAogICAgICAgIGlmIHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWUgbm90IGluIFt0Lm5hbWUgZm9yIHQgaW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpXToKICAgICAgICAgICAgRmlsZUNoYW5nZWRUaHJlYWQoc2VsZi5wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVjaGFuZ2VkX3RocmVhZF9uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc3RhcnQoKQoKICAgICAgICAjIHNldCB1cCB0aGUgdGNwIGNsaWVudCB0byBjb25uZWN0IHRvIHRoZSB2c2NvZGUgc2VydmVyCiAgICAgICAgXyA9IFtwcmludCh0Lm5hbWUpIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV0KICAgICAgICBpZiBzZWxmLmNsaWVudF90aHJlYWRfbmFtZSBub3QgaW4gW3QubmFtZSBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCldOgogICAgICAgICAgICBDbGllbnRUaHJlYWQoc2VsZi52c2NvZGVfc2VydmVyX2lwLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZzY29kZV9zZXJ2ZXJfcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfdGhyZWFkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXVldWVfbXNnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlX21zZ19sb2NrLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV2ZW50X2ZpcmVfbXNnCiAgICAgICAgICAgICAgICAgICAgICAgICkuc3RhcnQoKQoKICAgICAgICAjIGFkZCB0byB0aGUgZ2xvYmFscyBhbGwgdGhlIGlucHV0IHBhcmFtZXRlcnMgb2YgdGhlIGNvbXBvbmVudCAodGhlIGxvY2FscykKICAgICAgICBnbG9iYWxzKCkudXBkYXRlKGxvY2FscygpKQoKICAgICAgICByZXMgPSBzZWxmLnNhZmVfZXhlYyhzZWxmLnBhdGgsIE5vbmUsIGdsb2JhbHMoKSwgcGFja2FnZXNfMl9yZWxvYWQpCiAgICAgICAgc2VsZi5pc19zdWNjZXNzID0gVHJ1ZQogICAgICAgIHJldHVybgoKICAgIGRlZiBBZnRlclJ1blNjcmlwdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGNvbXBvbmVudCBoYXMgZmluaXNoZWQKICAgICAgICAgICAgaXRzIGNhbGN1bGF0aW9uLiBJdCBpcyB1c2VkIHRvIGxvYWQgdGhlIEdIQ29tcG9uZW50IG91dHB1dHMKICAgICAgICAgICAgd2l0aCB0aGUgdmFsdWVzIGNyZWF0ZWQgaW4gdGhlIHNjcmlwdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5pc19zdWNjZXNzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBvdXRwYXJhbSA9IFtwIGZvciBwIGluIGdoZW52LkNvbXBvbmVudC5QYXJhbXMuT3V0cHV0XQogICAgICAgIG91dHBhcmFtX25hbWVzID0gW3AuTmlja05hbWUgZm9yIHAgaW4gb3V0cGFyYW1dCiAgICAgICAgCiAgICAgICAgIyBUT0RPOiBhZGQgdGhlIGNvbnZlcnNpb24gdG8gZGF0YXRyZWUgZm9yIG5lc3RlZCBsaXN0cyBhbmQgdHVwbGVzCiAgICAgICAgZm9yIGlkeCwgb3V0cCBpbiBlbnVtZXJhdGUob3V0cGFyYW0pOgogICAgICAgICAgICAjIGRldGVjdCBpZiB0aGUgb3V0cHV0IGlzIGEgbGlzdAogICAgICAgICAgICBpZiB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gbGlzdCBvciB0eXBlKHNlbGYuX3Zhcl9vdXRwdXRbaWR4XSkgPT0gdHVwbGU6CiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLlZvbGF0aWxlRGF0YS5DbGVhcigpCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQuUGFyYW1zLk91dHB1dFtpZHhdLkFkZFZvbGF0aWxlRGF0YUxpc3QoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5Wb2xhdGlsZURhdGEuQ2xlYXIoKQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LlBhcmFtcy5PdXRwdXRbaWR4XS5BZGRWb2xhdGlsZURhdGEoZ2guS2VybmVsLkRhdGEuR0hfUGF0aCgwKSwgMCwgc2VsZi5fdmFyX291dHB1dFtpZHhdKQogICAgICAgIHNlbGYuX3Zhcl9vdXRwdXQuY2xlYXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSBmcm9tIHRoZSB0YWJsZSB2aWV3IHRvIGJlIHN0aWNraW5nIGJldHdlZW4gdGhlIHNlc3Npb25zLiAiIiIKICAgICAgICB0YWJsZV92YWx1ZSA9IGdoZW52LkNvbXBvbmVudC5PblBpbmdEb2N1bWVudCgpLlZhbHVlVGFibGUuR2V0VmFsdWUoCiAgICAgICAgICAgIHNlbGYuX19wYXRoX25hbWVfdGFibGVfdmFsdWUsICJub3RfZm91bmQiCiAgICAgICAgKQogICAgICAgIGlmIHRhYmxlX3ZhbHVlICE9ICJub3RfZm91bmQiOgogICAgICAgICAgICByZXR1cm4gdGFibGVfdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwYXRoLnNldHRlcgogICAgZGVmIHBhdGgoc2VsZiwgcGF0aCA6IHN0cik6CiAgICAgICAgIiIiIFNldCB0aGUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgdGFibGUgdmlldyB0byBiZSBzdGlja2luZyBiZXR3ZWVuIHRoZSBzZXNzaW9ucy4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5TZXRWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlLCBwYXRoKQoKICAgICAgICBzY3JpcHRfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICBnaGVudi5Db21wb25lbnQuTWVzc2FnZSA9IGYie3NjcmlwdF9uYW1lfSIKCiAgICAgICAgaWYgc2VsZi5maWxlY2hhbmdlZF90aHJlYWRfbmFtZSBpbiBbdC5uYW1lIGZvciB0IGluIHRocmVhZGluZy5lbnVtZXJhdGUoKV06CiAgICAgICAgICAgIF8gPSBbdCBmb3IgdCBpbiB0aHJlYWRpbmcuZW51bWVyYXRlKCkgaWYgdC5uYW1lID09IHNlbGYuZmlsZWNoYW5nZWRfdGhyZWFkX25hbWVdWzBdLnN0b3AoKQoKICAgIEBwYXRoLmRlbGV0ZXIKICAgIGRlZiBwYXRoKHNlbGYpOgogICAgICAgICIiIiBEZWxldGUgdGhlIHBhdGggb2YgdGhlIGZpbGUgZnJvbSB0aGUgdGFibGUgdmlldyBpZiB0aGUgb2JqZWN0IGlzIGVyYXNlZC4gIiIiCiAgICAgICAgZ2hlbnYuQ29tcG9uZW50Lk9uUGluZ0RvY3VtZW50KCkuVmFsdWVUYWJsZS5EZWxldGVWYWx1ZShzZWxmLl9fcGF0aF9uYW1lX3RhYmxlX3ZhbHVlKQo= + S + + + + + *.*.python + 3.* + + + + + + + + + + + a8b97322-2d53-47cd-905e-b932c3ccd74e + Button + + + + + Button object with two values + False + True + 37a1fdbe-f895-4bf0-a740-19a73fe2889b + Button + + false + 0 + + + + + + 133 + 510 + 66 + 22 + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + d9f12976-f7f0-40a9-a06e-c4e80b19529d + Panel + + false + 0 + 0 + diffCheck + + + + + + -20 + 551 + 113 + 38 + + 0 + 0 + 0 + + -19.14932 + 551.1913 + + + + + + + 255;213;217;232 + + true + true + false + false + false + true + + + + + + + + + 06953bda-1d37-4d58-9b38-4b3c74e54c8f + File Path + + + + + Contains a collection of file paths + false + All files|*.* + bee0b3ef-7bf0-49f6-8e1d-71c7765756d0 + File Path + Path + false + 0 + + + + + + 135 + 582 + 50 + 24 + + + 160.70218 + 594.44104 + + + + + + 1 + + + + + 1 + {0} + + + + + false + F:\diffCheck\temp\ + + + + + + + + + + + + + 919e146f-30ae-4aae-be34-4d72f555e7da + Brep + + + + + Contains a collection of Breps (Boundary REPresentations) + true + a126a588-53d2-4d08-977f-68deff6a42c2 + Brep + Brep + false + 0 + + + + + + 136 + 613 + 50 + 24 + + + 161.0756 + 625.8681 + + + + + + 1 + + + + + 1 + {0} + + + + + 5981a85d-0063-489b-8bd7-7a1ebe1453a7 + + + + + + + + + + + + + a8b97322-2d53-47cd-905e-b932c3ccd74e + Button + + + + + Button object with two values + False + True + 51a09241-6321-4d8b-bfc9-536b009c6410 + Button + dump! + false + 0 + + + + + + 88 + 674 + 102 + 22 + + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + aedebb31-f342-420e-ac55-d80e788a157f + Panel + + false + 0 + 0 + AssemblyTest + + + + + + 91 + 649 + 102 + 20 + + 0 + 0 + 0 + + 91.80564 + 649.3606 + + + + + + + 255;213;217;232 + + true + true + true + false + false + true + + + + + + + + + 59e0b89a-e487-49f8-bab8-b5bab16be14c + Panel + + + + + A panel for custom notes and text values + dbcb817b-1342-4c31-96a8-a828fd3f41e1 + Panel + + false + 1 + eba563ee-7094-4907-b35a-ee3a9d076495 + 1 + Double click to edit panel content… + + + + + + 509 + 403 + 494 + 251 + + 0 + 0 + 0 + + 509.25073 + 403.22205 + + + + + + + 255;213;217;232 + + true + true + true + false + false + true + + + + + + @@ -4603,7 +5320,7 @@ - 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