diff --git a/.eslintrc.json b/.eslintrc.json old mode 100644 new mode 100755 diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.hintrc b/.hintrc old mode 100644 new mode 100755 diff --git a/.stylelintrc.json b/.stylelintrc.json old mode 100644 new mode 100755 diff --git a/.vscode/settings.json b/.vscode/settings.json index 23830fb..2f16237 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "git.ignoreLimitWarning": true -} + "liveServer.settings.port": 5502, + "livePreview.defaultPreviewPath": "/src/index.html" +} \ No newline at end of file diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 3b12581..868a8ba --- a/README.md +++ b/README.md @@ -2,21 +2,21 @@ # To Do List - ## Description +"A To-Do-List app designed to help users organise their daily activities. it simply creates a list of things you want to do and allows you to mark them as complete. -"To-do list" is a tool that helps to organize your day. It simply lists the things that you need to do and allows you to mark them as complete. - +- Page view: -- This is the page view: +> | To Do List | +> | -------------------------------- | +> | ![Screenshot1](./add-remove.png) | -> | To Do List | -> |-------------------| -> | ![Screenshot1](https://user-images.githubusercontent.com/79058364/134364133-16b1160b-8975-4820-a3d7-ebe8acd72db0.png)| +## Live Demo +[Click Here to view live version](https://lambent-hamster-121a58.netlify.app/) -> Learning objectives: +> Learning objectives: - Use webpack to bundle JavaScript. - Learn how to use proper ES6 syntax. @@ -29,51 +29,51 @@ - Java Script - Webpack - ## Getting Started To get the content of this project locally you need to run this command in your terminal: - - `https://github.com/evans22j/MY-TO-DO-LIST.git` - +- `https://github.com/evans22j/TO-DO-LIST.git` ### Setup -- To clone the repository run this command `https://github.com/evans22j/MY-TO-DO-LIST.git` +- To clone the repository run this command `https://github.com/evans22j/TO-DO-LIST.git` ## Test For tracking linter errors locally you need to follow these steps: - After cloning the project you need to run this command + > npm install - `This command will download all the dependencies of the project` + > `This command will download all the dependencies of the project` - For tracking the linter errors in HTML file run: + > npx hint . - For tracking the linter errors in CSS file run: - > npx stylelint "**/*.{css,scss}" + + > npx stylelint "\*_/_.{css,scss}" - And For tracking the linter errors in JavaScript file run: - > npx eslint . + + > npx eslint . - Use `npm run build` to run the app in live server - + - Install `npm install --save-dev webpack-dev-server` to have the ability to use live reloading. - - - Then Run from the command line `npm start` to will see the browser automatically loading up our page. + - Then Run from the command line `npm start` to will see the browser automatically loading up our page. ## Getting Started To get a local copy up and running follow these simple example steps. -1. Clone the Repo or Download the Zip file and Extract by clicking here [GitHub Repo]{https://github.com/evans22j/MY-TO-DO-LIST.git} +1. Clone the Repo or Download the Zip file and Extract by clicking here [GitHub Repo]{https://github.com/evans22j/TO-DO-LIST.git} 2. mkdir the folder of your choice -3. cd the folder -4. git clone - +3. cd the folder +4. git clone ## Author @@ -83,8 +83,6 @@ To get a local copy up and running follow these simple example steps. - Twitter: [@Evans_22J](https://twitter.com/Evans_22J) - LinkedIn: [Evans Sitibekiso](https://www.linkedin.com/in/evans-sitibekiso-a85753202/) - - ## 🤝 Contributing Contributions, issues, and feature requests are welcome! @@ -95,6 +93,6 @@ Feel free to check the [issues page](../../issues/). Give a ⭐️ if you like this project! - ## Acknowledgments -- Huge thanks to my coding partners \ No newline at end of file + +- Huge thanks to my coding partners diff --git a/add-remove.png b/add-remove.png new file mode 100644 index 0000000..cab5336 Binary files /dev/null and b/add-remove.png differ diff --git a/dist/index.html b/dist/index.html index 868aa39..f5af4d0 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1,43 +1,30 @@ - - - - - - - To Do List - - - - -
-
- Today's To Do - -
- -
-
- - -
-
- - - -
- -
-
- - - + + + + + + + To Do list + + + +
+
+
+

To Do Lists

+
+
+

Today's To Do

+
+ + +
+
    +
    + +
    +
    +
    +
    + \ No newline at end of file diff --git a/dist/main.js b/dist/main.js index df453a0..349f265 100644 --- a/dist/main.js +++ b/dist/main.js @@ -21,7 +21,7 @@ __webpack_require__.r(__webpack_exports__); var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, ":root {\n --primary: rgb(71, 69, 69);\n --secondary: #ccc;\n --border: rgb(221, 219, 219);\n --background: rgb(243, 243, 243);\n}\n\n* {\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n}\n\n.d-flex {\n display: flex;\n}\n\n.flex-center {\n align-items: center;\n}\n\nbody {\n width: 100%;\n min-height: 100vh;\n background-color: var(--background);\n font-size: 1.4rem;\n}\n\ni {\n cursor: pointer;\n color: var(--secondary);\n}\n\nsection {\n background-color: #fff;\n width: 50%;\n min-width: 300px;\n box-shadow: 0 3px 10px rgb(0 0 0 / 20%);\n border-radius: 6px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.header {\n border-bottom: 1px solid var(--border);\n padding: 1.2rem 1.5rem;\n color: var(--primary);\n justify-content: space-between;\n}\n\nform button {\n background-color: transparent;\n border: none;\n padding: 0.6rem;\n}\n\nform button i {\n transform: rotate(90deg);\n font-size: 1rem;\n font-weight: 400;\n}\n\n.header i {\n transform: rotate(90deg);\n font-size: 18px;\n}\n\nform > div {\n border-bottom: 1px solid var(--border);\n padding: 0.7rem 1.5rem;\n justify-content: space-between;\n width: 100%;\n}\n\nform input {\n border: none;\n outline: none;\n min-width: 250px;\n padding: 0.8rem 0;\n flex: 1;\n}\n\nform input,\nform input::-webkit-input-placeholder {\n font-size: 1.2rem;\n font-family: 'Roboto', sans-serif;\n font-style: italic;\n font-weight: 100;\n color: rgb(131, 130, 130);\n}\n\n.tasks-list {\n min-width: 100%;\n}\n\n.tasks-list li {\n width: 100%;\n list-style: none;\n border-bottom: 1px solid var(--border);\n padding: 0.7rem 1.2rem;\n}\n\n.tasks-list li label {\n margin-left: 6px;\n font-size: inherit;\n color: var(--primary);\n cursor: pointer;\n}\n\n/* .tasks-list li label.compeleted {\n text-decoration: line-through;\n font-style: italic;\n color: var(--secondary);\n} */\n\n.tasks-list li i:hover {\n color: var(--primary);\n cursor: pointer;\n}\n\n.clear-btn button {\n width: 100%;\n font-size: inherit;\n padding: 1.2rem;\n border: none;\n outline: none;\n color: var(--secondary);\n background-color: var(--background);\n border-bottom-left-radius: 8px;\n border-bottom-right-radius: 8px;\n cursor: pointer;\n}\n\n.task-container .task-details {\n flex: 1;\n display: flex;\n padding: 0 1rem;\n}\n\n.task-container .task-details span {\n margin-left: 6px;\n font-size: inherit;\n color: var(--primary);\n}\n\n.task-container .task-details span.compeleted {\n text-decoration: line-through;\n}\n\n.task-container .task-details input {\n border: none;\n font-size: inherit;\n color: var(--primary);\n outline: none;\n flex: 1;\n display: none;\n background-color: transparent;\n}\n\n.task-container .task-action-btns button {\n width: 2.2rem;\n background-color: transparent;\n border: none;\n cursor: pointer;\n padding: 0.6rem 0;\n}\n\n.task-container .task-action-btns button:last-child {\n display: none;\n}\n\n.edit-task-form {\n flex: 1;\n display: flex;\n}\n\n.task-container .task-action-btns button i {\n font-size: 1.2rem;\n}\n\n.task-container.edit-mode {\n background-color: #faf3db;\n}\n\n.task-container.edit-mode .task-action-btns button:last-child {\n display: block;\n}\n\n.task-details.completed span {\n text-decoration: line-through;\n}\n\n.task-container.edit-mode .task-action-btns button:first-child {\n display: none;\n}\n\n.task-container.edit-mode .task-details input {\n display: block;\n}\n\n.task-container.edit-mode .task-details span {\n display: none;\n}\n", "",{"version":3,"sources":["webpack://./src/style.css"],"names":[],"mappings":"AAAA;EACE,0BAA0B;EAC1B,iBAAiB;EACjB,4BAA4B;EAC5B,gCAAgC;AAClC;;AAEA;EACE,sBAAsB;EACtB,UAAU;EACV,SAAS;AACX;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,iBAAiB;EACjB,mCAAmC;EACnC,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,uBAAuB;AACzB;;AAEA;EACE,sBAAsB;EACtB,UAAU;EACV,gBAAgB;EAChB,uCAAuC;EACvC,kBAAkB;EAClB,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,gCAAgC;AAClC;;AAEA;EACE,sCAAsC;EACtC,sBAAsB;EACtB,qBAAqB;EACrB,8BAA8B;AAChC;;AAEA;EACE,6BAA6B;EAC7B,YAAY;EACZ,eAAe;AACjB;;AAEA;EACE,wBAAwB;EACxB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;EACxB,eAAe;AACjB;;AAEA;EACE,sCAAsC;EACtC,sBAAsB;EACtB,8BAA8B;EAC9B,WAAW;AACb;;AAEA;EACE,YAAY;EACZ,aAAa;EACb,gBAAgB;EAChB,iBAAiB;EACjB,OAAO;AACT;;AAEA;;EAEE,iBAAiB;EACjB,iCAAiC;EACjC,kBAAkB;EAClB,gBAAgB;EAChB,yBAAyB;AAC3B;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,WAAW;EACX,gBAAgB;EAChB,sCAAsC;EACtC,sBAAsB;AACxB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,qBAAqB;EACrB,eAAe;AACjB;;AAEA;;;;GAIG;;AAEH;EACE,qBAAqB;EACrB,eAAe;AACjB;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,eAAe;EACf,YAAY;EACZ,aAAa;EACb,uBAAuB;EACvB,mCAAmC;EACnC,8BAA8B;EAC9B,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,OAAO;EACP,aAAa;EACb,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,qBAAqB;AACvB;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,YAAY;EACZ,kBAAkB;EAClB,qBAAqB;EACrB,aAAa;EACb,OAAO;EACP,aAAa;EACb,6BAA6B;AAC/B;;AAEA;EACE,aAAa;EACb,6BAA6B;EAC7B,YAAY;EACZ,eAAe;EACf,iBAAiB;AACnB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,OAAO;EACP,aAAa;AACf;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,6BAA6B;AAC/B;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,aAAa;AACf","sourcesContent":[":root {\n --primary: rgb(71, 69, 69);\n --secondary: #ccc;\n --border: rgb(221, 219, 219);\n --background: rgb(243, 243, 243);\n}\n\n* {\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n}\n\n.d-flex {\n display: flex;\n}\n\n.flex-center {\n align-items: center;\n}\n\nbody {\n width: 100%;\n min-height: 100vh;\n background-color: var(--background);\n font-size: 1.4rem;\n}\n\ni {\n cursor: pointer;\n color: var(--secondary);\n}\n\nsection {\n background-color: #fff;\n width: 50%;\n min-width: 300px;\n box-shadow: 0 3px 10px rgb(0 0 0 / 20%);\n border-radius: 6px;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n}\n\n.header {\n border-bottom: 1px solid var(--border);\n padding: 1.2rem 1.5rem;\n color: var(--primary);\n justify-content: space-between;\n}\n\nform button {\n background-color: transparent;\n border: none;\n padding: 0.6rem;\n}\n\nform button i {\n transform: rotate(90deg);\n font-size: 1rem;\n font-weight: 400;\n}\n\n.header i {\n transform: rotate(90deg);\n font-size: 18px;\n}\n\nform > div {\n border-bottom: 1px solid var(--border);\n padding: 0.7rem 1.5rem;\n justify-content: space-between;\n width: 100%;\n}\n\nform input {\n border: none;\n outline: none;\n min-width: 250px;\n padding: 0.8rem 0;\n flex: 1;\n}\n\nform input,\nform input::-webkit-input-placeholder {\n font-size: 1.2rem;\n font-family: 'Roboto', sans-serif;\n font-style: italic;\n font-weight: 100;\n color: rgb(131, 130, 130);\n}\n\n.tasks-list {\n min-width: 100%;\n}\n\n.tasks-list li {\n width: 100%;\n list-style: none;\n border-bottom: 1px solid var(--border);\n padding: 0.7rem 1.2rem;\n}\n\n.tasks-list li label {\n margin-left: 6px;\n font-size: inherit;\n color: var(--primary);\n cursor: pointer;\n}\n\n/* .tasks-list li label.compeleted {\n text-decoration: line-through;\n font-style: italic;\n color: var(--secondary);\n} */\n\n.tasks-list li i:hover {\n color: var(--primary);\n cursor: pointer;\n}\n\n.clear-btn button {\n width: 100%;\n font-size: inherit;\n padding: 1.2rem;\n border: none;\n outline: none;\n color: var(--secondary);\n background-color: var(--background);\n border-bottom-left-radius: 8px;\n border-bottom-right-radius: 8px;\n cursor: pointer;\n}\n\n.task-container .task-details {\n flex: 1;\n display: flex;\n padding: 0 1rem;\n}\n\n.task-container .task-details span {\n margin-left: 6px;\n font-size: inherit;\n color: var(--primary);\n}\n\n.task-container .task-details span.compeleted {\n text-decoration: line-through;\n}\n\n.task-container .task-details input {\n border: none;\n font-size: inherit;\n color: var(--primary);\n outline: none;\n flex: 1;\n display: none;\n background-color: transparent;\n}\n\n.task-container .task-action-btns button {\n width: 2.2rem;\n background-color: transparent;\n border: none;\n cursor: pointer;\n padding: 0.6rem 0;\n}\n\n.task-container .task-action-btns button:last-child {\n display: none;\n}\n\n.edit-task-form {\n flex: 1;\n display: flex;\n}\n\n.task-container .task-action-btns button i {\n font-size: 1.2rem;\n}\n\n.task-container.edit-mode {\n background-color: #faf3db;\n}\n\n.task-container.edit-mode .task-action-btns button:last-child {\n display: block;\n}\n\n.task-details.completed span {\n text-decoration: line-through;\n}\n\n.task-container.edit-mode .task-action-btns button:first-child {\n display: none;\n}\n\n.task-container.edit-mode .task-details input {\n display: block;\n}\n\n.task-container.edit-mode .task-details span {\n display: none;\n}\n"],"sourceRoot":""}]); +___CSS_LOADER_EXPORT___.push([module.id, "h1 {\r\n text-align: center;\r\n}\r\n\r\nsection {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\nh2 {\r\n margin: 0;\r\n padding: 2%;\r\n background-color: white;\r\n}\r\n\r\nbutton {\r\n background-color: transparent;\r\n border: none;\r\n}\r\n\r\n.container {\r\n width: 100%;\r\n max-width: 500px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n.todolist-container {\r\n width: 100%;\r\n background-color: whitesmoke;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n row-gap: 2px;\r\n box-shadow: 1px 1px 5px gray;\r\n}\r\n\r\n.icon {\r\n width: 16px;\r\n width: 15px;\r\n padding-left: 5%;\r\n}\r\n\r\n.input-icon {\r\n width: 100%;\r\n margin-bottom: 1px;\r\n background-color: white;\r\n}\r\n\r\n.icon1 {\r\n float: right;\r\n color: rgb(142, 147, 151);\r\n cursor: pointer;\r\n font-size: medium;\r\n padding-right: 2%;\r\n}\r\n\r\n.task {\r\n background-color: white;\r\n display: flex;\r\n padding: 3%;\r\n}\r\n\r\n.todo-list {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n background-color: whitesmoke;\r\n row-gap: 2px;\r\n}\r\n\r\n.todo-input {\r\n width: 85%;\r\n border: none;\r\n padding: 10px;\r\n background-color: white;\r\n cursor: pointer;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\n.todo-input:focus {\r\n outline: none;\r\n border: 2px solid rgb(103, 160, 11);\r\n}\r\n\r\ninput::placeholder {\r\n font-style: italic;\r\n}\r\n\r\n.task-check {\r\n margin-right: 2%;\r\n}\r\n\r\n.list {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n background-color: rgb(226, 222, 222);\r\n row-gap: 2px;\r\n}\r\n\r\n.clearer {\r\n padding: 2%;\r\n cursor: pointer;\r\n font-size: 20px;\r\n font-weight: lighter;\r\n}\r\n\r\n.clear-container {\r\n text-align: center;\r\n}\r\n\r\n.drag {\r\n margin-left: 8px;\r\n cursor: move;\r\n color: gray;\r\n font-size: 18px;\r\n}\r\n\r\n.drag:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.task-text {\r\n border: none;\r\n box-sizing: border-box;\r\n width: 100%;\r\n font-family: 'Roboto', sans-serif;\r\n font-weight: 600;\r\n}\r\n\r\n.task-text:focus {\r\n outline: none;\r\n}\r\n\r\n#taskForm {\r\n display: flex;\r\n flex-wrap: nowrap;\r\n}\r\n\r\n#taskSubmit {\r\n font-size: 16px;\r\n width: 20%;\r\n background-color: white;\r\n margin: 0;\r\n cursor: pointer;\r\n padding-left: 10%;\r\n}\r\n\r\n.completed {\r\n text-decoration: line-through;\r\n}\r\n", "",{"version":3,"sources":["webpack://./src/style.css"],"names":[],"mappings":"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,WAAW;EACX,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,SAAS;EACT,WAAW;EACX,uBAAuB;AACzB;;AAEA;EACE,6BAA6B;EAC7B,YAAY;AACd;;AAEA;EACE,WAAW;EACX,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,4BAA4B;EAC5B,aAAa;EACb,0BAA0B;EAC1B,YAAY;EACZ,4BAA4B;AAC9B;;AAEA;EACE,WAAW;EACX,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,uBAAuB;AACzB;;AAEA;EACE,YAAY;EACZ,yBAAyB;EACzB,eAAe;EACf,iBAAiB;EACjB,iBAAiB;AACnB;;AAEA;EACE,uBAAuB;EACvB,aAAa;EACb,WAAW;AACb;;AAEA;EACE,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,aAAa;EACb,0BAA0B;EAC1B,4BAA4B;EAC5B,YAAY;AACd;;AAEA;EACE,UAAU;EACV,YAAY;EACZ,aAAa;EACb,uBAAuB;EACvB,eAAe;EACf,SAAS;EACT,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,mCAAmC;AACrC;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,UAAU;EACV,SAAS;EACT,gBAAgB;EAChB,aAAa;EACb,0BAA0B;EAC1B,oCAAoC;EACpC,YAAY;AACd;;AAEA;EACE,WAAW;EACX,eAAe;EACf,eAAe;EACf,oBAAoB;AACtB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,YAAY;EACZ,WAAW;EACX,eAAe;AACjB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,YAAY;EACZ,sBAAsB;EACtB,WAAW;EACX,iCAAiC;EACjC,gBAAgB;AAClB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,aAAa;EACb,iBAAiB;AACnB;;AAEA;EACE,eAAe;EACf,UAAU;EACV,uBAAuB;EACvB,SAAS;EACT,eAAe;EACf,iBAAiB;AACnB;;AAEA;EACE,6BAA6B;AAC/B","sourcesContent":["h1 {\r\n text-align: center;\r\n}\r\n\r\nsection {\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\nh2 {\r\n margin: 0;\r\n padding: 2%;\r\n background-color: white;\r\n}\r\n\r\nbutton {\r\n background-color: transparent;\r\n border: none;\r\n}\r\n\r\n.container {\r\n width: 100%;\r\n max-width: 500px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n}\r\n\r\n.todolist-container {\r\n width: 100%;\r\n background-color: whitesmoke;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n row-gap: 2px;\r\n box-shadow: 1px 1px 5px gray;\r\n}\r\n\r\n.icon {\r\n width: 16px;\r\n width: 15px;\r\n padding-left: 5%;\r\n}\r\n\r\n.input-icon {\r\n width: 100%;\r\n margin-bottom: 1px;\r\n background-color: white;\r\n}\r\n\r\n.icon1 {\r\n float: right;\r\n color: rgb(142, 147, 151);\r\n cursor: pointer;\r\n font-size: medium;\r\n padding-right: 2%;\r\n}\r\n\r\n.task {\r\n background-color: white;\r\n display: flex;\r\n padding: 3%;\r\n}\r\n\r\n.todo-list {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n background-color: whitesmoke;\r\n row-gap: 2px;\r\n}\r\n\r\n.todo-input {\r\n width: 85%;\r\n border: none;\r\n padding: 10px;\r\n background-color: white;\r\n cursor: pointer;\r\n margin: 0;\r\n box-sizing: border-box;\r\n}\r\n\r\n.todo-input:focus {\r\n outline: none;\r\n border: 2px solid rgb(103, 160, 11);\r\n}\r\n\r\ninput::placeholder {\r\n font-style: italic;\r\n}\r\n\r\n.task-check {\r\n margin-right: 2%;\r\n}\r\n\r\n.list {\r\n padding: 0;\r\n margin: 0;\r\n list-style: none;\r\n display: grid;\r\n grid-template-columns: 1fr;\r\n background-color: rgb(226, 222, 222);\r\n row-gap: 2px;\r\n}\r\n\r\n.clearer {\r\n padding: 2%;\r\n cursor: pointer;\r\n font-size: 20px;\r\n font-weight: lighter;\r\n}\r\n\r\n.clear-container {\r\n text-align: center;\r\n}\r\n\r\n.drag {\r\n margin-left: 8px;\r\n cursor: move;\r\n color: gray;\r\n font-size: 18px;\r\n}\r\n\r\n.drag:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.task-text {\r\n border: none;\r\n box-sizing: border-box;\r\n width: 100%;\r\n font-family: 'Roboto', sans-serif;\r\n font-weight: 600;\r\n}\r\n\r\n.task-text:focus {\r\n outline: none;\r\n}\r\n\r\n#taskForm {\r\n display: flex;\r\n flex-wrap: nowrap;\r\n}\r\n\r\n#taskSubmit {\r\n font-size: 16px;\r\n width: 20%;\r\n background-color: white;\r\n margin: 0;\r\n cursor: pointer;\r\n padding-left: 10%;\r\n}\r\n\r\n.completed {\r\n text-decoration: line-through;\r\n}\r\n"],"sourceRoot":""}]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -530,289 +530,66 @@ module.exports = styleTagTransform; /***/ }), -/***/ "./src/Task.js": -/*!*********************!*\ - !*** ./src/Task.js ***! - \*********************/ +/***/ "./src/populate.js": +/*!*************************!*\ + !*** ./src/populate.js ***! + \*************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ "add": () => (/* binding */ add), +/* harmony export */ "removeDone": () => (/* binding */ removeDone), +/* harmony export */ "updateIndex": () => (/* binding */ updateIndex) /* harmony export */ }); -class Task { - constructor() { - this.tasks = []; - } - - get() { - return this.tasks; - } +/* harmony import */ var _status_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./status.js */ "./src/status.js"); - add(task) { - this.tasks.push(task); - } - - update(taskId, task) { - this.tasks[taskId] = task; - } - remove(taskId) { - this.tasks = this.tasks.filter((task) => task.index.toString() !== taskId); - } - - clearCompleted() { - const newTasks = this.tasts.filter((task) => !task.completed); - this.tasks = newTasks.map((task, index) => { - task.index = index + 1; - return task; - }); - } +function add(list) { + list.push({ description: document.querySelector('#newTask').value, isCompleted: false, index: list.length + 1 }); + document.querySelector('#newTask').value = ''; + (0,_status_js__WEBPACK_IMPORTED_MODULE_0__.saveLocal)(list); } -const task = new Task(); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (task); - -/***/ }), - -/***/ "./src/dom.js": -/*!********************!*\ - !*** ./src/dom.js ***! - \********************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _taskActions_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./taskActions.js */ "./src/taskActions.js"); - - -const tasksList = document.querySelector('.tasks-list'); -const dom = (() => { - const showTrashIcon = () => { - const editBtns = document.querySelectorAll('.task-edit-btn'); - - editBtns.forEach((editBtn) => { - editBtn.addEventListener('click', (e) => { - const tasksElements = document.querySelectorAll('.task-container'); - tasksElements.forEach((taskElm) => { - taskElm.classList.remove('edit-mode'); - }); - const parent = e.target.parentNode.parentNode.parentNode; - parent.classList.add('edit-mode'); - }); - }); - }; - - const renderTasks = (tasks) => { - tasksList.innerHTML = ''; - tasks.map((task) => { - const taskItem = document.createElement('li'); - taskItem.classList.add('task-container', 'd-flex', 'flex-center'); - taskItem.innerHTML = ` -
    - -
    -
    - ${task.description} -
    - -
    -
    -
    - - -
    - `; - showTrashIcon(); - dom.deleteTaskHandler(); - dom.editTastSubmit(); - dom.completeTaskHandler(); - dom.clearCompletedHandler(); - return tasksList.appendChild(taskItem); - }); - }; - - const editTastSubmit = () => { - const editTaskForms = document.querySelectorAll('.edit-task-form'); - editTaskForms.forEach((form) => { - form.addEventListener('submit', (e) => { - e.preventDefault(); - const taskId = form.getAttribute('data-task-id'); - if (form.elements[0].value.trim() === '') return; - const { tasks } = _taskActions_js__WEBPACK_IMPORTED_MODULE_0__["default"].updateTask( - taskId, - form.elements[0].value, - ); - - renderTasks(tasks); - }); - }); - }; - - const completeTaskHandler = () => { - const checkboxes = document.querySelectorAll('.task-checkbox'); - checkboxes.forEach((checkbox) => { - checkbox.addEventListener('change', (e) => { - const taskId = e.target.getAttribute('data-task-id'); - const { tasks } = _taskActions_js__WEBPACK_IMPORTED_MODULE_0__["default"].completeTask(taskId, e.target.checked); - renderTasks(tasks); - }); - }); - }; - - const deleteTaskHandler = () => { - const deleteBtns = document.querySelectorAll('.task-delete-btn'); - deleteBtns.forEach((btn) => { - btn.addEventListener('click', () => { - const taskId = btn.getAttribute('data-task-id'); - const tasks = _taskActions_js__WEBPACK_IMPORTED_MODULE_0__["default"].deleteTask(taskId); - renderTasks(tasks); - }); - }); - }; - - const clearCompletedHandler = () => { - const clearCompletedBtn = document.querySelector('.clear-completed-btn'); - clearCompletedBtn.addEventListener('click', () => { - const tasks = _taskActions_js__WEBPACK_IMPORTED_MODULE_0__["default"].clearCompleted(); - renderTasks(tasks); - }); - }; - - const updateUI = (tasks) => { - renderTasks(tasks); - }; - - return { - renderTasks, - editTastSubmit, - showTrashIcon, - updateUI, - completeTaskHandler, - deleteTaskHandler, - clearCompletedHandler, - }; -})(); - -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (dom); - - -/***/ }), - -/***/ "./src/storage.js": -/*!************************!*\ - !*** ./src/storage.js ***! - \************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { +function updateIndex(list) { + let i = 1; + list.forEach((elem) => { + elem.index = i; + i += 1; + }); +} -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -const storage = { - // function manupilate the local storage - get: (key) => { - const value = localStorage.getItem(key); - return value ? JSON.parse(value) : null; - }, - set: (key, value) => { - localStorage.setItem(key, JSON.stringify(value)); - }, - remove: (key) => { - localStorage.removeItem(key); - }, -}; -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (storage); +function removeDone(list) { + list = list.filter((elem) => elem.isCompleted === false); + updateIndex(list); + (0,_status_js__WEBPACK_IMPORTED_MODULE_0__.saveLocal)(list); +} /***/ }), -/***/ "./src/taskActions.js": -/*!****************************!*\ - !*** ./src/taskActions.js ***! - \****************************/ +/***/ "./src/status.js": +/*!***********************!*\ + !*** ./src/status.js ***! + \***********************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ "saveLocal": () => (/* binding */ saveLocal), +/* harmony export */ "status": () => (/* binding */ status) /* harmony export */ }); -/* harmony import */ var _storage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./storage.js */ "./src/storage.js"); - - -const taskActions = (() => { - const addTask = (description) => { - const tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - const task = { - index: tasks.length + 1, - completed: false, - description, - }; - tasks.push(task); - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', tasks); - return task; - }; - - const updateTask = (index, description) => { - const tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - const task = tasks[index - 1]; - task.description = description; - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', tasks); - return { task, tasks }; - }; - - const completeTask = (index, checked) => { - const tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - const task = tasks[index - 1]; - task.completed = checked; - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', tasks); - return { task, tasks }; - }; - - const deleteTask = (index) => { - let tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - tasks.splice(index - 1, 1); - tasks = tasks.map((task, i) => { - task.index = i + 1; - return task; - }); - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', tasks); - return tasks; - }; - - const clearCompleted = () => { - const tasks = _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].get('tasks'); - let unCompletedTasks = tasks.filter((task) => !task.completed); - unCompletedTasks = unCompletedTasks.map((task, index) => { - task.index = index + 1; - return task; - }); - _storage_js__WEBPACK_IMPORTED_MODULE_0__["default"].set('tasks', unCompletedTasks); - return unCompletedTasks; - }; - - return { - addTask, - updateTask, - completeTask, - deleteTask, - clearCompleted, - }; -})(); +function saveLocal(list) { + window.localStorage.setItem('localTasks', JSON.stringify(list)); +} -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (taskActions); +function status(elem, list) { + list.forEach((task) => { + if (task === elem) { + task.isCompleted = !task.isCompleted; + } + }); + saveLocal(list); +} /***/ }) @@ -891,49 +668,85 @@ var __webpack_exports__ = {}; !*** ./src/index.js ***! \**********************/ __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style.css */ "./src/style.css"); -/* harmony import */ var _storage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./storage.js */ "./src/storage.js"); -/* harmony import */ var _taskActions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./taskActions.js */ "./src/taskActions.js"); -/* harmony import */ var _dom_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dom.js */ "./src/dom.js"); -/* harmony import */ var _Task_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Task.js */ "./src/Task.js"); +/* harmony import */ var _populate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./populate.js */ "./src/populate.js"); +/* harmony import */ var _status_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./status.js */ "./src/status.js"); +/* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./style.css */ "./src/style.css"); +let list = []; +const listEl = document.querySelector('ul'); +function todoList() { + if (window.localStorage.getItem('localTasks')) { + const localTasks = window.localStorage.getItem('localTasks'); + list = JSON.parse(localTasks); + } + document.querySelector('.todo-list').innerHTML = ''; + list.forEach((item) => { + const taskElement = document.createElement('li'); + taskElement.classList.add('task'); + if (item.isCompleted) { + taskElement.classList.add('completed'); + } + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.classList.add('task-check'); + checkbox.addEventListener('click', () => { + _status_js__WEBPACK_IMPORTED_MODULE_1__.status(item, list); + todoList(); + }); + checkbox.checked = item.isCompleted; + taskElement.appendChild(checkbox); + const taskText = document.createElement('input'); + taskText.classList = 'task-text'; + taskText.value = item.description; + taskText.addEventListener('change', () => { + if (taskText.value.length > 0) { + item.description = taskText.value; + _status_js__WEBPACK_IMPORTED_MODULE_1__.saveLocal(list); + } + }); + taskElement.appendChild(taskText); + + const dragIcon = document.createElement('button'); + dragIcon.classList = 'far fa-trash-alt deleteBtn'; + taskElement.appendChild(dragIcon); + taskElement.draggable = 'true'; + document.querySelector('.todo-list').appendChild(taskElement); + }); +} -const form = document.getElementById('form'); -const todoTextInput = document.getElementById('add-book'); - -const getDefaultTasks = () => { - const tasks = _Task_js__WEBPACK_IMPORTED_MODULE_4__["default"].get(); - const storedTasks = _storage_js__WEBPACK_IMPORTED_MODULE_1__["default"].get('tasks'); - if (storedTasks) { - storedTasks.map((t) => _Task_js__WEBPACK_IMPORTED_MODULE_4__["default"].add(t)); - _dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].renderTasks(storedTasks); - } else { - _storage_js__WEBPACK_IMPORTED_MODULE_1__["default"].set('tasks', tasks); - _dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].renderTasks(tasks); +function removeItem(e) { + if (!e.target.classList.contains('deleteBtn')) { + return; } -}; + const btn = e.target; + list.forEach((task) => { + if (task.description === btn.parentElement.children[1].value) { + list.splice(list.indexOf(task), 1); + } + }); + btn.closest('li').remove(); + _populate_js__WEBPACK_IMPORTED_MODULE_0__.updateIndex(list); + _status_js__WEBPACK_IMPORTED_MODULE_1__.saveLocal(list); +} -form.addEventListener('submit', (e) => { - e.preventDefault(); - const savedTask = _taskActions_js__WEBPACK_IMPORTED_MODULE_2__["default"].addTask(todoTextInput.value); - _Task_js__WEBPACK_IMPORTED_MODULE_4__["default"].add(savedTask); - const tasks = _Task_js__WEBPACK_IMPORTED_MODULE_4__["default"].get(); - _dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].renderTasks(tasks); +listEl.addEventListener('click', removeItem); +todoList(); +document.querySelector('#taskForm').addEventListener('submit', (event) => { + event.preventDefault(); + _populate_js__WEBPACK_IMPORTED_MODULE_0__.add(list); + todoList(); +}); +document.querySelector('.clearer').addEventListener('click', () => { + _populate_js__WEBPACK_IMPORTED_MODULE_0__.removeDone(list); + todoList(); }); -getDefaultTasks(); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].updateUI(_storage_js__WEBPACK_IMPORTED_MODULE_1__["default"].get('tasks')); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].showTrashIcon(); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].editTastSubmit(_Task_js__WEBPACK_IMPORTED_MODULE_4__["default"]); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].completeTaskHandler(); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].deleteTaskHandler(); -_dom_js__WEBPACK_IMPORTED_MODULE_3__["default"].clearCompletedHandler(); })(); /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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O1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOcUI7QUFDYztBQUNRO0FBQ2hCO0FBQ0U7O0FBRTdCO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0Isb0RBQVE7QUFDeEIsc0JBQXNCLHVEQUFXO0FBQ2pDO0FBQ0EsMkJBQTJCLG9EQUFRO0FBQ25DLElBQUksMkRBQWU7QUFDbkIsSUFBSTtBQUNKLElBQUksdURBQVc7QUFDZixJQUFJLDJEQUFlO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQiwrREFBbUI7QUFDdkMsRUFBRSxvREFBUTtBQUNWLGdCQUFnQixvREFBUTtBQUN4QixFQUFFLDJEQUFlO0FBQ2pCLENBQUM7O0FBRUQ7QUFDQSx3REFBWSxDQUFDLHVEQUFXO0FBQ3hCLDZEQUFpQjtBQUNqQiw4REFBa0IsQ0FBQyxnREFBSTtBQUN2QixtRUFBdUI7QUFDdkIsaUVBQXFCO0FBQ3JCLHFFQUF5QixHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9zdHlsZS5jc3MiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9zcmMvc3R5bGUuY3NzPzcxNjMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vc3JjL1Rhc2suanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9kb20uanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9zdG9yYWdlLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9zcmMvdGFza0FjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1RvX0RvX0xpc3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1RvX0RvX0xpc3Qvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcIjpyb290IHtcXG4gIC0tcHJpbWFyeTogcmdiKDcxLCA2OSwgNjkpO1xcbiAgLS1zZWNvbmRhcnk6ICNjY2M7XFxuICAtLWJvcmRlcjogcmdiKDIyMSwgMjE5LCAyMTkpO1xcbiAgLS1iYWNrZ3JvdW5kOiByZ2IoMjQzLCAyNDMsIDI0Myk7XFxufVxcblxcbioge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5kLWZsZXgge1xcbiAgZGlzcGxheTogZmxleDtcXG59XFxuXFxuLmZsZXgtY2VudGVyIHtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbmJvZHkge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtaW4taGVpZ2h0OiAxMDB2aDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQpO1xcbiAgZm9udC1zaXplOiAxLjRyZW07XFxufVxcblxcbmkge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XFxufVxcblxcbnNlY3Rpb24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIHdpZHRoOiA1MCU7XFxuICBtaW4td2lkdGg6IDMwMHB4O1xcbiAgYm94LXNoYWRvdzogMCAzcHggMTBweCByZ2IoMCAwIDAgLyAyMCUpO1xcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiA1MCU7XFxuICBsZWZ0OiA1MCU7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG59XFxuXFxuLmhlYWRlciB7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcXG4gIHBhZGRpbmc6IDEuMnJlbSAxLjVyZW07XFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxufVxcblxcbmZvcm0gYnV0dG9uIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgcGFkZGluZzogMC42cmVtO1xcbn1cXG5cXG5mb3JtIGJ1dHRvbiBpIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG4gIGZvbnQtc2l6ZTogMXJlbTtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxufVxcblxcbi5oZWFkZXIgaSB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICBmb250LXNpemU6IDE4cHg7XFxufVxcblxcbmZvcm0gPiBkaXYge1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XFxuICBwYWRkaW5nOiAwLjdyZW0gMS41cmVtO1xcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcblxcbmZvcm0gaW5wdXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIG1pbi13aWR0aDogMjUwcHg7XFxuICBwYWRkaW5nOiAwLjhyZW0gMDtcXG4gIGZsZXg6IDE7XFxufVxcblxcbmZvcm0gaW5wdXQsXFxuZm9ybSBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICBmb250LXNpemU6IDEuMnJlbTtcXG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtd2VpZ2h0OiAxMDA7XFxuICBjb2xvcjogcmdiKDEzMSwgMTMwLCAxMzApO1xcbn1cXG5cXG4udGFza3MtbGlzdCB7XFxuICBtaW4td2lkdGg6IDEwMCU7XFxufVxcblxcbi50YXNrcy1saXN0IGxpIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xcbiAgcGFkZGluZzogMC43cmVtIDEuMnJlbTtcXG59XFxuXFxuLnRhc2tzLWxpc3QgbGkgbGFiZWwge1xcbiAgbWFyZ2luLWxlZnQ6IDZweDtcXG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLyogLnRhc2tzLWxpc3QgbGkgbGFiZWwuY29tcGVsZXRlZCB7XFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xcbn0gKi9cXG5cXG4udGFza3MtbGlzdCBsaSBpOmhvdmVyIHtcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmNsZWFyLWJ0biBidXR0b24ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBwYWRkaW5nOiAxLjJyZW07XFxuICBib3JkZXI6IG5vbmU7XFxuICBvdXRsaW5lOiBub25lO1xcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kKTtcXG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDhweDtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA4cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1kZXRhaWxzIHtcXG4gIGZsZXg6IDE7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgcGFkZGluZzogMCAxcmVtO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIgLnRhc2stZGV0YWlscyBzcGFuIHtcXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1kZXRhaWxzIHNwYW4uY29tcGVsZXRlZCB7XFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG59XFxuXFxuLnRhc2stY29udGFpbmVyIC50YXNrLWRldGFpbHMgaW5wdXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgY29sb3I6IHZhcigtLXByaW1hcnkpO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGZsZXg6IDE7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b24ge1xcbiAgd2lkdGg6IDIuMnJlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgcGFkZGluZzogMC42cmVtIDA7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b246bGFzdC1jaGlsZCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uZWRpdC10YXNrLWZvcm0ge1xcbiAgZmxleDogMTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b24gaSB7XFxuICBmb250LXNpemU6IDEuMnJlbTtcXG59XFxuXFxuLnRhc2stY29udGFpbmVyLmVkaXQtbW9kZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmM2RiO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWFjdGlvbi1idG5zIGJ1dHRvbjpsYXN0LWNoaWxkIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4udGFzay1kZXRhaWxzLmNvbXBsZXRlZCBzcGFuIHtcXG4gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWFjdGlvbi1idG5zIGJ1dHRvbjpmaXJzdC1jaGlsZCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWRldGFpbHMgaW5wdXQge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lci5lZGl0LW1vZGUgLnRhc2stZGV0YWlscyBzcGFuIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblwiLCBcIlwiLHtcInZlcnNpb25cIjozLFwic291cmNlc1wiOltcIndlYnBhY2s6Ly8uL3NyYy9zdHlsZS5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7RUFDRSwwQkFBMEI7RUFDMUIsaUJBQWlCO0VBQ2pCLDRCQUE0QjtFQUM1QixnQ0FBZ0M7QUFDbEM7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsVUFBVTtFQUNWLFNBQVM7QUFDWDs7QUFFQTtFQUNFLGFBQWE7QUFDZjs7QUFFQTtFQUNFLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCxpQkFBaUI7RUFDakIsbUNBQW1DO0VBQ25DLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLGVBQWU7RUFDZix1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSxzQkFBc0I7RUFDdEIsVUFBVTtFQUNWLGdCQUFnQjtFQUNoQix1Q0FBdUM7RUFDdkMsa0JBQWtCO0VBQ2xCLGtCQUFrQjtFQUNsQixRQUFRO0VBQ1IsU0FBUztFQUNULGdDQUFnQztBQUNsQzs7QUFFQTtFQUNFLHNDQUFzQztFQUN0QyxzQkFBc0I7RUFDdEIscUJBQXFCO0VBQ3JCLDhCQUE4QjtBQUNoQzs7QUFFQTtFQUNFLDZCQUE2QjtFQUM3QixZQUFZO0VBQ1osZUFBZTtBQUNqQjs7QUFFQTtFQUNFLHdCQUF3QjtFQUN4QixlQUFlO0VBQ2YsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0Usd0JBQXdCO0VBQ3hCLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxzQ0FBc0M7RUFDdEMsc0JBQXNCO0VBQ3RCLDhCQUE4QjtFQUM5QixXQUFXO0FBQ2I7O0FBRUE7RUFDRSxZQUFZO0VBQ1osYUFBYTtFQUNiLGdCQUFnQjtFQUNoQixpQkFBaUI7RUFDakIsT0FBTztBQUNUOztBQUVBOztFQUVFLGlCQUFpQjtFQUNqQixpQ0FBaUM7RUFDakMsa0JBQWtCO0VBQ2xCLGdCQUFnQjtFQUNoQix5QkFBeUI7QUFDM0I7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsV0FBVztFQUNYLGdCQUFnQjtFQUNoQixzQ0FBc0M7RUFDdEMsc0JBQXNCO0FBQ3hCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtFQUNsQixxQkFBcUI7RUFDckIsZUFBZTtBQUNqQjs7QUFFQTs7OztHQUlHOztBQUVIO0VBQ0UscUJBQXFCO0VBQ3JCLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLGVBQWU7RUFDZixZQUFZO0VBQ1osYUFBYTtFQUNiLHVCQUF1QjtFQUN2QixtQ0FBbUM7RUFDbkMsOEJBQThCO0VBQzlCLCtCQUErQjtFQUMvQixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsT0FBTztFQUNQLGFBQWE7RUFDYixlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLGtCQUFrQjtFQUNsQixxQkFBcUI7QUFDdkI7O0FBRUE7RUFDRSw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSxZQUFZO0VBQ1osa0JBQWtCO0VBQ2xCLHFCQUFxQjtFQUNyQixhQUFhO0VBQ2IsT0FBTztFQUNQLGFBQWE7RUFDYiw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSxhQUFhO0VBQ2IsNkJBQTZCO0VBQzdCLFlBQVk7RUFDWixlQUFlO0VBQ2YsaUJBQWlCO0FBQ25COztBQUVBO0VBQ0UsYUFBYTtBQUNmOztBQUVBO0VBQ0UsT0FBTztFQUNQLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLHlCQUF5QjtBQUMzQjs7QUFFQTtFQUNFLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSw2QkFBNkI7QUFDL0I7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxjQUFjO0FBQ2hCOztBQUVBO0VBQ0UsYUFBYTtBQUNmXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIjpyb290IHtcXG4gIC0tcHJpbWFyeTogcmdiKDcxLCA2OSwgNjkpO1xcbiAgLS1zZWNvbmRhcnk6ICNjY2M7XFxuICAtLWJvcmRlcjogcmdiKDIyMSwgMjE5LCAyMTkpO1xcbiAgLS1iYWNrZ3JvdW5kOiByZ2IoMjQzLCAyNDMsIDI0Myk7XFxufVxcblxcbioge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxufVxcblxcbi5kLWZsZXgge1xcbiAgZGlzcGxheTogZmxleDtcXG59XFxuXFxuLmZsZXgtY2VudGVyIHtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxufVxcblxcbmJvZHkge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBtaW4taGVpZ2h0OiAxMDB2aDtcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJhY2tncm91bmQpO1xcbiAgZm9udC1zaXplOiAxLjRyZW07XFxufVxcblxcbmkge1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XFxufVxcblxcbnNlY3Rpb24ge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcXG4gIHdpZHRoOiA1MCU7XFxuICBtaW4td2lkdGg6IDMwMHB4O1xcbiAgYm94LXNoYWRvdzogMCAzcHggMTBweCByZ2IoMCAwIDAgLyAyMCUpO1xcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiA1MCU7XFxuICBsZWZ0OiA1MCU7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcXG59XFxuXFxuLmhlYWRlciB7XFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcXG4gIHBhZGRpbmc6IDEuMnJlbSAxLjVyZW07XFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxufVxcblxcbmZvcm0gYnV0dG9uIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgcGFkZGluZzogMC42cmVtO1xcbn1cXG5cXG5mb3JtIGJ1dHRvbiBpIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG4gIGZvbnQtc2l6ZTogMXJlbTtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxufVxcblxcbi5oZWFkZXIgaSB7XFxuICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICBmb250LXNpemU6IDE4cHg7XFxufVxcblxcbmZvcm0gPiBkaXYge1xcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XFxuICBwYWRkaW5nOiAwLjdyZW0gMS41cmVtO1xcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcbiAgd2lkdGg6IDEwMCU7XFxufVxcblxcbmZvcm0gaW5wdXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIG1pbi13aWR0aDogMjUwcHg7XFxuICBwYWRkaW5nOiAwLjhyZW0gMDtcXG4gIGZsZXg6IDE7XFxufVxcblxcbmZvcm0gaW5wdXQsXFxuZm9ybSBpbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XFxuICBmb250LXNpemU6IDEuMnJlbTtcXG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGZvbnQtd2VpZ2h0OiAxMDA7XFxuICBjb2xvcjogcmdiKDEzMSwgMTMwLCAxMzApO1xcbn1cXG5cXG4udGFza3MtbGlzdCB7XFxuICBtaW4td2lkdGg6IDEwMCU7XFxufVxcblxcbi50YXNrcy1saXN0IGxpIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgbGlzdC1zdHlsZTogbm9uZTtcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xcbiAgcGFkZGluZzogMC43cmVtIDEuMnJlbTtcXG59XFxuXFxuLnRhc2tzLWxpc3QgbGkgbGFiZWwge1xcbiAgbWFyZ2luLWxlZnQ6IDZweDtcXG4gIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLyogLnRhc2tzLWxpc3QgbGkgbGFiZWwuY29tcGVsZXRlZCB7XFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnkpO1xcbn0gKi9cXG5cXG4udGFza3MtbGlzdCBsaSBpOmhvdmVyIHtcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5KTtcXG4gIGN1cnNvcjogcG9pbnRlcjtcXG59XFxuXFxuLmNsZWFyLWJ0biBidXR0b24ge1xcbiAgd2lkdGg6IDEwMCU7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBwYWRkaW5nOiAxLjJyZW07XFxuICBib3JkZXI6IG5vbmU7XFxuICBvdXRsaW5lOiBub25lO1xcbiAgY29sb3I6IHZhcigtLXNlY29uZGFyeSk7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iYWNrZ3JvdW5kKTtcXG4gIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDhweDtcXG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA4cHg7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1kZXRhaWxzIHtcXG4gIGZsZXg6IDE7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgcGFkZGluZzogMCAxcmVtO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIgLnRhc2stZGV0YWlscyBzcGFuIHtcXG4gIG1hcmdpbi1sZWZ0OiA2cHg7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeSk7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1kZXRhaWxzIHNwYW4uY29tcGVsZXRlZCB7XFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXG59XFxuXFxuLnRhc2stY29udGFpbmVyIC50YXNrLWRldGFpbHMgaW5wdXQge1xcbiAgYm9yZGVyOiBub25lO1xcbiAgZm9udC1zaXplOiBpbmhlcml0O1xcbiAgY29sb3I6IHZhcigtLXByaW1hcnkpO1xcbiAgb3V0bGluZTogbm9uZTtcXG4gIGZsZXg6IDE7XFxuICBkaXNwbGF5OiBub25lO1xcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b24ge1xcbiAgd2lkdGg6IDIuMnJlbTtcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgYm9yZGVyOiBub25lO1xcbiAgY3Vyc29yOiBwb2ludGVyO1xcbiAgcGFkZGluZzogMC42cmVtIDA7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b246bGFzdC1jaGlsZCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4uZWRpdC10YXNrLWZvcm0ge1xcbiAgZmxleDogMTtcXG4gIGRpc3BsYXk6IGZsZXg7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lciAudGFzay1hY3Rpb24tYnRucyBidXR0b24gaSB7XFxuICBmb250LXNpemU6IDEuMnJlbTtcXG59XFxuXFxuLnRhc2stY29udGFpbmVyLmVkaXQtbW9kZSB7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmM2RiO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWFjdGlvbi1idG5zIGJ1dHRvbjpsYXN0LWNoaWxkIHtcXG4gIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cXG4udGFzay1kZXRhaWxzLmNvbXBsZXRlZCBzcGFuIHtcXG4gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWFjdGlvbi1idG5zIGJ1dHRvbjpmaXJzdC1jaGlsZCB7XFxuICBkaXNwbGF5OiBub25lO1xcbn1cXG5cXG4udGFzay1jb250YWluZXIuZWRpdC1tb2RlIC50YXNrLWRldGFpbHMgaW5wdXQge1xcbiAgZGlzcGxheTogYmxvY2s7XFxufVxcblxcbi50YXNrLWNvbnRhaW5lci5lZGl0LW1vZGUgLnRhc2stZGV0YWlscyBzcGFuIHtcXG4gIGRpc3BsYXk6IG5vbmU7XFxufVxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcblxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cblxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG5cblxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCB0aGlzLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW19pXVswXTtcblxuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG1vZHVsZXMubGVuZ3RoOyBfaTIrKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfaTJdKTtcblxuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGxheWVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbVs1XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNV0gPSBsYXllcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWVkaWEpIHtcbiAgICAgICAgaWYgKCFpdGVtWzJdKSB7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBsaXN0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcblxuICBpZiAoIWNzc01hcHBpbmcpIHtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYnRvYSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGNzc01hcHBpbmcpKSkpO1xuICAgIHZhciBkYXRhID0gXCJzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIi5jb25jYXQoYmFzZTY0KTtcbiAgICB2YXIgc291cmNlTWFwcGluZyA9IFwiLyojIFwiLmNvbmNhdChkYXRhLCBcIiAqL1wiKTtcbiAgICB2YXIgc291cmNlVVJMcyA9IGNzc01hcHBpbmcuc291cmNlcy5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwiLyojIHNvdXJjZVVSTD1cIi5jb25jYXQoY3NzTWFwcGluZy5zb3VyY2VSb290IHx8IFwiXCIpLmNvbmNhdChzb3VyY2UsIFwiICovXCIpO1xuICAgIH0pO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyIsIlxuICAgICAgaW1wb3J0IEFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgaW1wb3J0IGRvbUFQSSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0Rm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzXCI7XG4gICAgICBpbXBvcnQgc2V0QXR0cmlidXRlcyBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydFN0eWxlRWxlbWVudCBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydFN0eWxlRWxlbWVudC5qc1wiO1xuICAgICAgaW1wb3J0IHN0eWxlVGFnVHJhbnNmb3JtRm4gZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qc1wiO1xuICAgICAgaW1wb3J0IGNvbnRlbnQsICogYXMgbmFtZWRFeHBvcnQgZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zdHlsZS5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3N0eWxlLmNzc1wiO1xuICAgICAgIGV4cG9ydCBkZWZhdWx0IGNvbnRlbnQgJiYgY29udGVudC5sb2NhbHMgPyBjb250ZW50LmxvY2FscyA6IHVuZGVmaW5lZDtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRPTS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRPTVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4QnlJZGVudGlmaWVyID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdLFxuICAgICAgc3VwcG9ydHM6IGl0ZW1bNF0sXG4gICAgICBsYXllcjogaXRlbVs1XVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXJzO1xufVxuXG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuXG4gIHZhciB1cGRhdGVyID0gZnVuY3Rpb24gdXBkYXRlcihuZXdPYmopIHtcbiAgICBpZiAobmV3T2JqKSB7XG4gICAgICBpZiAobmV3T2JqLmNzcyA9PT0gb2JqLmNzcyAmJiBuZXdPYmoubWVkaWEgPT09IG9iai5tZWRpYSAmJiBuZXdPYmouc291cmNlTWFwID09PSBvYmouc291cmNlTWFwICYmIG5ld09iai5zdXBwb3J0cyA9PT0gb2JqLnN1cHBvcnRzICYmIG5ld09iai5sYXllciA9PT0gb2JqLmxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXBpLnVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcGkucmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB1cGRhdGVyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBsaXN0ID0gbGlzdCB8fCBbXTtcbiAgdmFyIGxhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KSB7XG4gICAgbmV3TGlzdCA9IG5ld0xpc3QgfHwgW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuXG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuXG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuXG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuXG4gICAgICAgIHN0eWxlc0luRE9NLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBtZW1vID0ge307XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0KHRhcmdldCkge1xuICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTsgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgfVxuXG4gIHJldHVybiBtZW1vW3RhcmdldF07XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgfVxuXG4gIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykge1xuICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgb3B0aW9ucy5zZXRBdHRyaWJ1dGVzKGVsZW1lbnQsIG9wdGlvbnMuYXR0cmlidXRlcyk7XG4gIG9wdGlvbnMuaW5zZXJ0KGVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG4gIHJldHVybiBlbGVtZW50O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydFN0eWxlRWxlbWVudDsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMoc3R5bGVFbGVtZW50KSB7XG4gIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gXCJ1bmRlZmluZWRcIiA/IF9fd2VicGFja19ub25jZV9fIDogbnVsbDtcblxuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBcIlwiO1xuXG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChvYmouc3VwcG9ydHMsIFwiKSB7XCIpO1xuICB9XG5cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG5cbiAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBvYmoubGF5ZXIgIT09IFwidW5kZWZpbmVkXCI7XG5cbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIkBsYXllclwiLmNvbmNhdChvYmoubGF5ZXIubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChvYmoubGF5ZXIpIDogXCJcIiwgXCIge1wiKTtcbiAgfVxuXG4gIGNzcyArPSBvYmouY3NzO1xuXG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuXG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfSAvLyBGb3Igb2xkIElFXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuXG5cbiAgb3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlRWxlbWVudC5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuXG5cbmZ1bmN0aW9uIGRvbUFQSShvcHRpb25zKSB7XG4gIHZhciBzdHlsZUVsZW1lbnQgPSBvcHRpb25zLmluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShvYmopIHtcbiAgICAgIGFwcGx5KHN0eWxlRWxlbWVudCwgb3B0aW9ucywgb2JqKTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgcmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlRWxlbWVudCk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRvbUFQSTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBzdHlsZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdHlsZVRhZ1RyYW5zZm9ybTsiLCJjbGFzcyBUYXNrIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50YXNrcyA9IFtdO1xuICB9XG5cbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRhc2tzO1xuICB9XG5cbiAgYWRkKHRhc2spIHtcbiAgICB0aGlzLnRhc2tzLnB1c2godGFzayk7XG4gIH1cblxuICB1cGRhdGUodGFza0lkLCB0YXNrKSB7XG4gICAgdGhpcy50YXNrc1t0YXNrSWRdID0gdGFzaztcbiAgfVxuXG4gIHJlbW92ZSh0YXNrSWQpIHtcbiAgICB0aGlzLnRhc2tzID0gdGhpcy50YXNrcy5maWx0ZXIoKHRhc2spID0+IHRhc2suaW5kZXgudG9TdHJpbmcoKSAhPT0gdGFza0lkKTtcbiAgfVxuXG4gIGNsZWFyQ29tcGxldGVkKCkge1xuICAgIGNvbnN0IG5ld1Rhc2tzID0gdGhpcy50YXN0cy5maWx0ZXIoKHRhc2spID0+ICF0YXNrLmNvbXBsZXRlZCk7XG4gICAgdGhpcy50YXNrcyA9IG5ld1Rhc2tzLm1hcCgodGFzaywgaW5kZXgpID0+IHtcbiAgICAgIHRhc2suaW5kZXggPSBpbmRleCArIDE7XG4gICAgICByZXR1cm4gdGFzaztcbiAgICB9KTtcbiAgfVxufVxuXG5jb25zdCB0YXNrID0gbmV3IFRhc2soKTtcblxuZXhwb3J0IGRlZmF1bHQgdGFzazsiLCJpbXBvcnQgdGFza0FjdGlvbnMgZnJvbSAnLi90YXNrQWN0aW9ucy5qcyc7XG5cbmNvbnN0IHRhc2tzTGlzdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YXNrcy1saXN0Jyk7XG5jb25zdCBkb20gPSAoKCkgPT4ge1xuICBjb25zdCBzaG93VHJhc2hJY29uID0gKCkgPT4ge1xuICAgIGNvbnN0IGVkaXRCdG5zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhc2stZWRpdC1idG4nKTtcblxuICAgIGVkaXRCdG5zLmZvckVhY2goKGVkaXRCdG4pID0+IHtcbiAgICAgIGVkaXRCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXNrc0VsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRhc2stY29udGFpbmVyJyk7XG4gICAgICAgIHRhc2tzRWxlbWVudHMuZm9yRWFjaCgodGFza0VsbSkgPT4ge1xuICAgICAgICAgIHRhc2tFbG0uY2xhc3NMaXN0LnJlbW92ZSgnZWRpdC1tb2RlJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBlLnRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgcGFyZW50LmNsYXNzTGlzdC5hZGQoJ2VkaXQtbW9kZScpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVuZGVyVGFza3MgPSAodGFza3MpID0+IHtcbiAgICB0YXNrc0xpc3QuaW5uZXJIVE1MID0gJyc7XG4gICAgdGFza3MubWFwKCh0YXNrKSA9PiB7XG4gICAgICBjb25zdCB0YXNrSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgICB0YXNrSXRlbS5jbGFzc0xpc3QuYWRkKCd0YXNrLWNvbnRhaW5lcicsICdkLWZsZXgnLCAnZmxleC1jZW50ZXInKTtcbiAgICAgIHRhc2tJdGVtLmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAke1xuICB0YXNrLmNvbXBsZXRlZCA/ICdjaGVja2VkJyA6ICcnXG4gIH0gZGF0YS10YXNrLWlkPVwiJHt0YXNrLmluZGV4fVwiIGNsYXNzPVwidGFzay1jaGVja2JveFwiLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIke1xuICB0YXNrLmNvbXBsZXRlZCA/ICd0YXNrLWRldGFpbHMgY29tcGxldGVkJyA6ICd0YXNrLWRldGFpbHMnXG4gIH1cIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj4ke3Rhc2suZGVzY3JpcHRpb259PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZWRpdC10YXNrLWZvcm1cIiBkYXRhLXRhc2staWQ9XCIke3Rhc2suaW5kZXh9XCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiB2YWx1ZT1cIiR7XG4gIHRhc2suZGVzY3JpcHRpb25cbiAgfVwiIGNsYXNzPVwidGFzay1lZGl0XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFzay1hY3Rpb24tYnRuc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0YXNrLWVkaXQtYnRuXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1lbGxpcHNpcy12XCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0YXNrLWRlbGV0ZS1idG5cIiBkYXRhLXRhc2staWQ9XCIke3Rhc2suaW5kZXh9XCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10cmFzaC1hbHRcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgIHNob3dUcmFzaEljb24oKTtcbiAgICAgIGRvbS5kZWxldGVUYXNrSGFuZGxlcigpO1xuICAgICAgZG9tLmVkaXRUYXN0U3VibWl0KCk7XG4gICAgICBkb20uY29tcGxldGVUYXNrSGFuZGxlcigpO1xuICAgICAgZG9tLmNsZWFyQ29tcGxldGVkSGFuZGxlcigpO1xuICAgICAgcmV0dXJuIHRhc2tzTGlzdC5hcHBlbmRDaGlsZCh0YXNrSXRlbSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZWRpdFRhc3RTdWJtaXQgPSAoKSA9PiB7XG4gICAgY29uc3QgZWRpdFRhc2tGb3JtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5lZGl0LXRhc2stZm9ybScpO1xuICAgIGVkaXRUYXNrRm9ybXMuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgZm9ybS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHRhc2tJZCA9IGZvcm0uZ2V0QXR0cmlidXRlKCdkYXRhLXRhc2staWQnKTtcbiAgICAgICAgaWYgKGZvcm0uZWxlbWVudHNbMF0udmFsdWUudHJpbSgpID09PSAnJykgcmV0dXJuO1xuICAgICAgICBjb25zdCB7IHRhc2tzIH0gPSB0YXNrQWN0aW9ucy51cGRhdGVUYXNrKFxuICAgICAgICAgIHRhc2tJZCxcbiAgICAgICAgICBmb3JtLmVsZW1lbnRzWzBdLnZhbHVlLFxuICAgICAgICApO1xuXG4gICAgICAgIHJlbmRlclRhc2tzKHRhc2tzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNvbXBsZXRlVGFza0hhbmRsZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YXNrLWNoZWNrYm94Jyk7XG4gICAgY2hlY2tib3hlcy5mb3JFYWNoKChjaGVja2JveCkgPT4ge1xuICAgICAgY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFza0lkID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXRhc2staWQnKTtcbiAgICAgICAgY29uc3QgeyB0YXNrcyB9ID0gdGFza0FjdGlvbnMuY29tcGxldGVUYXNrKHRhc2tJZCwgZS50YXJnZXQuY2hlY2tlZCk7XG4gICAgICAgIHJlbmRlclRhc2tzKHRhc2tzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZVRhc2tIYW5kbGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IGRlbGV0ZUJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudGFzay1kZWxldGUtYnRuJyk7XG4gICAgZGVsZXRlQnRucy5mb3JFYWNoKChidG4pID0+IHtcbiAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFza0lkID0gYnRuLmdldEF0dHJpYnV0ZSgnZGF0YS10YXNrLWlkJyk7XG4gICAgICAgIGNvbnN0IHRhc2tzID0gdGFza0FjdGlvbnMuZGVsZXRlVGFzayh0YXNrSWQpO1xuICAgICAgICByZW5kZXJUYXNrcyh0YXNrcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhckNvbXBsZXRlZEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgY2xlYXJDb21wbGV0ZWRCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2xlYXItY29tcGxldGVkLWJ0bicpO1xuICAgIGNsZWFyQ29tcGxldGVkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGFza3MgPSB0YXNrQWN0aW9ucy5jbGVhckNvbXBsZXRlZCgpO1xuICAgICAgcmVuZGVyVGFza3ModGFza3MpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVVJID0gKHRhc2tzKSA9PiB7XG4gICAgcmVuZGVyVGFza3ModGFza3MpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcmVuZGVyVGFza3MsXG4gICAgZWRpdFRhc3RTdWJtaXQsXG4gICAgc2hvd1RyYXNoSWNvbixcbiAgICB1cGRhdGVVSSxcbiAgICBjb21wbGV0ZVRhc2tIYW5kbGVyLFxuICAgIGRlbGV0ZVRhc2tIYW5kbGVyLFxuICAgIGNsZWFyQ29tcGxldGVkSGFuZGxlcixcbiAgfTtcbn0pKCk7XG5cbmV4cG9ydCBkZWZhdWx0IGRvbTtcbiIsImNvbnN0IHN0b3JhZ2UgPSB7XG4gIC8vICBmdW5jdGlvbiBtYW51cGlsYXRlIHRoZSBsb2NhbCBzdG9yYWdlXG4gIGdldDogKGtleSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gdmFsdWUgPyBKU09OLnBhcnNlKHZhbHVlKSA6IG51bGw7XG4gIH0sXG4gIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gIH0sXG4gIHJlbW92ZTogKGtleSkgPT4ge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH0sXG59O1xuZXhwb3J0IGRlZmF1bHQgc3RvcmFnZTsiLCJpbXBvcnQgc3RvcmFnZSBmcm9tICcuL3N0b3JhZ2UuanMnO1xuXG5jb25zdCB0YXNrQWN0aW9ucyA9ICgoKSA9PiB7XG4gIGNvbnN0IGFkZFRhc2sgPSAoZGVzY3JpcHRpb24pID0+IHtcbiAgICBjb25zdCB0YXNrcyA9IHN0b3JhZ2UuZ2V0KCd0YXNrcycpO1xuICAgIGNvbnN0IHRhc2sgPSB7XG4gICAgICBpbmRleDogdGFza3MubGVuZ3RoICsgMSxcbiAgICAgIGNvbXBsZXRlZDogZmFsc2UsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICB9O1xuICAgIHRhc2tzLnB1c2godGFzayk7XG4gICAgc3RvcmFnZS5zZXQoJ3Rhc2tzJywgdGFza3MpO1xuICAgIHJldHVybiB0YXNrO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVRhc2sgPSAoaW5kZXgsIGRlc2NyaXB0aW9uKSA9PiB7XG4gICAgY29uc3QgdGFza3MgPSBzdG9yYWdlLmdldCgndGFza3MnKTtcbiAgICBjb25zdCB0YXNrID0gdGFza3NbaW5kZXggLSAxXTtcbiAgICB0YXNrLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgc3RvcmFnZS5zZXQoJ3Rhc2tzJywgdGFza3MpO1xuICAgIHJldHVybiB7IHRhc2ssIHRhc2tzIH07XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVUYXNrID0gKGluZGV4LCBjaGVja2VkKSA9PiB7XG4gICAgY29uc3QgdGFza3MgPSBzdG9yYWdlLmdldCgndGFza3MnKTtcbiAgICBjb25zdCB0YXNrID0gdGFza3NbaW5kZXggLSAxXTtcbiAgICB0YXNrLmNvbXBsZXRlZCA9IGNoZWNrZWQ7XG4gICAgc3RvcmFnZS5zZXQoJ3Rhc2tzJywgdGFza3MpO1xuICAgIHJldHVybiB7IHRhc2ssIHRhc2tzIH07XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlVGFzayA9IChpbmRleCkgPT4ge1xuICAgIGxldCB0YXNrcyA9IHN0b3JhZ2UuZ2V0KCd0YXNrcycpO1xuICAgIHRhc2tzLnNwbGljZShpbmRleCAtIDEsIDEpO1xuICAgIHRhc2tzID0gdGFza3MubWFwKCh0YXNrLCBpKSA9PiB7XG4gICAgICB0YXNrLmluZGV4ID0gaSArIDE7XG4gICAgICByZXR1cm4gdGFzaztcbiAgICB9KTtcbiAgICBzdG9yYWdlLnNldCgndGFza3MnLCB0YXNrcyk7XG4gICAgcmV0dXJuIHRhc2tzO1xuICB9O1xuXG4gIGNvbnN0IGNsZWFyQ29tcGxldGVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhc2tzID0gc3RvcmFnZS5nZXQoJ3Rhc2tzJyk7XG4gICAgbGV0IHVuQ29tcGxldGVkVGFza3MgPSB0YXNrcy5maWx0ZXIoKHRhc2spID0+ICF0YXNrLmNvbXBsZXRlZCk7XG4gICAgdW5Db21wbGV0ZWRUYXNrcyA9IHVuQ29tcGxldGVkVGFza3MubWFwKCh0YXNrLCBpbmRleCkgPT4ge1xuICAgICAgdGFzay5pbmRleCA9IGluZGV4ICsgMTtcbiAgICAgIHJldHVybiB0YXNrO1xuICAgIH0pO1xuICAgIHN0b3JhZ2Uuc2V0KCd0YXNrcycsIHVuQ29tcGxldGVkVGFza3MpO1xuICAgIHJldHVybiB1bkNvbXBsZXRlZFRhc2tzO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYWRkVGFzayxcbiAgICB1cGRhdGVUYXNrLFxuICAgIGNvbXBsZXRlVGFzayxcbiAgICBkZWxldGVUYXNrLFxuICAgIGNsZWFyQ29tcGxldGVkLFxuICB9O1xufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQgdGFza0FjdGlvbnM7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAnLi9zdHlsZS5jc3MnO1xuaW1wb3J0IHN0b3JhZ2UgZnJvbSAnLi9zdG9yYWdlLmpzJztcbmltcG9ydCB0YXNrQWN0aW9ucyBmcm9tICcuL3Rhc2tBY3Rpb25zLmpzJztcbmltcG9ydCBkb20gZnJvbSAnLi9kb20uanMnO1xuaW1wb3J0IHRhc2sgZnJvbSAnLi9UYXNrLmpzJztcblxuY29uc3QgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb3JtJyk7XG5jb25zdCB0b2RvVGV4dElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1ib29rJyk7XG5cbmNvbnN0IGdldERlZmF1bHRUYXNrcyA9ICgpID0+IHtcbiAgY29uc3QgdGFza3MgPSB0YXNrLmdldCgpO1xuICBjb25zdCBzdG9yZWRUYXNrcyA9IHN0b3JhZ2UuZ2V0KCd0YXNrcycpO1xuICBpZiAoc3RvcmVkVGFza3MpIHtcbiAgICBzdG9yZWRUYXNrcy5tYXAoKHQpID0+IHRhc2suYWRkKHQpKTtcbiAgICBkb20ucmVuZGVyVGFza3Moc3RvcmVkVGFza3MpO1xuICB9IGVsc2Uge1xuICAgIHN0b3JhZ2Uuc2V0KCd0YXNrcycsIHRhc2tzKTtcbiAgICBkb20ucmVuZGVyVGFza3ModGFza3MpO1xuICB9XG59O1xuXG5mb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3Qgc2F2ZWRUYXNrID0gdGFza0FjdGlvbnMuYWRkVGFzayh0b2RvVGV4dElucHV0LnZhbHVlKTtcbiAgdGFzay5hZGQoc2F2ZWRUYXNrKTtcbiAgY29uc3QgdGFza3MgPSB0YXNrLmdldCgpO1xuICBkb20ucmVuZGVyVGFza3ModGFza3MpO1xufSk7XG5cbmdldERlZmF1bHRUYXNrcygpO1xuZG9tLnVwZGF0ZVVJKHN0b3JhZ2UuZ2V0KCd0YXNrcycpKTtcbmRvbS5zaG93VHJhc2hJY29uKCk7XG5kb20uZWRpdFRhc3RTdWJtaXQodGFzayk7XG5kb20uY29tcGxldGVUYXNrSGFuZGxlcigpO1xuZG9tLmRlbGV0ZVRhc2tIYW5kbGVyKCk7XG5kb20uY2xlYXJDb21wbGV0ZWRIYW5kbGVyKCk7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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dUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7O0FDTnNDO0FBQ0Y7QUFDZjs7QUFFckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sOENBQVc7QUFDakI7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQWM7QUFDdEI7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxFQUFFLHFEQUFnQjtBQUNsQixFQUFFLGlEQUFjO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSw2Q0FBUTtBQUNWO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsRUFBRSxvREFBZTtBQUNqQjtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vc3JjL3N0eWxlLmNzcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9zdHlsZS5jc3M/NzE2MyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcyIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzIiwid2VicGFjazovL1RvX0RvX0xpc3QvLi9zcmMvcG9wdWxhdGUuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9zdGF0dXMuanMiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1RvX0RvX0xpc3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1RvX0RvX0xpc3Qvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9Ub19Eb19MaXN0L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vVG9fRG9fTGlzdC8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcImgxIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuc2VjdGlvbiB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuaDIge1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMiU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuYnV0dG9uIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uY29udGFpbmVyIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgbWF4LXdpZHRoOiA1MDBweDtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG9saXN0LWNvbnRhaW5lciB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XFxyXFxuICByb3ctZ2FwOiAycHg7XFxyXFxuICBib3gtc2hhZG93OiAxcHggMXB4IDVweCBncmF5O1xcclxcbn1cXHJcXG5cXHJcXG4uaWNvbiB7XFxyXFxuICB3aWR0aDogMTZweDtcXHJcXG4gIHdpZHRoOiAxNXB4O1xcclxcbiAgcGFkZGluZy1sZWZ0OiA1JTtcXHJcXG59XFxyXFxuXFxyXFxuLmlucHV0LWljb24ge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxcHg7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmljb24xIHtcXHJcXG4gIGZsb2F0OiByaWdodDtcXHJcXG4gIGNvbG9yOiByZ2IoMTQyLCAxNDcsIDE1MSk7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBmb250LXNpemU6IG1lZGl1bTtcXHJcXG4gIHBhZGRpbmctcmlnaHQ6IDIlO1xcclxcbn1cXHJcXG5cXHJcXG4udGFzayB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBwYWRkaW5nOiAzJTtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCB7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgbGlzdC1zdHlsZTogbm9uZTtcXHJcXG4gIGRpc3BsYXk6IGdyaWQ7XFxyXFxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XFxyXFxuICByb3ctZ2FwOiAycHg7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWlucHV0IHtcXHJcXG4gIHdpZHRoOiA4NSU7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBwYWRkaW5nOiAxMHB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1pbnB1dDpmb2N1cyB7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgcmdiKDEwMywgMTYwLCAxMSk7XFxyXFxufVxcclxcblxcclxcbmlucHV0OjpwbGFjZWhvbGRlciB7XFxyXFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxyXFxufVxcclxcblxcclxcbi50YXNrLWNoZWNrIHtcXHJcXG4gIG1hcmdpbi1yaWdodDogMiU7XFxyXFxufVxcclxcblxcclxcbi5saXN0IHtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBsaXN0LXN0eWxlOiBub25lO1xcclxcbiAgZGlzcGxheTogZ3JpZDtcXHJcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDIyNiwgMjIyLCAyMjIpO1xcclxcbiAgcm93LWdhcDogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY2xlYXJlciB7XFxyXFxuICBwYWRkaW5nOiAyJTtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIGZvbnQtc2l6ZTogMjBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBsaWdodGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uY2xlYXItY29udGFpbmVyIHtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmRyYWcge1xcclxcbiAgbWFyZ2luLWxlZnQ6IDhweDtcXHJcXG4gIGN1cnNvcjogbW92ZTtcXHJcXG4gIGNvbG9yOiBncmF5O1xcclxcbiAgZm9udC1zaXplOiAxOHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uZHJhZzphY3RpdmUge1xcclxcbiAgY3Vyc29yOiBncmFiYmluZztcXHJcXG59XFxyXFxuXFxyXFxuLnRhc2stdGV4dCB7XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7XFxyXFxuICBmb250LXdlaWdodDogNjAwO1xcclxcbn1cXHJcXG5cXHJcXG4udGFzay10ZXh0OmZvY3VzIHtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbiN0YXNrRm9ybSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC13cmFwOiBub3dyYXA7XFxyXFxufVxcclxcblxcclxcbiN0YXNrU3VibWl0IHtcXHJcXG4gIGZvbnQtc2l6ZTogMTZweDtcXHJcXG4gIHdpZHRoOiAyMCU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGN1cnNvcjogcG9pbnRlcjtcXHJcXG4gIHBhZGRpbmctbGVmdDogMTAlO1xcclxcbn1cXHJcXG5cXHJcXG4uY29tcGxldGVkIHtcXHJcXG4gIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xcclxcbn1cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0Usa0JBQWtCO0FBQ3BCOztBQUVBO0VBQ0UsV0FBVztFQUNYLGFBQWE7RUFDYixzQkFBc0I7RUFDdEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0UsU0FBUztFQUNULFdBQVc7RUFDWCx1QkFBdUI7QUFDekI7O0FBRUE7RUFDRSw2QkFBNkI7RUFDN0IsWUFBWTtBQUNkOztBQUVBO0VBQ0UsV0FBVztFQUNYLGdCQUFnQjtFQUNoQixhQUFhO0VBQ2Isc0JBQXNCO0VBQ3RCLG1CQUFtQjtBQUNyQjs7QUFFQTtFQUNFLFdBQVc7RUFDWCw0QkFBNEI7RUFDNUIsYUFBYTtFQUNiLDBCQUEwQjtFQUMxQixZQUFZO0VBQ1osNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsV0FBVztFQUNYLFdBQVc7RUFDWCxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsa0JBQWtCO0VBQ2xCLHVCQUF1QjtBQUN6Qjs7QUFFQTtFQUNFLFlBQVk7RUFDWix5QkFBeUI7RUFDekIsZUFBZTtFQUNmLGlCQUFpQjtFQUNqQixpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSx1QkFBdUI7RUFDdkIsYUFBYTtFQUNiLFdBQVc7QUFDYjs7QUFFQTtFQUNFLFVBQVU7RUFDVixTQUFTO0VBQ1QsZ0JBQWdCO0VBQ2hCLGFBQWE7RUFDYiwwQkFBMEI7RUFDMUIsNEJBQTRCO0VBQzVCLFlBQVk7QUFDZDs7QUFFQTtFQUNFLFVBQVU7RUFDVixZQUFZO0VBQ1osYUFBYTtFQUNiLHVCQUF1QjtFQUN2QixlQUFlO0VBQ2YsU0FBUztFQUNULHNCQUFzQjtBQUN4Qjs7QUFFQTtFQUNFLGFBQWE7RUFDYixtQ0FBbUM7QUFDckM7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSxVQUFVO0VBQ1YsU0FBUztFQUNULGdCQUFnQjtFQUNoQixhQUFhO0VBQ2IsMEJBQTBCO0VBQzFCLG9DQUFvQztFQUNwQyxZQUFZO0FBQ2Q7O0FBRUE7RUFDRSxXQUFXO0VBQ1gsZUFBZTtFQUNmLGVBQWU7RUFDZixvQkFBb0I7QUFDdEI7O0FBRUE7RUFDRSxrQkFBa0I7QUFDcEI7O0FBRUE7RUFDRSxnQkFBZ0I7RUFDaEIsWUFBWTtFQUNaLFdBQVc7RUFDWCxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZ0JBQWdCO0FBQ2xCOztBQUVBO0VBQ0UsWUFBWTtFQUNaLHNCQUFzQjtFQUN0QixXQUFXO0VBQ1gsaUNBQWlDO0VBQ2pDLGdCQUFnQjtBQUNsQjs7QUFFQTtFQUNFLGFBQWE7QUFDZjs7QUFFQTtFQUNFLGFBQWE7RUFDYixpQkFBaUI7QUFDbkI7O0FBRUE7RUFDRSxlQUFlO0VBQ2YsVUFBVTtFQUNWLHVCQUF1QjtFQUN2QixTQUFTO0VBQ1QsZUFBZTtFQUNmLGlCQUFpQjtBQUNuQjs7QUFFQTtFQUNFLDZCQUE2QjtBQUMvQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCJoMSB7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbnNlY3Rpb24ge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbmgyIHtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHBhZGRpbmc6IDIlO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbmJ1dHRvbiB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXHJcXG4gIGJvcmRlcjogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbnRhaW5lciB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIG1heC13aWR0aDogNTAwcHg7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi50b2RvbGlzdC1jb250YWluZXIge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlO1xcclxcbiAgZGlzcGxheTogZ3JpZDtcXHJcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xcclxcbiAgcm93LWdhcDogMnB4O1xcclxcbiAgYm94LXNoYWRvdzogMXB4IDFweCA1cHggZ3JheTtcXHJcXG59XFxyXFxuXFxyXFxuLmljb24ge1xcclxcbiAgd2lkdGg6IDE2cHg7XFxyXFxuICB3aWR0aDogMTVweDtcXHJcXG4gIHBhZGRpbmctbGVmdDogNSU7XFxyXFxufVxcclxcblxcclxcbi5pbnB1dC1pY29uIHtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMXB4O1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5pY29uMSB7XFxyXFxuICBmbG9hdDogcmlnaHQ7XFxyXFxuICBjb2xvcjogcmdiKDE0MiwgMTQ3LCAxNTEpO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgZm9udC1zaXplOiBtZWRpdW07XFxyXFxuICBwYWRkaW5nLXJpZ2h0OiAyJTtcXHJcXG59XFxyXFxuXFxyXFxuLnRhc2sge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgcGFkZGluZzogMyU7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWxpc3Qge1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGxpc3Qtc3R5bGU6IG5vbmU7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlO1xcclxcbiAgcm93LWdhcDogMnB4O1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1pbnB1dCB7XFxyXFxuICB3aWR0aDogODUlO1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgcGFkZGluZzogMTBweDtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8taW5wdXQ6Zm9jdXMge1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkIHJnYigxMDMsIDE2MCwgMTEpO1xcclxcbn1cXHJcXG5cXHJcXG5pbnB1dDo6cGxhY2Vob2xkZXIge1xcclxcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbn1cXHJcXG5cXHJcXG4udGFzay1jaGVjayB7XFxyXFxuICBtYXJnaW4tcmlnaHQ6IDIlO1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdCB7XFxyXFxuICBwYWRkaW5nOiAwO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgbGlzdC1zdHlsZTogbm9uZTtcXHJcXG4gIGRpc3BsYXk6IGdyaWQ7XFxyXFxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjYsIDIyMiwgMjIyKTtcXHJcXG4gIHJvdy1nYXA6IDJweDtcXHJcXG59XFxyXFxuXFxyXFxuLmNsZWFyZXIge1xcclxcbiAgcGFkZGluZzogMiU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBmb250LXNpemU6IDIwcHg7XFxyXFxuICBmb250LXdlaWdodDogbGlnaHRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmNsZWFyLWNvbnRhaW5lciB7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5kcmFnIHtcXHJcXG4gIG1hcmdpbi1sZWZ0OiA4cHg7XFxyXFxuICBjdXJzb3I6IG1vdmU7XFxyXFxuICBjb2xvcjogZ3JheTtcXHJcXG4gIGZvbnQtc2l6ZTogMThweDtcXHJcXG59XFxyXFxuXFxyXFxuLmRyYWc6YWN0aXZlIHtcXHJcXG4gIGN1cnNvcjogZ3JhYmJpbmc7XFxyXFxufVxcclxcblxcclxcbi50YXNrLXRleHQge1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmO1xcclxcbiAgZm9udC13ZWlnaHQ6IDYwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnRhc2stdGV4dDpmb2N1cyB7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4jdGFza0Zvcm0ge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGZsZXgtd3JhcDogbm93cmFwO1xcclxcbn1cXHJcXG5cXHJcXG4jdGFza1N1Ym1pdCB7XFxyXFxuICBmb250LXNpemU6IDE2cHg7XFxyXFxuICB3aWR0aDogMjAlO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDEwJTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbXBsZXRlZCB7XFxyXFxuICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDtcXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY3NzV2l0aE1hcHBpbmdUb1N0cmluZykge1xuICB2YXIgbGlzdCA9IFtdOyAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG5cbiAgbGlzdC50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiO1xuICAgICAgdmFyIG5lZWRMYXllciA9IHR5cGVvZiBpdGVtWzVdICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpO1xuICAgICAgfVxuXG4gICAgICBjb250ZW50ICs9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG5cbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTsgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcblxuXG4gIGxpc3QuaSA9IGZ1bmN0aW9uIGkobW9kdWxlcywgbWVkaWEsIGRlZHVwZSwgc3VwcG9ydHMsIGxheWVyKSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCB1bmRlZmluZWRdXTtcbiAgICB9XG5cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuXG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHRoaXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNbX2ldWzBdO1xuXG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgbW9kdWxlcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19pMl0pO1xuXG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbGF5ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtWzVdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBsYXllclwiLmNvbmNhdChpdGVtWzVdLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQoaXRlbVs1XSkgOiBcIlwiLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs1XSA9IGxheWVyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdXBwb3J0cykge1xuICAgICAgICBpZiAoIWl0ZW1bNF0pIHtcbiAgICAgICAgICBpdGVtWzRdID0gXCJcIi5jb25jYXQoc3VwcG9ydHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW1bMV0gPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVs0XSA9IHN1cHBvcnRzO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxpc3QucHVzaChpdGVtKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGxpc3Q7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXTtcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuXG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QgfHwgXCJcIikuY29uY2F0KHNvdXJjZSwgXCIgKi9cIik7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3N0eWxlLmNzc1wiO1xuICAgICAgXG4gICAgICBcblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5zdHlsZVRhZ1RyYW5zZm9ybSA9IHN0eWxlVGFnVHJhbnNmb3JtRm47XG5vcHRpb25zLnNldEF0dHJpYnV0ZXMgPSBzZXRBdHRyaWJ1dGVzO1xuXG4gICAgICBvcHRpb25zLmluc2VydCA9IGluc2VydEZuLmJpbmQobnVsbCwgXCJoZWFkXCIpO1xuICAgIFxub3B0aW9ucy5kb21BUEkgPSBkb21BUEk7XG5vcHRpb25zLmluc2VydFN0eWxlRWxlbWVudCA9IGluc2VydFN0eWxlRWxlbWVudDtcblxudmFyIHVwZGF0ZSA9IEFQSShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbmV4cG9ydCAqIGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3R5bGUuY3NzXCI7XG4gICAgICAgZXhwb3J0IGRlZmF1bHQgY29udGVudCAmJiBjb250ZW50LmxvY2FscyA/IGNvbnRlbnQubG9jYWxzIDogdW5kZWZpbmVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBzdHlsZXNJbkRPTSA9IFtdO1xuXG5mdW5jdGlvbiBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gIHZhciByZXN1bHQgPSAtMTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucykge1xuICB2YXIgaWRDb3VudE1hcCA9IHt9O1xuICB2YXIgaWRlbnRpZmllcnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcblxuICAgIGlmIChpbmRleEJ5SWRlbnRpZmllciAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXBkYXRlciA9IGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpO1xuICAgICAgb3B0aW9ucy5ieUluZGV4ID0gaTtcbiAgICAgIHN0eWxlc0luRE9NLnNwbGljZShpLCAwLCB7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IHVwZGF0ZXIsXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5cbmZ1bmN0aW9uIGFkZEVsZW1lbnRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIGFwaSA9IG9wdGlvbnMuZG9tQVBJKG9wdGlvbnMpO1xuICBhcGkudXBkYXRlKG9iaik7XG5cbiAgdmFyIHVwZGF0ZXIgPSBmdW5jdGlvbiB1cGRhdGVyKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXAgJiYgbmV3T2JqLnN1cHBvcnRzID09PSBvYmouc3VwcG9ydHMgJiYgbmV3T2JqLmxheWVyID09PSBvYmoubGF5ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG5cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG5cbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG5cbiAgICAgIGlmIChzdHlsZXNJbkRPTVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5ET01bX2luZGV4XS51cGRhdGVyKCk7XG5cbiAgICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIG1lbW8gPSB7fTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuXG5mdW5jdGlvbiBnZXRUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOyAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuXG4gICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgc3R5bGVUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9bdGFyZ2V0XSA9IHN0eWxlVGFyZ2V0O1xuICB9XG5cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuXG5cbmZ1bmN0aW9uIGluc2VydEJ5U2VsZWN0b3IoaW5zZXJ0LCBzdHlsZSkge1xuICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGluc2VydCk7XG5cbiAgaWYgKCF0YXJnZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICB9XG5cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRCeVNlbGVjdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuICBvcHRpb25zLnNldEF0dHJpYnV0ZXMoZWxlbWVudCwgb3B0aW9ucy5hdHRyaWJ1dGVzKTtcbiAgb3B0aW9ucy5pbnNlcnQoZWxlbWVudCwgb3B0aW9ucy5vcHRpb25zKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuXG4gIGlmIChub25jZSkge1xuICAgIHN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopIHtcbiAgdmFyIGNzcyA9IFwiXCI7XG5cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cblxuICBpZiAob2JqLm1lZGlhKSB7XG4gICAgY3NzICs9IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIik7XG4gIH1cblxuICB2YXIgbmVlZExheWVyID0gdHlwZW9mIG9iai5sYXllciAhPT0gXCJ1bmRlZmluZWRcIjtcblxuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG5cbiAgY3NzICs9IG9iai5jc3M7XG5cbiAgaWYgKG5lZWRMYXllcikge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgdmFyIHNvdXJjZU1hcCA9IG9iai5zb3VyY2VNYXA7XG5cbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9IC8vIEZvciBvbGQgSUVcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG5cblxuICBvcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdHlsZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cblxuZnVuY3Rpb24gZG9tQVBJKG9wdGlvbnMpIHtcbiAgdmFyIHN0eWxlRWxlbWVudCA9IG9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKG9iaikge1xuICAgICAgYXBwbHkoc3R5bGVFbGVtZW50LCBvcHRpb25zLCBvYmopO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KTtcbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHN0eWxlVGFnVHJhbnNmb3JtKGNzcywgc3R5bGVFbGVtZW50KSB7XG4gIGlmIChzdHlsZUVsZW1lbnQuc3R5bGVTaGVldCkge1xuICAgIHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZUVsZW1lbnQucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIHN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyIsImltcG9ydCB7IHNhdmVMb2NhbCB9IGZyb20gJy4vc3RhdHVzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZChsaXN0KSB7XG4gIGxpc3QucHVzaCh7IGRlc2NyaXB0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbmV3VGFzaycpLnZhbHVlLCBpc0NvbXBsZXRlZDogZmFsc2UsIGluZGV4OiBsaXN0Lmxlbmd0aCArIDEgfSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNuZXdUYXNrJykudmFsdWUgPSAnJztcbiAgc2F2ZUxvY2FsKGxpc3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlSW5kZXgobGlzdCkge1xuICBsZXQgaSA9IDE7XG4gIGxpc3QuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgIGVsZW0uaW5kZXggPSBpO1xuICAgIGkgKz0gMTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEb25lKGxpc3QpIHtcbiAgbGlzdCA9IGxpc3QuZmlsdGVyKChlbGVtKSA9PiBlbGVtLmlzQ29tcGxldGVkID09PSBmYWxzZSk7XG4gIHVwZGF0ZUluZGV4KGxpc3QpO1xuICBzYXZlTG9jYWwobGlzdCk7XG59IiwiZXhwb3J0IGZ1bmN0aW9uIHNhdmVMb2NhbChsaXN0KSB7XG4gIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbG9jYWxUYXNrcycsIEpTT04uc3RyaW5naWZ5KGxpc3QpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXR1cyhlbGVtLCBsaXN0KSB7XG4gIGxpc3QuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgIGlmICh0YXNrID09PSBlbGVtKSB7XG4gICAgICB0YXNrLmlzQ29tcGxldGVkID0gIXRhc2suaXNDb21wbGV0ZWQ7XG4gICAgfVxuICB9KTtcbiAgc2F2ZUxvY2FsKGxpc3QpO1xufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0aWQ6IG1vZHVsZUlkLFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgKiBhcyB0YXNrIGZyb20gJy4vcG9wdWxhdGUuanMnO1xuaW1wb3J0ICogYXMgc3RhdCBmcm9tICcuL3N0YXR1cy5qcyc7XG5pbXBvcnQgJy4vc3R5bGUuY3NzJztcblxubGV0IGxpc3QgPSBbXTtcbmNvbnN0IGxpc3RFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VsJyk7XG5cbmZ1bmN0aW9uIHRvZG9MaXN0KCkge1xuICBpZiAod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsb2NhbFRhc2tzJykpIHtcbiAgICBjb25zdCBsb2NhbFRhc2tzID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsb2NhbFRhc2tzJyk7XG4gICAgbGlzdCA9IEpTT04ucGFyc2UobG9jYWxUYXNrcyk7XG4gIH1cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvZG8tbGlzdCcpLmlubmVySFRNTCA9ICcnO1xuICBsaXN0LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICBjb25zdCB0YXNrRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7XG4gICAgdGFza0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGFzaycpO1xuICAgIGlmIChpdGVtLmlzQ29tcGxldGVkKSB7XG4gICAgICB0YXNrRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjb21wbGV0ZWQnKTtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3Rhc2stY2hlY2snKTtcbiAgICBjaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHN0YXQuc3RhdHVzKGl0ZW0sIGxpc3QpO1xuICAgICAgdG9kb0xpc3QoKTtcbiAgICB9KTtcbiAgICBjaGVja2JveC5jaGVja2VkID0gaXRlbS5pc0NvbXBsZXRlZDtcbiAgICB0YXNrRWxlbWVudC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgY29uc3QgdGFza1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHRhc2tUZXh0LmNsYXNzTGlzdCA9ICd0YXNrLXRleHQnO1xuICAgIHRhc2tUZXh0LnZhbHVlID0gaXRlbS5kZXNjcmlwdGlvbjtcbiAgICB0YXNrVGV4dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBpZiAodGFza1RleHQudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICBpdGVtLmRlc2NyaXB0aW9uID0gdGFza1RleHQudmFsdWU7XG4gICAgICAgIHN0YXQuc2F2ZUxvY2FsKGxpc3QpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRhc2tFbGVtZW50LmFwcGVuZENoaWxkKHRhc2tUZXh0KTtcblxuICAgIGNvbnN0IGRyYWdJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgZHJhZ0ljb24uY2xhc3NMaXN0ID0gJ2ZhciBmYS10cmFzaC1hbHQgZGVsZXRlQnRuJztcbiAgICB0YXNrRWxlbWVudC5hcHBlbmRDaGlsZChkcmFnSWNvbik7XG4gICAgdGFza0VsZW1lbnQuZHJhZ2dhYmxlID0gJ3RydWUnO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b2RvLWxpc3QnKS5hcHBlbmRDaGlsZCh0YXNrRWxlbWVudCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVJdGVtKGUpIHtcbiAgaWYgKCFlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2RlbGV0ZUJ0bicpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGJ0biA9IGUudGFyZ2V0O1xuICBsaXN0LmZvckVhY2goKHRhc2spID0+IHtcbiAgICBpZiAodGFzay5kZXNjcmlwdGlvbiA9PT0gYnRuLnBhcmVudEVsZW1lbnQuY2hpbGRyZW5bMV0udmFsdWUpIHtcbiAgICAgIGxpc3Quc3BsaWNlKGxpc3QuaW5kZXhPZih0YXNrKSwgMSk7XG4gICAgfVxuICB9KTtcbiAgYnRuLmNsb3Nlc3QoJ2xpJykucmVtb3ZlKCk7XG4gIHRhc2sudXBkYXRlSW5kZXgobGlzdCk7XG4gIHN0YXQuc2F2ZUxvY2FsKGxpc3QpO1xufVxuXG5saXN0RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZW1vdmVJdGVtKTtcbnRvZG9MaXN0KCk7XG5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdGFza0Zvcm0nKS5hZGRFdmVudExpc3RlbmVyKCdzdWJtaXQnLCAoZXZlbnQpID0+IHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgdGFzay5hZGQobGlzdCk7XG4gIHRvZG9MaXN0KCk7XG59KTtcbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbGVhcmVyJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gIHRhc2sucmVtb3ZlRG9uZShsaXN0KTtcbiAgdG9kb0xpc3QoKTtcbn0pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 diff --git a/package.json b/package.json old mode 100644 new mode 100755 diff --git a/src/Task.js b/src/Task.js deleted file mode 100644 index 1e8367e..0000000 --- a/src/Task.js +++ /dev/null @@ -1,33 +0,0 @@ -class Task { - constructor() { - this.tasks = []; - } - - get() { - return this.tasks; - } - - add(task) { - this.tasks.push(task); - } - - update(taskId, task) { - this.tasks[taskId] = task; - } - - remove(taskId) { - this.tasks = this.tasks.filter((task) => task.index.toString() !== taskId); - } - - clearCompleted() { - const newTasks = this.tasts.filter((task) => !task.completed); - this.tasks = newTasks.map((task, index) => { - task.index = index + 1; - return task; - }); - } -} - -const task = new Task(); - -export default task; \ No newline at end of file diff --git a/src/dom.js b/src/dom.js deleted file mode 100644 index f21ff58..0000000 --- a/src/dom.js +++ /dev/null @@ -1,120 +0,0 @@ -import taskActions from './taskActions.js'; - -const tasksList = document.querySelector('.tasks-list'); -const dom = (() => { - const showTrashIcon = () => { - const editBtns = document.querySelectorAll('.task-edit-btn'); - - editBtns.forEach((editBtn) => { - editBtn.addEventListener('click', (e) => { - const tasksElements = document.querySelectorAll('.task-container'); - tasksElements.forEach((taskElm) => { - taskElm.classList.remove('edit-mode'); - }); - const parent = e.target.parentNode.parentNode.parentNode; - parent.classList.add('edit-mode'); - }); - }); - }; - - const renderTasks = (tasks) => { - tasksList.innerHTML = ''; - tasks.map((task) => { - const taskItem = document.createElement('li'); - taskItem.classList.add('task-container', 'd-flex', 'flex-center'); - taskItem.innerHTML = ` -
    - -
    -
    - ${task.description} -
    - -
    -
    -
    - - -
    - `; - showTrashIcon(); - dom.deleteTaskHandler(); - dom.editTastSubmit(); - dom.completeTaskHandler(); - dom.clearCompletedHandler(); - return tasksList.appendChild(taskItem); - }); - }; - - const editTastSubmit = () => { - const editTaskForms = document.querySelectorAll('.edit-task-form'); - editTaskForms.forEach((form) => { - form.addEventListener('submit', (e) => { - e.preventDefault(); - const taskId = form.getAttribute('data-task-id'); - if (form.elements[0].value.trim() === '') return; - const { tasks } = taskActions.updateTask( - taskId, - form.elements[0].value, - ); - renderTasks(tasks); - }); - }); - }; - - const completeTaskHandler = () => { - const checkboxes = document.querySelectorAll('.task-checkbox'); - checkboxes.forEach((checkbox) => { - checkbox.addEventListener('change', (e) => { - const taskId = e.target.getAttribute('data-task-id'); - taskActions.completeTask(taskId, e.target.checked); - window.location.reload(); - }); - }); - }; - - const deleteTaskHandler = () => { - const deleteBtns = document.querySelectorAll('.task-delete-btn'); - deleteBtns.forEach((btn) => { - btn.addEventListener('click', () => { - const taskId = btn.getAttribute('data-task-id'); - const tasks = taskActions.deleteTask(taskId); - renderTasks(tasks); - }); - }); - }; - - const clearCompletedHandler = () => { - const clearCompletedBtn = document.querySelector('.clear-completed-btn'); - clearCompletedBtn.addEventListener('click', () => { - const tasks = taskActions.clearCompleted(); - renderTasks(tasks); - }); - }; - - const updateUI = (tasks) => { - renderTasks(tasks); - }; - - return { - renderTasks, - editTastSubmit, - showTrashIcon, - updateUI, - completeTaskHandler, - deleteTaskHandler, - clearCompletedHandler, - }; -})(); - -export default dom; diff --git a/src/index.html b/src/index.html index 8791c33..f2c0bab 100644 --- a/src/index.html +++ b/src/index.html @@ -1,43 +1,30 @@ - - - - - - - To Do List - - - - -
    -
    - Today's To Do - -
    - -
    -
    - - -
    -
    - - - -
    - -
    -
    - - - + + + + + + + To Do list + + + +
    +
    +
    +

    To Do Lists

    +
    +
    +

    Today's To Do

    +
    + + +
    +
      +
      + +
      +
      +
      +
      + \ No newline at end of file diff --git a/src/index.js b/src/index.js index 92b1133..6e04d52 100644 --- a/src/index.js +++ b/src/index.js @@ -1,37 +1,73 @@ +import * as task from './populate.js'; +import * as stat from './status.js'; import './style.css'; -import storage from './storage.js'; -import taskActions from './taskActions.js'; -import dom from './dom.js'; -import task from './Task.js'; -const form = document.getElementById('form'); -const todoTextInput = document.getElementById('add-book'); +let list = []; +const listEl = document.querySelector('ul'); -const getDefaultTasks = () => { - const tasks = task.get(); - const storedTasks = storage.get('tasks'); - if (storedTasks) { - storedTasks.map((t) => task.add(t)); - dom.renderTasks(storedTasks); - } else { - storage.set('tasks', tasks); - dom.renderTasks(tasks); +function todoList() { + if (window.localStorage.getItem('localTasks')) { + const localTasks = window.localStorage.getItem('localTasks'); + list = JSON.parse(localTasks); } -}; + document.querySelector('.todo-list').innerHTML = ''; + list.forEach((item) => { + const taskElement = document.createElement('li'); + taskElement.classList.add('task'); + if (item.isCompleted) { + taskElement.classList.add('completed'); + } + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.classList.add('task-check'); + checkbox.addEventListener('click', () => { + stat.status(item, list); + todoList(); + }); + checkbox.checked = item.isCompleted; + taskElement.appendChild(checkbox); + const taskText = document.createElement('input'); + taskText.classList = 'task-text'; + taskText.value = item.description; + taskText.addEventListener('change', () => { + if (taskText.value.length > 0) { + item.description = taskText.value; + stat.saveLocal(list); + } + }); + taskElement.appendChild(taskText); -form.addEventListener('submit', (e) => { - e.preventDefault(); - const savedTask = taskActions.addTask(todoTextInput.value); - task.add(savedTask); - const tasks = task.get(); - dom.renderTasks(tasks); - todoTextInput.value = ''; -}); + const dragIcon = document.createElement('button'); + dragIcon.classList = 'far fa-trash-alt deleteBtn'; + taskElement.appendChild(dragIcon); + taskElement.draggable = 'true'; + document.querySelector('.todo-list').appendChild(taskElement); + }); +} + +function removeItem(e) { + if (!e.target.classList.contains('deleteBtn')) { + return; + } + const btn = e.target; + list.forEach((task) => { + if (task.description === btn.parentElement.children[1].value) { + list.splice(list.indexOf(task), 1); + } + }); + btn.closest('li').remove(); + task.updateIndex(list); + stat.saveLocal(list); +} -getDefaultTasks(); -dom.updateUI(storage.get('tasks')); -dom.showTrashIcon(); -dom.editTastSubmit(task); -dom.completeTaskHandler(); -dom.deleteTaskHandler(); -dom.clearCompletedHandler(); \ No newline at end of file +listEl.addEventListener('click', removeItem); +todoList(); +document.querySelector('#taskForm').addEventListener('submit', (event) => { + event.preventDefault(); + task.add(list); + todoList(); +}); +document.querySelector('.clearer').addEventListener('click', () => { + task.removeDone(list); + todoList(); +}); diff --git a/src/populate.js b/src/populate.js new file mode 100644 index 0000000..d79e7a7 --- /dev/null +++ b/src/populate.js @@ -0,0 +1,21 @@ +import { saveLocal } from './status.js'; + +export function add(list) { + list.push({ description: document.querySelector('#newTask').value, isCompleted: false, index: list.length + 1 }); + document.querySelector('#newTask').value = ''; + saveLocal(list); +} + +export function updateIndex(list) { + let i = 1; + list.forEach((elem) => { + elem.index = i; + i += 1; + }); +} + +export function removeDone(list) { + list = list.filter((elem) => elem.isCompleted === false); + updateIndex(list); + saveLocal(list); +} \ No newline at end of file diff --git a/src/status.js b/src/status.js new file mode 100644 index 0000000..9451020 --- /dev/null +++ b/src/status.js @@ -0,0 +1,12 @@ +export function saveLocal(list) { + window.localStorage.setItem('localTasks', JSON.stringify(list)); +} + +export function status(elem, list) { + list.forEach((task) => { + if (task === elem) { + task.isCompleted = !task.isCompleted; + } + }); + saveLocal(list); +} \ No newline at end of file diff --git a/src/storage.js b/src/storage.js deleted file mode 100644 index c7ec992..0000000 --- a/src/storage.js +++ /dev/null @@ -1,13 +0,0 @@ -const storage = { - get: (key) => { - const value = localStorage.getItem(key); - return value ? JSON.parse(value) : null; - }, - set: (key, value) => { - localStorage.setItem(key, JSON.stringify(value)); - }, - remove: (key) => { - localStorage.removeItem(key); - }, -}; -export default storage; \ No newline at end of file diff --git a/src/style.css b/src/style.css index fd4bd4d..99f657c 100644 --- a/src/style.css +++ b/src/style.css @@ -1,209 +1,159 @@ -:root { - --primary: rgb(71, 69, 69); - --secondary: #ccc; - --border: rgb(221, 219, 219); - --background: rgb(243, 243, 243); -} - -* { - box-sizing: border-box; - padding: 0; - margin: 0; -} - -.d-flex { - display: flex; -} - -.flex-center { - align-items: center; -} - -body { - width: 100%; - min-height: 100vh; - background-color: var(--background); - font-size: 1.4rem; -} - -i { - cursor: pointer; - color: var(--secondary); -} - -section { - background-color: #fff; - width: 50%; - min-width: 300px; - box-shadow: 0 3px 10px rgb(0 0 0 / 20%); - border-radius: 6px; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - -.header { - border-bottom: 1px solid var(--border); - padding: 1.2rem 1.5rem; - color: var(--primary); - justify-content: space-between; -} - -form button { - background-color: transparent; - border: none; - padding: 0.6rem; -} - -form button i { - transform: rotate(90deg); - font-size: 1rem; - font-weight: 400; -} - -.header i { - transform: rotate(90deg); - font-size: 18px; -} - -form > div { - border-bottom: 1px solid var(--border); - padding: 0.7rem 1.5rem; - justify-content: space-between; - width: 100%; -} - -form input { - border: none; - outline: none; - min-width: 250px; - padding: 0.8rem 0; - flex: 1; -} - -form input, -form input::-webkit-input-placeholder { - font-size: 1.2rem; - font-family: 'Roboto', sans-serif; - font-style: italic; - font-weight: 100; - color: rgb(131, 130, 130); -} - -.tasks-list { - min-width: 100%; -} - -.tasks-list li { - width: 100%; - list-style: none; - border-bottom: 1px solid var(--border); - padding: 0.7rem 1.2rem; -} - -.task-container button i { - font-size: 1.2rem; -} - -.tasks-list li label { - margin-left: 6px; - font-size: inherit; - color: var(--primary); - cursor: pointer; -} - -/* .tasks-list li label.compeleted { - text-decoration: line-through; - font-style: italic; - color: var(--secondary); -} */ - -.tasks-list li i:hover { - color: var(--primary); - cursor: pointer; -} - -.clear-btn button { - width: 100%; - font-size: inherit; - padding: 1.2rem; - border: none; - outline: none; - color: var(--secondary); - background-color: var(--background); - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - cursor: pointer; -} - -.task-container .task-details { - flex: 1; - display: flex; - padding: 0 1rem; -} - -.task-container .task-details span { - margin-left: 6px; - font-size: inherit; - color: var(--primary); -} - -.task-container .task-details span.compeleted { - text-decoration: line-through; -} - -.task-container .task-details input { - border: none; - font-size: inherit; - color: var(--primary); - outline: none; - flex: 1; - display: none; - background-color: transparent; -} - -.task-container .task-action-btns button { - width: 2.2rem; - background-color: transparent; - border: none; - cursor: pointer; - padding: 0.3rem 0; -} - -.task-container .task-action-btns button i { - padding: 0.6rem; -} - -.task-container .task-action-btns button:last-child { - display: none; -} - -.edit-task-form { - flex: 1; - display: flex; -} - -.task-container.edit-mode { - background-color: #faf3db; -} - -.task-container.edit-mode .task-action-btns button:last-child { - display: block; -} - -.task-details.completed span { - text-decoration: line-through; -} - -.task-container.edit-mode .task-action-btns button:first-child { - display: none; -} - -.task-container.edit-mode .task-details input { - display: block; -} - -.task-container.edit-mode .task-details span { - display: none; -} +h1 { + text-align: center; +} + +section { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +h2 { + margin: 0; + padding: 2%; + background-color: white; +} + +button { + background-color: transparent; + border: none; +} + +.container { + width: 100%; + max-width: 500px; + display: flex; + flex-direction: column; + align-items: center; +} + +.todolist-container { + width: 100%; + background-color: whitesmoke; + display: grid; + grid-template-columns: 1fr; + row-gap: 2px; + box-shadow: 1px 1px 5px gray; +} + +.icon { + width: 16px; + width: 15px; + padding-left: 5%; +} + +.input-icon { + width: 100%; + margin-bottom: 1px; + background-color: white; +} + +.icon1 { + float: right; + color: rgb(142, 147, 151); + cursor: pointer; + font-size: medium; + padding-right: 2%; +} + +.task { + background-color: white; + display: flex; + padding: 3%; +} + +.todo-list { + padding: 0; + margin: 0; + list-style: none; + display: grid; + grid-template-columns: 1fr; + background-color: whitesmoke; + row-gap: 2px; +} + +.todo-input { + width: 85%; + border: none; + padding: 10px; + background-color: white; + cursor: pointer; + margin: 0; + box-sizing: border-box; +} + +.todo-input:focus { + outline: none; + border: 2px solid rgb(103, 160, 11); +} + +input::placeholder { + font-style: italic; +} + +.task-check { + margin-right: 2%; +} + +.list { + padding: 0; + margin: 0; + list-style: none; + display: grid; + grid-template-columns: 1fr; + background-color: rgb(226, 222, 222); + row-gap: 2px; +} + +.clearer { + padding: 2%; + cursor: pointer; + font-size: 20px; + font-weight: lighter; +} + +.clear-container { + text-align: center; +} + +.drag { + margin-left: 8px; + cursor: move; + color: gray; + font-size: 18px; +} + +.drag:active { + cursor: grabbing; +} + +.task-text { + border: none; + box-sizing: border-box; + width: 100%; + font-family: 'Roboto', sans-serif; + font-weight: 600; +} + +.task-text:focus { + outline: none; +} + +#taskForm { + display: flex; + flex-wrap: nowrap; +} + +#taskSubmit { + font-size: 16px; + width: 20%; + background-color: white; + margin: 0; + cursor: pointer; + padding-left: 10%; +} + +.completed { + text-decoration: line-through; +} diff --git a/src/taskActions.js b/src/taskActions.js deleted file mode 100644 index c38bb50..0000000 --- a/src/taskActions.js +++ /dev/null @@ -1,63 +0,0 @@ -import storage from './storage.js'; - -const taskActions = (() => { - const addTask = (description) => { - const tasks = storage.get('tasks'); - const task = { - index: tasks.length + 1, - completed: false, - description, - }; - tasks.push(task); - storage.set('tasks', tasks); - return task; - }; - - const updateTask = (index, description) => { - const tasks = storage.get('tasks'); - const task = tasks[index - 1]; - task.description = description; - storage.set('tasks', tasks); - return { task, tasks }; - }; - - const completeTask = (index, checked) => { - const tasks = storage.get('tasks'); - const task = tasks[index - 1]; - task.completed = checked; - storage.set('tasks', tasks); - return { task, tasks }; - }; - - const deleteTask = (index) => { - let tasks = storage.get('tasks'); - tasks.splice(index - 1, 1); - tasks = tasks.map((task, i) => { - task.index = i + 1; - return task; - }); - storage.set('tasks', tasks); - return tasks; - }; - - const clearCompleted = () => { - const tasks = storage.get('tasks'); - let unCompletedTasks = tasks.filter((task) => !task.completed); - unCompletedTasks = unCompletedTasks.map((task, index) => { - task.index = index + 1; - return task; - }); - storage.set('tasks', unCompletedTasks); - return unCompletedTasks; - }; - - return { - addTask, - updateTask, - completeTask, - deleteTask, - clearCompleted, - }; -})(); - -export default taskActions; \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js old mode 100644 new mode 100755