CINXE.COM
GitHub - blockspacer/flextool: C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.)
<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-3e154969b9f9.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-9c5b7a476542.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-afda8eb0fb33.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-2494e44ccdc5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-56fff47acadc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-71cd4cc132ec.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fd5499848985.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-31d17ba3e139.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-68d6b2c79663.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-4cf0d59ab51a.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-af846850481e.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-8b10f05a77e6.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-2f6e722088eb.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-9c77ed90200e.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-a0610fd00b47.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["copilot_immersive_title_favicon","copilot_new_references_ui","copilot_beta_features_opt_in","copilot_chat_static_thread_suggestions","copilot_conversational_ux_history_refs","copilot_implicit_context","copilot_smell_icebreaker_ux","experimentation_azure_variant_endpoint","failbot_handle_non_errors","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","hovercard_accessibility","issues_react_new_timeline","issues_react_avatar_refactor","issues_react_remove_placeholders","issues_react_blur_item_picker_on_close","marketing_pages_search_explore_provider","react_keyboard_shortcuts_dialog","remove_child_patch","sample_network_conn_type","site_metered_billing_update","lifecycle_label_name_updates"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-54d03e99b237.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-aff936e590ed.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-3abb8f-3f7d38a7b47d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-93b6a0551aa9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-7b93e0f0c8ff.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-4aa4b0e95669.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-6d3967acd51c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_combobox-nav_dist_index_js-node_modules_github_g-emoji-element_di-6ce195-53781cbc550f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-8e9f78-a74b4e0a8a6b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-f5498b8d4e5d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-492b5042c841.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-381a4f-a11b2f0361af.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-aa9238e3dc93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-477414219299.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-bb80ec-634de60bacfa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-ce7225a304c5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-f8a5485c982a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-d2aff86c7695.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-6cf3320416b8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-0e07cc183eed.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-69cfcc-ceb1758d1876.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-3f0e021c7215.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-24e9d16a679d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-7cbef09a422c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-d0d0a6-0e9fa537dc4f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-fb43816ab83c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-5631d4370dcb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-3366f6b6298e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_virtualized-list_es_index_js-node_modules_github_template-parts_lib_index_js-96453a51f920.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-70450e-eecf0d50276f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_ref-selector_ts-5f691453c17a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/codespaces-c772596e0c4a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-3eebbd-3db38ec23e06.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_decorators_js-node_modules_delegated-events_di-e161aa-c2a0ad78c9c9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_github_remote--3c9c82-b40c741b02c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repositories-20529d793dc5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-9b97703a4e6a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-13971a40799a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-e40bb86d3e93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-37e3d5-31653d7f2342.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-074052b7d26b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-3eda30673b32.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-e40bb86d3e93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-37e3d5-31653d7f2342.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-074052b7d26b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-3eda30673b32.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>GitHub - blockspacer/flextool: C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.)</title> <meta name="route-pattern" content="/:user_id/:repository" data-turbo-transient> <meta name="route-controller" content="files" data-turbo-transient> <meta name="route-action" content="disambiguate" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="E0DA:1F11DA:2B5E84:31F2C1:674F58A6" data-pjax-transient="true"/><meta name="html-safe-nonce" content="aeb2920d772a3bd6c652f85f76eab568b11840825c7f0be1e9188ddaf2def7d6" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFMERBOjFGMTFEQToyQjVFODQ6MzFGMkMxOjY3NEY1OEE2IiwidmlzaXRvcl9pZCI6IjMyNDAwNTM3NzcxMzUyNjE4NjIiLCJyZWdpb25fZWRnZSI6InNvdXRoZWFzdGFzaWEiLCJyZWdpb25fcmVuZGVyIjoic291dGhlYXN0YXNpYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="a896eb2809ef14c54964a71fa4ebf9337917c77e3cc9b9cfc259d183416ed897" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:261573419" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/<user-name>/<repo-name>" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.) - blockspacer/flextool"> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/blockspacer/flextool" /> <meta name="twitter:image" content="https://opengraph.githubassets.com/d0de01ac20cf46031ae766e1964436940143fb4207f797401d6bad4e80a0fad6/blockspacer/flextool" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="GitHub - blockspacer/flextool: C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.)" /><meta name="twitter:description" content="C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.) - blockspacer/flextool" /> <meta property="og:image" content="https://opengraph.githubassets.com/d0de01ac20cf46031ae766e1964436940143fb4207f797401d6bad4e80a0fad6/blockspacer/flextool" /><meta property="og:image:alt" content="C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.) - blockspacer/flextool" /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="GitHub - blockspacer/flextool: C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.)" /><meta property="og:url" content="https://github.com/blockspacer/flextool" /><meta property="og:description" content="C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.) - blockspacer/flextool" /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="a3fccbbc47e59efe5da179856996add616f03e34d3398e2c6cd7ed1869365f99" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="ace39c3b6632770952207593607e6e0be0db363435a8b877b1f96abe6430f345" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="3adbaefc258174e49a9472f62ba4ed262e7c0112f9e7266a3e927bd7b898716f" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="4beabdd0fbb99b09cd036910100c0444b454c234ffa1d1e7fa9530b1077bb7ab" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/blockspacer/flextool git https://github.com/blockspacer/flextool.git"> <meta name="octolytics-dimension-user_id" content="35254900" /><meta name="octolytics-dimension-user_login" content="blockspacer" /><meta name="octolytics-dimension-repository_id" content="261573419" /><meta name="octolytics-dimension-repository_nwo" content="blockspacer/flextool" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="261573419" /><meta name="octolytics-dimension-repository_network_root_nwo" content="blockspacer/flextool" /> <link rel="canonical" href="https://github.com/blockspacer/flextool" data-turbo-transient> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ui-commands_ui-commands_ts-3f8e5a72ee96.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-a6c605212a80.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-9df03b4ed507.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-8fa3b694f335.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Logomark;ref_loc:Header"}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Fblockspacer%2Fflextool" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/blockspacer/flextool","user_id":null}}" data-hydro-click-hmac="a99a5f60ec809995f8125726819b186d159b5b953d1aed6ac22d9a32e4caf5b6" data-analytics-event="{"category":"Marketing nav","action":"click to Sign in","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"product","tag":"link","label":"github_copilot_link_product_navbar"}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"security","context":"product","tag":"link","label":"security_link_product_navbar"}" href="https://github.com/features/security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"actions","context":"product","tag":"link","label":"actions_link_product_navbar"}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"codespaces","context":"product","tag":"link","label":"codespaces_link_product_navbar"}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"issues","context":"product","tag":"link","label":"issues_link_product_navbar"}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"code_review","context":"product","tag":"link","label":"code_review_link_product_navbar"}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"discussions","context":"product","tag":"link","label":"discussions_link_product_navbar"}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"code_search","context":"product","tag":"link","label":"code_search_link_product_navbar"}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"all_features","context":"product","tag":"link","label":"all_features_link_product_navbar"}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"documentation","context":"product","tag":"link","label":"documentation_link_product_navbar"}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"github_skills","context":"product","tag":"link","label":"github_skills_link_product_navbar"}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"blog","context":"product","tag":"link","label":"blog_link_product_navbar"}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"enterprises","context":"solutions","tag":"link","label":"enterprises_link_solutions_navbar"}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"small_and_medium_teams","context":"solutions","tag":"link","label":"small_and_medium_teams_link_solutions_navbar"}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"startups","context":"solutions","tag":"link","label":"startups_link_solutions_navbar"}" href="https://github.com/enterprise/startups"> Startups </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devsecops","context":"solutions","tag":"link","label":"devsecops_link_solutions_navbar"}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"solutions","tag":"link","label":"devops_link_solutions_navbar"}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ci_cd","context":"solutions","tag":"link","label":"ci_cd_link_solutions_navbar"}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_use_cases","context":"solutions","tag":"link","label":"view_all_use_cases_link_solutions_navbar"}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"healthcare","context":"solutions","tag":"link","label":"healthcare_link_solutions_navbar"}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"financial_services","context":"solutions","tag":"link","label":"financial_services_link_solutions_navbar"}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"manufacturing","context":"solutions","tag":"link","label":"manufacturing_link_solutions_navbar"}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"government","context":"solutions","tag":"link","label":"government_link_solutions_navbar"}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_industries","context":"solutions","tag":"link","label":"view_all_industries_link_solutions_navbar"}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ai","context":"resources","tag":"link","label":"ai_link_resources_navbar"}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"resources","tag":"link","label":"devops_link_resources_navbar"}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"security","context":"resources","tag":"link","label":"security_link_resources_navbar"}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"software_development","context":"resources","tag":"link","label":"software_development_link_resources_navbar"}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all","context":"resources","tag":"link","label":"view_all_link_resources_navbar"}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"learning_pathways","context":"resources","tag":"link","label":"learning_pathways_link_resources_navbar"}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"white_papers_ebooks_webinars","context":"resources","tag":"link","label":"white_papers_ebooks_webinars_link_resources_navbar"}" href="https://resources.github.com"> White papers, Ebooks, Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"customer_stories","context":"resources","tag":"link","label":"customer_stories_link_resources_navbar"}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"partners","context":"resources","tag":"link","label":"partners_link_resources_navbar"}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"github_sponsors","context":"open_source","tag":"link","label":"github_sponsors_link_open_source_navbar"}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"the_readme_project","context":"open_source","tag":"link","label":"the_readme_project_link_open_source_navbar"}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"topics","context":"open_source","tag":"link","label":"topics_link_open_source_navbar"}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"trending","context":"open_source","tag":"link","label":"trending_link_open_source_navbar"}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"collections","context":"open_source","tag":"link","label":"collections_link_open_source_navbar"}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"enterprise_platform","context":"enterprise","tag":"link","label":"enterprise_platform_link_enterprise_navbar"}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"advanced_security","context":"enterprise","tag":"link","label":"advanced_security_link_enterprise_navbar"}" href="https://github.com/enterprise/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"enterprise","tag":"link","label":"github_copilot_link_enterprise_navbar"}" href="/features/copilot#enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"premium_support","context":"enterprise","tag":"link","label":"premium_support_link_enterprise_navbar"}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{"location":"navbar","action":"pricing","context":"global","tag":"link","label":"pricing_link_global_navbar"}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:blockspacer/flextool" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="TQ9ZOpBNEwPT5I1XSWxhfNbZwKuLKX6ODLr1LaHMad_SDrGeG32s1bISTLuvELeRZ9JpDIUz3rcnH5ya3aDfcw" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="blockspacer/flextool" data-current-org="" data-current-owner="blockspacer" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{"location":"navbar","action":"searchbar","context":"global","tag":"input","label":"searchbar_input_global_navbar"}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-a34b0dae-eb18-410e-8625-e803404639bd" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-a34b0dae-eb18-410e-8625-e803404639bd" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2"> Search syntax tips </a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="nFXT7PWq3EjJQSU5Shh7MNd/ZHffHyI4NAyQRnumDGcZh/I0EOVdjT5pwux1DqgHAge54C/MgBll4o+z4d/Pig==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="KE3tpH+L987w+pPS6HQeiMoV2FChdLRey4AJsj1XHvcAbR2m6WYBg6L74rNpw4mv/iiHc7Gc5sKrkCapiVHj6g==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="ZWOTCaGF1aMmZKH7siyHplnUyq2BVOp/wlCFobJkaeYDSArI0xQw72L32vYyo+Ttg5RBoa3RQ7JReFJZybbjhg==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Fblockspacer%2Fflextool" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/blockspacer/flextool","user_id":null}}" data-hydro-click-hmac="a99a5f60ec809995f8125726819b186d159b5b953d1aed6ac22d9a32e4caf5b6" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&source=header-repo&source_repo=blockspacer%2Fflextool" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/blockspacer/flextool","user_id":null}}" data-hydro-click-hmac="a99a5f60ec809995f8125726819b186d159b5b953d1aed6ac22d9a32e4caf5b6" data-analytics-event="{"category":"Sign up","action":"click to sign up for account","label":"ref_page:/<user-name>/<repo-name>;ref_cta:Sign up;ref_loc:header logged out"}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-e43820e8-0330-4e9f-abf4-c34af67a54d5" aria-labelledby="tooltip-5fe117d8-0a0c-4c4b-86d5-03e4f6cc1c10" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-5fe117d8-0a0c-4c4b-86d5-03e4f6cc1c10" for="icon-button-e43820e8-0330-4e9f-abf4-c34af67a54d5" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="user" data-hovercard-url="/users/blockspacer/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/blockspacer"> blockspacer </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/blockspacer/flextool">flextool</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <a href="/login?return_to=%2Fblockspacer%2Fflextool" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/blockspacer/flextool","user_id":null}}" data-hydro-click-hmac="ad4bded3cc9664d6d09ffe85ba82de462ae33c2463294adf1990d9519b624c8d" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-3a930152-3156-4258-a0a3-621c00af2f78" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2Fblockspacer%2Fflextool" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"repo details fork button","repository_id":261573419,"auth_type":"LOG_IN","originating_url":"https://github.com/blockspacer/flextool","user_id":null}}" data-hydro-click-hmac="daefe08e8551f9b3ed3032c3104748e47dfb50ee6ffb0d4ce5c978e1aef73a9d" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="4" data-view-component="true" class="Counter">4</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Fblockspacer%2Fflextool" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":261573419,"auth_type":"LOG_IN","originating_url":"https://github.com/blockspacer/flextool","user_id":null}}" data-hydro-click-hmac="6ea0118ef43095088824821de6bbfb26b49aa48e7bef8b0fab9c6cf2909184cc" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="41 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="41" data-view-component="true" class="Counter js-social-count">41</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> <div class="d-block d-md-none mb-2 px-3 px-md-4 px-lg-5"> <p class="f4 mb-3 "> C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.) </p> <div class="mb-2 d-flex flex-items-center Link--secondary"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link flex-shrink-0 mr-2"> <path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path> </svg> <span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit"> <a title="https://blockspacer.github.io/flex_docs/" role="link" target="_blank" class="text-bold" rel="noopener noreferrer" href="https://blockspacer.github.io/flex_docs/">blockspacer.github.io/flex_docs/</a> </span> </div> <h3 class="sr-only">License</h3> <div class="mb-2"> <a href="/blockspacer/flextool/blob/master/LICENSE" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <div class="mb-3"> <a class="Link--secondary no-underline mr-3" href="/blockspacer/flextool/stargazers"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-1"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <span class="text-bold">41</span> stars </a> <a class="Link--secondary no-underline mr-3" href="/blockspacer/flextool/forks"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-1"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <span class="text-bold">4</span> forks </a> <a class="Link--secondary no-underline mr-3 d-inline-block" href="/blockspacer/flextool/branches"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-branch mr-1"> <path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path> </svg> <span>Branches</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/blockspacer/flextool/tags"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag mr-1"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <span>Tags</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/blockspacer/flextool/activity"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-1"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span>Activity</span> </a> </div> <div class="d-flex flex-wrap gap-2"> <div class="flex-1"> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Fblockspacer%2Fflextool" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":261573419,"auth_type":"LOG_IN","originating_url":"https://github.com/blockspacer/flextool","user_id":null}}" data-hydro-click-hmac="6ea0118ef43095088824821de6bbfb26b49aa48e7bef8b0fab9c6cf2909184cc" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> </a></div> </div> <div class="flex-1"> <a href="/login?return_to=%2Fblockspacer%2Fflextool" rel="nofollow" id="files-overview-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/blockspacer/flextool","user_id":null}}" data-hydro-click-hmac="ad4bded3cc9664d6d09ffe85ba82de462ae33c2463294adf1990d9519b624c8d" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-329fec43-cac9-4250-a491-57e6c04b58d8" for="files-overview-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </div> <span> </span> </div> </div> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/blockspacer/flextool" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /blockspacer/flextool" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Code","target":"UNDERLINE_NAV.TAB"}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/blockspacer/flextool/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /blockspacer/flextool/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Issues","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="3" data-view-component="true" class="Counter">3</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/blockspacer/flextool/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /blockspacer/flextool/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Pull requests","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/blockspacer/flextool/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /blockspacer/flextool/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Actions","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="projects-tab" href="/blockspacer/flextool/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /blockspacer/flextool/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Projects","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> <span data-content="Projects">Projects</span> <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/blockspacer/flextool/security" data-tab-item="i5security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /blockspacer/flextool/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Security","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/blockspacer/flextool/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/blockspacer/flextool/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /blockspacer/flextool/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Insights","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-c28a9486-a2a3-433d-b7bc-62635070be2e-button" popovertarget="action-menu-c28a9486-a2a3-433d-b7bc-62635070be2e-overlay" aria-controls="action-menu-c28a9486-a2a3-433d-b7bc-62635070be2e-list" aria-haspopup="true" aria-labelledby="tooltip-96e96f42-2637-4040-af4c-d0187ab0b6bf" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-96e96f42-2637-4040-af4c-d0187ab0b6bf" for="action-menu-c28a9486-a2a3-433d-b7bc-62635070be2e-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position id="action-menu-c28a9486-a2a3-433d-b7bc-62635070be2e-overlay" anchor="action-menu-c28a9486-a2a3-433d-b7bc-62635070be2e-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-c28a9486-a2a3-433d-b7bc-62635070be2e-button" id="action-menu-c28a9486-a2a3-433d-b7bc-62635070be2e-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-71058146-e24d-43cf-95dc-158a39698c67" href="/blockspacer/flextool" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-14ae09d5-3ac3-4505-a723-3213ab3c2097" href="/blockspacer/flextool/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-1015c83b-bc81-4b9a-a890-a9707863a56f" href="/blockspacer/flextool/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-a7a503c3-2df2-4c55-9958-7c4780c69776" href="/blockspacer/flextool/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-b0d7e587-0158-4957-a7c8-8d15efb1d475" href="/blockspacer/flextool/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Projects </span> </a> </li> <li hidden="hidden" data-menu-item="i5security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-7ae1458d-6c74-4f0e-a8f3-b4b70379ce86" href="/blockspacer/flextool/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-dae9242b-939e-42cb-8c80-db37daf6240d" href="/blockspacer/flextool/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <h1 class='sr-only'>blockspacer/flextool</h1> <div class="clearfix container-xl px-md-4 px-lg-5 px-3"> <div> <div style="max-width: 100%" data-view-component="true" class="Layout Layout--flowRow-until-md react-repos-overview-margin Layout--sidebarPosition-end Layout--sidebarPosition-flowRow-end"> <div data-view-component="true" class="Layout-main"> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-e40bb86d3e93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-37e3d5-31653d7f2342.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-074052b7d26b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_js-b73fdff77a4e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryObserver_js-node_modules_tanstack_-defd52-585c05e837f3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_promise-with-resolvers-polyfill_promise-with-r-014121-e1792bd5a31e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-2cf6f74f0be6.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-b10086b6761e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_hydro-analytics_hydro-analytics_ts-ui_packages_verified-fetch_verified-fetch_ts-u-4672d1-b78e53147a20.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-file-page-payload_ts-ui_packages_code-view-shared_comp-affd33-480858611d39.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_commit-attribution_index_ts-ui_packages_commit-checks-status_index_ts-ui_packages-7207c9-693ade740d7d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repos-overview-a8b6927b5d2b.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repos-overview.9cc263aa0716ce801059.module.css" /> <react-partial partial-name="repos-overview" data-ssr="true" data-attempted-ssr="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"initialPayload":{"allShortcutsEnabled":false,"path":"/","repo":{"id":261573419,"defaultBranch":"master","name":"flextool","ownerLogin":"blockspacer","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2020-05-05T20:13:57.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/35254900?v=4","public":true,"private":false,"isOrgOwned":false},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1614941484.193099","canEdit":false,"refType":"branch","currentOid":"d6594c7b2d4ce122a704075f68c7fab17d8bc737"},"tree":{"items":[{"name":"LICENSES","path":"LICENSES","contentType":"directory"},{"name":"cmake","path":"cmake","contentType":"directory"},{"name":"conan","path":"conan","contentType":"directory"},{"name":"docs","path":"docs","contentType":"directory"},{"name":"flextool/test","path":"flextool/test","contentType":"directory","hasSimplifiedPath":true},{"name":"include/flextool","path":"include/flextool","contentType":"directory","hasSimplifiedPath":true},{"name":"plugin/vue-cli-plugin","path":"plugin/vue-cli-plugin","contentType":"directory","hasSimplifiedPath":true},{"name":"resources","path":"resources","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"test_package","path":"test_package","contentType":"directory"},{"name":"tests","path":"tests","contentType":"directory"},{"name":"tools","path":"tools","contentType":"directory"},{"name":".clang-format","path":".clang-format","contentType":"file"},{"name":".gdbinit","path":".gdbinit","contentType":"file"},{"name":".gitattributes","path":".gitattributes","contentType":"file"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"Acknowledgements.txt","path":"Acknowledgements.txt","contentType":"file"},{"name":"CMakeLists.txt","path":"CMakeLists.txt","contentType":"file"},{"name":"LICENSE","path":"LICENSE","contentType":"file"},{"name":"NOTICE","path":"NOTICE","contentType":"file"},{"name":"OWNERS","path":"OWNERS","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"VERSION","path":"VERSION","contentType":"file"},{"name":"conanfile.py","path":"conanfile.py","contentType":"file"},{"name":"get_conan_dependencies.cmake","path":"get_conan_dependencies.cmake","contentType":"file"},{"name":"logo.png","path":"logo.png","contentType":"file"},{"name":"package.json","path":"package.json","contentType":"file"},{"name":"uncrustify.cfg","path":"uncrustify.cfg","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":null,"totalCount":28,"showBranchInfobar":false},"fileTree":null,"fileTreeProcessingTime":null,"foldersToFetch":[],"treeExpanded":false,"symbolsExpanded":false,"isOverview":true,"overview":{"banners":{"shouldRecommendReadme":false,"isPersonalRepo":false,"showUseActionBanner":false,"actionSlug":null,"actionId":null,"showProtectBranchBanner":false,"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_repo","releasePath":"/blockspacer/flextool/releases/new?marketplace=true","showPublishActionBanner":false},"interactionLimitBanner":null,"showInvitationBanner":false,"inviterName":null,"actionsMigrationBannerInfo":{"releaseTags":[],"showImmutableActionsMigrationBanner":false,"initialMigrationStatus":null}},"codeButton":{"contactPath":"/contact","isEnterprise":false,"local":{"protocolInfo":{"httpAvailable":true,"sshAvailable":null,"httpUrl":"https://github.com/blockspacer/flextool.git","showCloneWarning":null,"sshUrl":null,"sshCertificatesRequired":null,"sshCertificatesAvailable":null,"ghCliUrl":"gh repo clone blockspacer/flextool","defaultProtocol":"http","newSshKeyUrl":"/settings/ssh/new","setProtocolPath":"/users/set_protocol"},"platformInfo":{"cloneUrl":"https://desktop.github.com","showVisualStudioCloneButton":false,"visualStudioCloneUrl":"https://windows.github.com","showXcodeCloneButton":false,"xcodeCloneUrl":"xcode://clone?repo=https%3A%2F%2Fgithub.com%2Fblockspacer%2Fflextool","zipballUrl":"/blockspacer/flextool/archive/refs/heads/master.zip"}},"newCodespacePath":"/codespaces/new?hide_repo_select=true\u0026repo=261573419"},"popovers":{"rename":null,"renamedParentRepo":null},"commitCount":"89","overviewFiles":[{"displayName":"README.md","repoName":"flextool","refName":"master","path":"README.md","preferredFileType":"readme","tabName":"README","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cp dir=\"auto\"\u003e \u003c/p\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003e\n \u003ca href=\"https://blockspacer.github.io/flex_docs\" rel=\"nofollow\"\u003e\n \u003cimg src=\"https://camo.githubusercontent.com/4dad0fd0ce15ce2906fd26053f2b0becf211150d166df1ab8e0f7cdda4d23b07/68747470733a2f2f626c6f636b7370616365722e6769746875622e696f2f666c65785f646f63732f696d616765732f6c6f676f2e706e67\" width=\"100px\" alt=\"flextool\" data-canonical-src=\"https://blockspacer.github.io/flex_docs/images/logo.png\" style=\"max-width: 100%;\"\u003e\n \u003c/a\u003e\n\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 align=\"center\" tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAdd custom features to C++ language, like \u003ca href=\"https://www.fluentcpp.com/2018/03/09/c-metaclasses-proposal-less-5-minutes/\" rel=\"nofollow\"\u003emetaclasses\u003c/a\u003e, \u003ca href=\"https://twitter.com/TartanLlama/status/1159457033441165313\" rel=\"nofollow\"\u003eRust-like traits\u003c/a\u003e, reflection and many more\u003c/h3\u003e\u003ca id=\"user-content-add-custom-features-to-c-language-like-metaclasses-rust-like-traits-reflection-and-many-more\" class=\"anchor\" aria-label=\"Permalink: Add custom features to C++ language, like metaclasses, Rust-like traits, reflection and many more\" href=\"#add-custom-features-to-c-language-like-metaclasses-rust-like-traits-reflection-and-many-more\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp align=\"center\" dir=\"auto\"\u003eA fully open source, powerful solution for modification and generation of C++ source code. Reduce the amount of boilerplate code in your C++ projects.\u003c/p\u003e\n\u003chr\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c6ef85dff78c0f58249b743e2aa5004f30e066e039c206337b0efcc2ed6693eb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f70656e253230536f757263652d2545322539442541342d70696e6b2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c6ef85dff78c0f58249b743e2aa5004f30e066e039c206337b0efcc2ed6693eb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f70656e253230536f757263652d2545322539442541342d70696e6b2e737667\" alt=\"Open Source Love\" data-canonical-src=\"https://img.shields.io/badge/Open%20Source-%E2%9D%A4-pink.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0cc6bd9ecdab31b445fa37e0f60a8fd24009b4ea54b7463dc708f5026b4cb875/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f66697273742d2d74696d6572732d2d6f6e6c792d667269656e646c792d626c75652e7376673f7374796c653d666c6174\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0cc6bd9ecdab31b445fa37e0f60a8fd24009b4ea54b7463dc708f5026b4cb875/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f66697273742d2d74696d6572732d2d6f6e6c792d667269656e646c792d626c75652e7376673f7374796c653d666c6174\" alt=\"First Timers Only\" data-canonical-src=\"https://img.shields.io/badge/first--timers--only-friendly-blue.svg?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/ad4a2ed2992085ed9e9fb6d9f94cad63a95780fa42fe7f76852de61ee9f24800/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f75702d2d666f722d2d67726162732d667269656e646c792d677265656e2e7376673f7374796c653d666c6174\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ad4a2ed2992085ed9e9fb6d9f94cad63a95780fa42fe7f76852de61ee9f24800/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f75702d2d666f722d2d67726162732d667269656e646c792d677265656e2e7376673f7374796c653d666c6174\" alt=\"Up For Grabs\" data-canonical-src=\"https://img.shields.io/badge/up--for--grabs-friendly-green.svg?style=flat\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/3f7e202d87407c2b619c44092c69a84ffd59961e682dabdfab5a10d75306be41/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/3f7e202d87407c2b619c44092c69a84ffd59961e682dabdfab5a10d75306be41/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub\" data-canonical-src=\"https://img.shields.io/github/license/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/43780de34fb3ce5d1b98ddd350f0737b0d152417b83037d5600249e57880e9d9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/43780de34fb3ce5d1b98ddd350f0737b0d152417b83037d5600249e57880e9d9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub forks\" data-canonical-src=\"https://img.shields.io/github/forks/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/966ac0afc69790becced86608599a6a54f8b88ecbf3aa67739c127b17becc53d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/966ac0afc69790becced86608599a6a54f8b88ecbf3aa67739c127b17becc53d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub issues\" data-canonical-src=\"https://img.shields.io/github/issues/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/53128ce94e0b8e33c47acffda528abccd6c705c7565ed426f99aa8a5c8463b2f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/53128ce94e0b8e33c47acffda528abccd6c705c7565ed426f99aa8a5c8463b2f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub pull requests\" data-canonical-src=\"https://img.shields.io/github/issues-pr/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/95637fd676e633086981c0e9711080e01045a9d9f5bf1bd2f1c0bdeaa1d7e029/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/95637fd676e633086981c0e9711080e01045a9d9f5bf1bd2f1c0bdeaa1d7e029/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub contributors\" data-canonical-src=\"https://img.shields.io/github/contributors/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/de7aea76b99547cd22019ab4310d5c096ea0872f91b4dcc761ebf9b4731c1066/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/de7aea76b99547cd22019ab4310d5c096ea0872f91b4dcc761ebf9b4731c1066/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub commit activity the past week, 4 weeks, year\" data-canonical-src=\"https://img.shields.io/github/commit-activity/w/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/161b3a7f6a5154de47141830bea84d097368f1aa60b248d7087e201bff688f47/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/161b3a7f6a5154de47141830bea84d097368f1aa60b248d7087e201bff688f47/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub last commit\" data-canonical-src=\"https://img.shields.io/github/last-commit/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/62b419d2361fe9dec3713f78795f3e058816162ba8a5bb48a1fb2d1451fa1e4c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f746f702f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/62b419d2361fe9dec3713f78795f3e058816162ba8a5bb48a1fb2d1451fa1e4c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f746f702f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub top language\" data-canonical-src=\"https://img.shields.io/github/languages/top/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/9ec1fd131015bf302ec9c1824d4f89ed4b970239a398b66342875d44cc8b848a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f756e742f626c6f636b7370616365722f666c6578746f6f6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9ec1fd131015bf302ec9c1824d4f89ed4b970239a398b66342875d44cc8b848a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f756e742f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"GitHub language count\" data-canonical-src=\"https://img.shields.io/github/languages/count/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"http://www.repostatus.org/#wip\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5ae4f15271bff5ec20026e9f5ce9c895c687d000f7cf21a32674d29adea51d86/687474703a2f2f7777772e7265706f7374617475732e6f72672f6261646765732f6c61746573742f7769702e737667\" alt=\"Project Status: WIP - Initial development is in progress, but there has not yet been a stable, usable release suitable for the public.\" data-canonical-src=\"http://www.repostatus.org/badges/latest/wip.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/blockspacer/flextool/master/LICENSE\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9056b102779c6ff7869fe0cbca338b24ba7761fa4b7e15d81fdf33d251860fe5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f626c6f636b7370616365722f666c6578746f6f6c2e7376673f7374796c653d666c61742d737175617265\" alt=\"license\" data-canonical-src=\"https://img.shields.io/github/license/blockspacer/flextool.svg?style=flat-square\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://lgtm.com/projects/g/blockspacer/flextool/alerts/\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4ea615073b20d12eba7c68ed6ba9ebbeda52b4352f1e0ac54ec0fc54e3da7c7d/68747470733a2f2f696d672e736869656c64732e696f2f6c67746d2f616c657274732f672f6273616d736574682f6370702d70726f6a6563742e7376673f6c6f676f3d6c67746d266c6f676f57696474683d3138\" alt=\"Total alerts\" data-canonical-src=\"https://img.shields.io/lgtm/alerts/g/bsamseth/cpp-project.svg?logo=lgtm\u0026amp;logoWidth=18\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/blockspacer/flextool\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/422fe6090bf6dcd5cb15b348743afc0b58359f74e49c007006658c2911cb4ff2/68747470733a2f2f746f6b65692e72732f62312f6769746875622f626c6f636b7370616365722f666c6578746f6f6c\" alt=\"Lines of Code\" data-canonical-src=\"https://tokei.rs/b1/github/blockspacer/flextool\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"http://isitmaintained.com/project/blockspacer/flextool\" title=\"Average time to resolve an issue\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4df2d581ae9dde2619ed178995d5e5b66a83d19678d1e76e49c3a8b6c9135e83/687474703a2f2f697369746d61696e7461696e65642e636f6d2f62616467652f7265736f6c7574696f6e2f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"Average time to resolve an issue\" data-canonical-src=\"http://isitmaintained.com/badge/resolution/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"http://isitmaintained.com/project/blockspacer/flextool\" title=\"Percentage of issues still open\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/71e0f19e3de391e297f5cef6859b20454a32fe773af054e4aa3d0e336a92b6b2/687474703a2f2f697369746d61696e7461696e65642e636f6d2f62616467652f6f70656e2f626c6f636b7370616365722f666c6578746f6f6c2e737667\" alt=\"Percentage of issues still open\" data-canonical-src=\"http://isitmaintained.com/badge/open/blockspacer/flextool.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMain project page: \u003ca href=\"https://blockspacer.github.io/flex_docs/\" rel=\"nofollow\"\u003ehttps://blockspacer.github.io/flex_docs/\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTutorials and examples\u003c/h2\u003e\u003ca id=\"user-content-tutorials-and-examples\" class=\"anchor\" aria-label=\"Permalink: Tutorials and examples\" href=\"#tutorials-and-examples\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://blockspacer.github.io/flex_docs/tutorial/\" rel=\"nofollow\"\u003eTutorial\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blockspacer.github.io/flex_docs/building_projects/\" rel=\"nofollow\"\u003eUsage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blockspacer.github.io/flex_docs/adding_plugins/\" rel=\"nofollow\"\u003ePlugins\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blockspacer.github.io/flex_docs/bug_report/\" rel=\"nofollow\"\u003eTracing and log levels\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupported platforms\u003c/h2\u003e\u003ca id=\"user-content-supported-platforms\" class=\"anchor\" aria-label=\"Permalink: Supported platforms\" href=\"#supported-platforms\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTested on Ubuntu 20.04.2 LTS.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMay work on other platforms with minor modifications.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBefore installation: Add conan remotes\u003c/h2\u003e\u003ca id=\"user-content-before-installation-add-conan-remotes\" class=\"anchor\" aria-label=\"Permalink: Before installation: Add conan remotes\" href=\"#before-installation-add-conan-remotes\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo be able to add the list of dependency remotes please type the following command:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cmake -E time conan config install conan/remotes/\n# OR:\n# cmake -E time conan config install conan/remotes_disabled_ssl/\"\u003e\u003cpre\u003ecmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e conan config install conan/remotes/\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e OR:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e cmake -E time conan config install conan/remotes_disabled_ssl/\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBefore installation\u003c/h2\u003e\u003ca id=\"user-content-before-installation\" class=\"anchor\" aria-label=\"Permalink: Before installation\" href=\"#before-installation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://blockspacer.github.io/flex_docs/download/\" rel=\"nofollow\"\u003eInstallation Guide\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003econan packages\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eNOTE: cling with LLVM build may take couple of hours.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCommand below uses \u003ccode\u003e--profile clang12_compiler12_compiler\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExample conan profile \u003ccode\u003e~/.conan/profiles/clang\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-text-adblock notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"[settings]\n# We are building in Ubuntu Linux\nos_build=Linux\nos=Linux\narch_build=x86_64\narch=x86_64\n\ncompiler=clang\ncompiler.version=10\ncompiler.libcxx=libstdc++11\n\n[env]\nCC=/usr/bin/clang-10\nCXX=/usr/bin/clang++-10\n\n[build_requires]\ncmake_installer/3.15.5@conan/stable\"\u003e\u003cpre\u003e[\u003cspan class=\"pl-ii\"\u003esettings\u003c/span\u003e]\n\u003cspan class=\"pl-c\"\u003e# We are building in Ubuntu Linux\u003c/span\u003e\nos_build=Linux\nos=Linux\narch_build=x86_64\narch=x86_64\n\ncompiler=clang\ncompiler.version=10\ncompiler.libcxx=libstdc++11\n\n[\u003cspan class=\"pl-ii\"\u003eenv\u003c/span\u003e]\nCC=/usr/bin/clang-10\nCXX=/usr/bin/clang++-10\n\n[\u003cspan class=\"pl-ii\"\u003ebuild_requires\u003c/span\u003e]\ncmake_installer/3.15.5@conan/stable\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCreate clang12_compiler profile:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"[settings]\n# We are building in Ubuntu Linux\n\nos_build=Linux\nos=Linux\narch_build=x86_64\narch=x86_64\n\ncompiler=clang\ncompiler.version=12\ncompiler.libcxx=libstdc++11\ncompiler.cppstd=17\n\nllvm_9:build_type=Release\n\n[env]\nCC=/usr/bin/clang-12\nCXX=/usr/bin/clang++-12\n\n[build_requires]\ncmake_installer/3.15.5@conan/stable\"\u003e\u003cpre\u003e[settings]\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e We are building in Ubuntu Linux\u003c/span\u003e\n\nos_build=Linux\nos=Linux\narch_build=x86_64\narch=x86_64\n\ncompiler=clang\ncompiler.version=12\ncompiler.libcxx=libstdc++11\ncompiler.cppstd=17\n\nllvm_9:build_type=Release\n\n[env]\nCC=/usr/bin/clang-12\nCXX=/usr/bin/clang++-12\n\n[build_requires]\ncmake_installer/3.15.5@conan/stable\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBefore creation of conan profile file, see: \u003ca href=\"https://docs.conan.io/en/latest/using_packages/using_profiles.html\" rel=\"nofollow\"\u003ehttps://docs.conan.io/en/latest/using_packages/using_profiles.html\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWe use \u003ccode\u003e.cmake\u003c/code\u003e script to download and install conan packages.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/blockspacer/conan_github_downloader.git ~/conan_github_downloader\n\ncmake \\\n -DSCRIPT_PATH=\u0026quot;$PWD/get_conan_dependencies.cmake\u0026quot;\\\n -DENABLE_CLING=TRUE\\\n -DENABLE_LLVM=TRUE\\\n -DENABLE_LLVM_INSTALLER=FALSE\\\n -DEXTRA_CONAN_OPTS=\u0026quot;--profile;clang12_compiler\\\n;-s;build_type=Debug\\\n;-s;cling_conan:build_type=Release\\\n;-s;llvm_12:build_type=Release\\\n;--build;missing\u0026quot; \\\n -P ~/conan_github_downloader/conan_github_downloader.cmake\n\n# clean build cache\nconan remove \u0026quot;*\u0026quot; --build --force\"\u003e\u003cpre\u003egit clone https://github.com/blockspacer/conan_github_downloader.git \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/conan_github_downloader\n\ncmake \\\n -DSCRIPT_PATH=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$PWD\u003c/span\u003e/get_conan_dependencies.cmake\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\\\n -DENABLE_CLING=TRUE\\\n -DENABLE_LLVM=TRUE\\\n -DENABLE_LLVM_INSTALLER=FALSE\\\n -DEXTRA_CONAN_OPTS=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e--profile;clang12_compiler\u003cspan class=\"pl-cce\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e;-s;build_type=Debug\u003cspan class=\"pl-cce\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e;-s;cling_conan:build_type=Release\u003cspan class=\"pl-cce\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e;-s;llvm_12:build_type=Release\u003cspan class=\"pl-cce\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e;--build;missing\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n -P \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/conan_github_downloader/conan_github_downloader.cmake\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e clean build cache\u003c/span\u003e\nconan remove \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e*\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e --build --force\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eEasy install with common plugins\u003c/h2\u003e\u003ca id=\"user-content-easy-install-with-common-plugins\" class=\"anchor\" aria-label=\"Permalink: Easy install with common plugins\" href=\"#easy-install-with-common-plugins\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you want to install flextool and its plugins in single command, change the options provided to \u003ccode\u003etools/buildConanThirdparty.cmake\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: \u003ccode\u003etools/buildConanThirdparty.cmake\u003c/code\u003e will perform a FULL RE-BUILD; it may take couple of hours.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCommand below uses \u003ccode\u003e--profile clang12_compiler12_compiler\u003c/code\u003e. Before creation of conan profile file, see: \u003ca href=\"https://docs.conan.io/en/latest/using_packages/using_profiles.html\" rel=\"nofollow\"\u003ehttps://docs.conan.io/en/latest/using_packages/using_profiles.html\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWe use \u003ccode\u003ebuildConanThirdparty.cmake\u003c/code\u003e script to download and install conan packages.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: set \u003ccode\u003e-DENABLE_CLING=FALSE\u003c/code\u003e if you already installed Cling using \u003ccode\u003etools/buildConanThirdparty.cmake\u003c/code\u003e above.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"git clone https://github.com/blockspacer/conan_github_downloader.git ~/conan_github_downloader\n\ncmake \\\n -DSCRIPT_PATH=\u0026quot;$PWD/get_conan_dependencies.cmake\u0026quot;\\\n -DENABLE_CLING=TRUE\\\n -DENABLE_LLVM=TRUE\\\n -DENABLE_LLVM_INSTALLER=FALSE\\\n -DENABLE_FLEXTOOL=TRUE \\\n -DENABLE_BASIS_PLUGIN_HELPER=TRUE \\\n -DENABLE_FLEX_REFLECT_PLUGIN=TRUE \\\n -DENABLE_SQUARETS=TRUE \\\n -DENABLE_FLEX_SQUARETS_PLUGIN=TRUE \\\n -DENABLE_FLEX_PIMPL_PLUGIN=TRUE \\\n -DENABLE_FLEX_TYPECLASS_PLUGIN=TRUE \\\n -DENABLE_FLEX_META_PLUGIN=TRUE \\\n -DENABLE_FLEX_META_DEMO=TRUE \\\n -DEXTRA_CONAN_OPTS=\u0026quot;--profile;clang12_compiler\\\n;-s;build_type=Debug\\\n;-s;cling_conan:build_type=Release\\\n;-s;llvm_12:build_type=Release\\\n;--build;missing\u0026quot; \\\n -P ~/conan_github_downloader/conan_github_downloader.cmake\n\n# clean build cache\nconan remove \u0026quot;*\u0026quot; --build --force\"\u003e\u003cpre\u003egit clone https://github.com/blockspacer/conan_github_downloader.git \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/conan_github_downloader\n\ncmake \\\n -DSCRIPT_PATH=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$PWD\u003c/span\u003e/get_conan_dependencies.cmake\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\\\n -DENABLE_CLING=TRUE\\\n -DENABLE_LLVM=TRUE\\\n -DENABLE_LLVM_INSTALLER=FALSE\\\n -DENABLE_FLEXTOOL=TRUE \\\n -DENABLE_BASIS_PLUGIN_HELPER=TRUE \\\n -DENABLE_FLEX_REFLECT_PLUGIN=TRUE \\\n -DENABLE_SQUARETS=TRUE \\\n -DENABLE_FLEX_SQUARETS_PLUGIN=TRUE \\\n -DENABLE_FLEX_PIMPL_PLUGIN=TRUE \\\n -DENABLE_FLEX_TYPECLASS_PLUGIN=TRUE \\\n -DENABLE_FLEX_META_PLUGIN=TRUE \\\n -DENABLE_FLEX_META_DEMO=TRUE \\\n -DEXTRA_CONAN_OPTS=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e--profile;clang12_compiler\u003cspan class=\"pl-cce\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e;-s;build_type=Debug\u003cspan class=\"pl-cce\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e;-s;cling_conan:build_type=Release\u003cspan class=\"pl-cce\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e;-s;llvm_12:build_type=Release\u003cspan class=\"pl-cce\"\u003e\\\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e;--build;missing\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n -P \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/conan_github_downloader/conan_github_downloader.cmake\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e clean build cache\u003c/span\u003e\nconan remove \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e*\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e --build --force\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInstallation (without plugins)\u003c/h2\u003e\u003ca id=\"user-content-installation-without-plugins\" class=\"anchor\" aria-label=\"Permalink: Installation (without plugins)\" href=\"#installation-without-plugins\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse command below to re-build flextool (plugins must be installed separately).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCommand below uses \u003ccode\u003e--profile clang12_compiler12_compiler\u003c/code\u003e. Before creation of conan profile file, see: \u003ca href=\"https://docs.conan.io/en/latest/using_packages/using_profiles.html\" rel=\"nofollow\"\u003ehttps://docs.conan.io/en/latest/using_packages/using_profiles.html\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export VERBOSE=1\nexport CONAN_REVISIONS_ENABLED=1\nexport CONAN_VERBOSE_TRACEBACK=1\nexport CONAN_PRINT_RUN_COMMANDS=1\nexport CONAN_LOGGING_LEVEL=10\n\n# NOTE: change `build_type=Debug` to `build_type=Release` in production\n# NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`\ncmake -E time \\\n conan create . conan/stable \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --profile clang12_compiler \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True\n\n# clean build cache\nconan remove \u0026quot;*\u0026quot; --build --force\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e VERBOSE=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_REVISIONS_ENABLED=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_VERBOSE_TRACEBACK=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_PRINT_RUN_COMMANDS=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_LOGGING_LEVEL=10\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: change `build_type=Debug` to `build_type=Release` in production\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan create \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e conan/stable \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --profile clang12_compiler \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e clean build cache\u003c/span\u003e\nconan remove \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e*\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e --build --force\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNOTE: flextool not compatible with \u003ccode\u003ecompile_commands.json\u003c/code\u003e\u003c/h2\u003e\u003ca id=\"user-content-note-flextool-not-compatible-with-compile_commandsjson\" class=\"anchor\" aria-label=\"Permalink: NOTE: flextool not compatible with compile_commands.json\" href=\"#note-flextool-not-compatible-with-compile_commandsjson\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDisable generation of compilation database when you use flextool.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf you are using CMake, set \u003ccode\u003eCMAKE_EXPORT_COMPILE_COMMANDS\u003c/code\u003e to \u003ccode\u003eFALSE\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf \u003ccode\u003ecompile_commands.json\u003c/code\u003e exists in build folder (or in parent folder), flextool may fail.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eStanding on the Shoulders of Giants\u003c/h2\u003e\u003ca id=\"user-content-standing-on-the-shoulders-of-giants\" class=\"anchor\" aria-label=\"Permalink: Standing on the Shoulders of Giants\" href=\"#standing-on-the-shoulders-of-giants\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis project is possible because of \u003ca href=\"https://github.com/flexferrum/autoprogrammer\"\u003eflexferrum's \u003ccode\u003eautoprogrammer\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eArticles about flexferrum's \u003ccode\u003eautoprogrammer\u003c/code\u003e in media:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e[RUS] (article) metaclasses \u003ca href=\"https://habr.com/ru/article/448466/\" rel=\"nofollow\"\u003ehttps://habr.com/ru/article/448466/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[RUS] (slides) C++17 metaclasses \u003ca href=\"https://assets.ctfassets.net/oxjq45e8ilak/55bGdX2PnYzmrpM8rwCjcE/791e7eee3236c2023e86e169faca8a0e/Sergei_Sadovnikov_Metaclasses_in_C___dream_Reality.pdf\" rel=\"nofollow\"\u003ehttps://assets.ctfassets.net/oxjq45e8ilak/55bGdX2PnYzmrpM8rwCjcE/791e7eee3236c2023e86e169faca8a0e/Sergei_Sadovnikov_Metaclasses_in_C___dream_Reality.pdf\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDev-only build (local conan flow)\u003c/h2\u003e\u003ca id=\"user-content-dev-only-build-local-conan-flow\" class=\"anchor\" aria-label=\"Permalink: Dev-only build (local conan flow)\" href=\"#dev-only-build-local-conan-flow\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"find . -type f -name \u0026quot;*_buildflags.h\u0026quot; -exec rm {} \\;\nfind . -type f -name \u0026quot;*_buildflags.tmp\u0026quot; -exec rm {} \\;\n\n(rm -rf local_build || true)\n\nexport CONAN_REVISIONS_ENABLED=1\nexport CONAN_VERBOSE_TRACEBACK=1\nexport CONAN_PRINT_RUN_COMMANDS=1\nexport CONAN_LOGGING_LEVEL=10\n\nexport PKG_NAME=flextool/master@conan/stable\n\n(CONAN_REVISIONS_ENABLED=1 \\\n conan remove --force $PKG_NAME || true)\n\n# NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`\ncmake -E time \\\n conan install . \\\n --install-folder local_build \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_12:build_type=Release \\\n -o openssl:shared=True \\\n -e basis:enable_tests=True \\\n -o chromium_base:shared=True \\\n -e chromium_base:enable_tests=True \\\n -o perfetto:is_hermetic_clang=False \\\n --profile clang12_compiler \\\n -e flexlib:enable_tests=True \\\n -o flexlib:shared=False \\\n -o perfetto:is_hermetic_clang=False \\\n -o flexlib:enable_cling=True \\\n -e flextool:enable_tests=True \\\n -o flextool:enable_cling=True\n\n(rm local_build/CMakeCache.txt || true)\n\ncmake -E time \\\n conan source . \\\n --source-folder . \\\n --install-folder local_build\n\n# You can use `cmake --build . -- -j14` on second run.\ncmake -E time \\\n conan build . \\\n --build-folder local_build \\\n --source-folder . \\\n --install-folder local_build\n\nconan package . \\\n --build-folder local_build \\\n --package-folder local_build/package_dir \\\n --source-folder . \\\n --install-folder local_build\n\ncmake -E time \\\n conan export-pkg . conan/stable \\\n --package-folder local_build/package_dir \\\n -s build_type=Debug \\\n --force \\\n -s cling_conan:build_type=Release \\\n -s llvm_12:build_type=Release \\\n -o openssl:shared=True \\\n -e basis:enable_tests=True \\\n -o chromium_base:shared=True \\\n -e chromium_base:enable_tests=True \\\n -o perfetto:is_hermetic_clang=False \\\n --profile clang12_compiler \\\n -e flexlib:enable_tests=True \\\n -o flexlib:shared=False \\\n -o perfetto:is_hermetic_clang=False \\\n -o flexlib:enable_cling=True \\\n -e flextool:enable_tests=True \\\n -o flextool:enable_cling=True\n\ncmake -E time \\\n conan test test_package \\\n flextool/master@conan/stable \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_12:build_type=Release \\\n -o openssl:shared=True \\\n -e basis:enable_tests=True \\\n -o chromium_base:shared=True \\\n -e chromium_base:enable_tests=True \\\n -o perfetto:is_hermetic_clang=False \\\n --profile clang12_compiler \\\n -e flexlib:enable_tests=True \\\n -o flexlib:shared=False \\\n -o perfetto:is_hermetic_clang=False \\\n -o flexlib:enable_cling=True \\\n -e flextool:enable_tests=True \\\n -o flextool:enable_cling=True\"\u003e\u003cpre\u003efind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -type f -name \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e*_buildflags.h\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -type f -name \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e*_buildflags.tmp\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\n\n(rm -rf local_build \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_REVISIONS_ENABLED=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_VERBOSE_TRACEBACK=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_PRINT_RUN_COMMANDS=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_LOGGING_LEVEL=10\n\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e PKG_NAME=flextool/master@conan/stable\n\n(CONAN_REVISIONS_ENABLED=1 \\\n conan remove --force \u003cspan class=\"pl-smi\"\u003e$PKG_NAME\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan install \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --install-folder local_build \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_12:build_type=Release \\\n -o openssl:shared=True \\\n -e basis:enable_tests=True \\\n -o chromium_base:shared=True \\\n -e chromium_base:enable_tests=True \\\n -o perfetto:is_hermetic_clang=False \\\n --profile clang12_compiler \\\n -e flexlib:enable_tests=True \\\n -o flexlib:shared=False \\\n -o perfetto:is_hermetic_clang=False \\\n -o flexlib:enable_cling=True \\\n -e flextool:enable_tests=True \\\n -o flextool:enable_cling=True\n\n(rm local_build/CMakeCache.txt \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan \u003cspan class=\"pl-c1\"\u003esource\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --source-folder \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --install-folder local_build\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e You can use `cmake --build . -- -j14` on second run.\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --build-folder local_build \\\n --source-folder \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --install-folder local_build\n\nconan package \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --build-folder local_build \\\n --package-folder local_build/package_dir \\\n --source-folder \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --install-folder local_build\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan export-pkg \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e conan/stable \\\n --package-folder local_build/package_dir \\\n -s build_type=Debug \\\n --force \\\n -s cling_conan:build_type=Release \\\n -s llvm_12:build_type=Release \\\n -o openssl:shared=True \\\n -e basis:enable_tests=True \\\n -o chromium_base:shared=True \\\n -e chromium_base:enable_tests=True \\\n -o perfetto:is_hermetic_clang=False \\\n --profile clang12_compiler \\\n -e flexlib:enable_tests=True \\\n -o flexlib:shared=False \\\n -o perfetto:is_hermetic_clang=False \\\n -o flexlib:enable_cling=True \\\n -e flextool:enable_tests=True \\\n -o flextool:enable_cling=True\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan \u003cspan class=\"pl-c1\"\u003etest\u003c/span\u003e test_package \\\n flextool/master@conan/stable \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_12:build_type=Release \\\n -o openssl:shared=True \\\n -e basis:enable_tests=True \\\n -o chromium_base:shared=True \\\n -e chromium_base:enable_tests=True \\\n -o perfetto:is_hermetic_clang=False \\\n --profile clang12_compiler \\\n -e flexlib:enable_tests=True \\\n -o flexlib:shared=False \\\n -o perfetto:is_hermetic_clang=False \\\n -o flexlib:enable_cling=True \\\n -e flextool:enable_tests=True \\\n -o flextool:enable_cling=True\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: conan editable mode\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-conan-editable-mode\" class=\"anchor\" aria-label=\"Permalink: For contibutors: conan editable mode\" href=\"#for-contibutors-conan-editable-mode\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWith the editable packages, you can tell Conan where to find the headers and the artifacts ready for consumption in your local working directory.\nThere is no need to run \u003ccode\u003econan create\u003c/code\u003e or \u003ccode\u003econan export-pkg\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://docs.conan.io/en/latest/developing_packages/editable_packages.html\" rel=\"nofollow\"\u003ehttps://docs.conan.io/en/latest/developing_packages/editable_packages.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBuild locally:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export VERBOSE=1\nexport CONAN_REVISIONS_ENABLED=1\nexport CONAN_VERBOSE_TRACEBACK=1\nexport CONAN_PRINT_RUN_COMMANDS=1\nexport CONAN_LOGGING_LEVEL=10\n\ncmake -E time \\\n conan install . \\\n --install-folder local_build \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --profile clang12_compiler \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True\n\ncmake -E time \\\n conan source . \\\n --source-folder local_build \\\n --install-folder local_build\n\nconan build . \\\n --build-folder local_build \\\n --source-folder local_build \\\n --install-folder local_build\n\nconan package . \\\n --build-folder local_build \\\n --package-folder local_build/package_dir \\\n --source-folder local_build \\\n --install-folder local_build\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e VERBOSE=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_REVISIONS_ENABLED=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_VERBOSE_TRACEBACK=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_PRINT_RUN_COMMANDS=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_LOGGING_LEVEL=10\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan install \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --install-folder local_build \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --profile clang12_compiler \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan \u003cspan class=\"pl-c1\"\u003esource\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --source-folder local_build \\\n --install-folder local_build\n\nconan build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --build-folder local_build \\\n --source-folder local_build \\\n --install-folder local_build\n\nconan package \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --build-folder local_build \\\n --package-folder local_build/package_dir \\\n --source-folder local_build \\\n --install-folder local_build\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSet package to editable mode:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"conan editable add local_build/package_dir \\\n flextool/master@conan/stable\"\u003e\u003cpre\u003econan editable add local_build/package_dir \\\n flextool/master@conan/stable\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNote that \u003ccode\u003econanfile.py\u003c/code\u003e is modified to detect local builds via \u003ccode\u003eself.in_local_cache\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAfter change source in folder local_build (run commands in source package folder):\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"conan build . \\\n --build-folder local_build \\\n --source-folder local_build \\\n --install-folder local_build\n\nconan package . \\\n --build-folder local_build \\\n --package-folder local_build/package_dir \\\n --source-folder local_build \\\n --install-folder local_build\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003econan build . \\\n --build-folder local_build \\\n --source-folder local_build \\\n --install-folder local_build\n\nconan package . \\\n --build-folder local_build \\\n --package-folder local_build/package_dir \\\n --source-folder local_build \\\n --install-folder local_build\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild your test project.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIn order to revert the editable mode just remove the link using:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"conan editable remove \\\n flextool/master@conan/stable\"\u003e\u003cpre\u003econan editable remove \\\n flextool/master@conan/stable\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: conan workspace\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-conan-workspace\" class=\"anchor\" aria-label=\"Permalink: For contibutors: conan workspace\" href=\"#for-contibutors-conan-workspace\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAllows to build multiple projects at once; it just creates \u003ccode\u003eCMakeLists.txt\u003c/code\u003e with \u003ccode\u003eadd_subdirectory\u003c/code\u003e pointing to each package folder.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: You can open workspace in IDE as usual CMake based project (change build directory to WorkspaceProject path)!\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://docs.conan.io/en/latest/developing_packages/workspaces.html\" rel=\"nofollow\"\u003ehttps://docs.conan.io/en/latest/developing_packages/workspaces.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor example, we want to build both flextool and flexlib at the same time (flextool requires flexlib).\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# change ~ to desired build folder\ncd ~\n\n# Replace paths to yours!\n# Make sure each project in NOT in editable mode!\ncat \u0026lt;\u0026lt;EOF \u0026gt; ~/conanws.yml\neditables:\n flexlib/master@conan/stable:\n path: /......../flexlib\n flextool/master@conan/stable:\n path: /......../flextool\nlayout: layout_flex\nworkspace_generator: cmake\nroot:\n - flextool/master@conan/stable\nEOF\n\ncat \u0026lt;\u0026lt;EOF \u0026gt; ~/layout_flex\n# This helps to define the location of CMakeLists.txt within package\n[source_folder]\n.\n\n# This defines where the conanbuildinfo.cmake will be written to\n[build_folder]\nbuild/{{settings.build_type}}\nEOF\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e change ~ to desired build folder\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Replace paths to yours!\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Make sure each project in NOT in editable mode!\u003c/span\u003e\ncat \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-k\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eEOF\u003c/span\u003e \u0026gt; ~/conanws.yml\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eeditables:\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e flexlib/master@conan/stable:\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e path: /......../flexlib\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e flextool/master@conan/stable:\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e path: /......../flextool\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elayout: layout_flex\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eworkspace_generator: cmake\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eroot:\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e - flextool/master@conan/stable\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-k\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\ncat \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-k\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eEOF\u003c/span\u003e \u0026gt; ~/layout_flex\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e# This helps to define the location of CMakeLists.txt within package\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e[source_folder]\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e.\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e# This defines where the conanbuildinfo.cmake will be written to\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e[build_folder]\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003ebuild/{{settings.build_type}}\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-k\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"mkdir build_flex\n\ncd build_flex\n\ncat \u0026lt;\u0026lt;EOF \u0026gt; CMakeLists.txt\ncmake_minimum_required(VERSION 3.0)\n\nproject(WorkspaceProject)\n\ninclude(\\${CMAKE_BINARY_DIR}/conanworkspace.cmake)\n\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flexlib_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flextool_SRC}/cmake\u0026quot;)\n\nconan_workspace_subdirectories()\n\nadd_dependencies(flextool flexlib)\nEOF\n\n# must contain `include(${CMAKE_BINARY_DIR}/conanworkspace.cmake)` without slash `\\` (slash added for bash cat command)\ncat CMakeLists.txt\n\n# combines options from all projects\nconan workspace install \\\n ../conanws.yml \\\n --profile=clang \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n -o openssl:shared=True \\\n -o chromium_base:shared=True \\\n -e basis:enable_tests=True \\\n -e abseil:enable_llvm_tools=True \\\n -o chromium_base:use_alloc_shim=True \\\n -o chromium_tcmalloc:use_alloc_shim=True \\\n -o perfetto:is_hermetic_clang=False \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True \\\n -o flexlib:shared=False \\\n -o flexlib:enable_clang_from_conan=False \\\n -e flexlib:enable_tests=True\"\u003e\u003cpre\u003emkdir build_flex\n\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e build_flex\n\ncat \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-k\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eEOF\u003c/span\u003e \u0026gt; CMakeLists.txt\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003ecmake_minimum_required(VERSION 3.0)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eproject(WorkspaceProject)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003einclude(\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{CMAKE_BINARY_DIR}/conanworkspace.cmake)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flexlib_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flextool_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003econan_workspace_subdirectories()\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flextool flexlib)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-k\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e must contain `include(${CMAKE_BINARY_DIR}/conanworkspace.cmake)` without slash `\\` (slash added for bash cat command)\u003c/span\u003e\ncat CMakeLists.txt\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e combines options from all projects\u003c/span\u003e\nconan workspace install \\\n ../conanws.yml \\\n --profile=clang \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n -o openssl:shared=True \\\n -o chromium_base:shared=True \\\n -e basis:enable_tests=True \\\n -e abseil:enable_llvm_tools=True \\\n -o chromium_base:use_alloc_shim=True \\\n -o chromium_tcmalloc:use_alloc_shim=True \\\n -o perfetto:is_hermetic_clang=False \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True \\\n -o flexlib:shared=False \\\n -o flexlib:enable_clang_from_conan=False \\\n -e flexlib:enable_tests=True\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild into folder created by \u003ccode\u003econan workspace install\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# NOTE: change `build_type=Debug` to `build_type=Release` in production\nexport build_type=Debug\n\n# optional\n# remove old CMakeCache\n(rm CMakeCache.txt || true)\n\n# configure via cmake\ncmake -E time cmake . \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DENABLE_TESTS=TRUE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=ON \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=${build_type}\n\n# remove generated files\n# change paths to yours\n# rm ~/flex_typeclass_plugin/build/Debug/*generated*\n\n# build code\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n -- -j8\n\n# run unit tests for flexlib\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flexlib_run_all_tests\n\n# run unit tests for flextool\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flextool_run_all_tests\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: change `build_type=Debug` to `build_type=Release` in production\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e build_type=Debug\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e optional\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old CMakeCache\u003c/span\u003e\n(rm CMakeCache.txt \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e configure via cmake\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DENABLE_TESTS=TRUE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=ON \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=\u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove generated files\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e change paths to yours\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e rm ~/flex_typeclass_plugin/build/Debug/*generated*\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e build code\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n -- -j8\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flexlib\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flexlib_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flextool\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flextool_run_all_tests\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWorkspace allows to make quick changes in existing source files.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWe use \u003ccode\u003eself.in_local_cache\u003c/code\u003e to detect conan editable mode:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-python notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Local build\n# see https://docs.conan.io/en/latest/developing_packages/editable_packages.html\nif not self.in_local_cache:\n self.copy(\u0026quot;conanfile.py\u0026quot;, dst=\u0026quot;.\u0026quot;, keep_path=False)\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e# Local build\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e# see https://docs.conan.io/en/latest/developing_packages/editable_packages.html\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003enot\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eself\u003c/span\u003e.\u003cspan class=\"pl-s1\"\u003ein_local_cache\u003c/span\u003e:\n \u003cspan class=\"pl-s1\"\u003eself\u003c/span\u003e.\u003cspan class=\"pl-en\"\u003ecopy\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\"conanfile.py\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003edst\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e\".\"\u003c/span\u003e, \u003cspan class=\"pl-s1\"\u003ekeep_path\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eFalse\u003c/span\u003e)\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure that all targets have globally unique names.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor example: you can not have a target in each project with the same name like \"test\". You can solve that issue by adding project-specific prefix to name of each target like \"${ROOT_PROJECT_NAME}-test_main_gtest\".\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBecause \u003ccode\u003eCMAKE_BINARY_DIR\u003c/code\u003e will point to folder created by \u003ccode\u003econan workspace install\u003c/code\u003e, make sure that you prefer \u003ccode\u003eCMAKE_CURRENT_BINARY_DIR\u003c/code\u003e to \u003ccode\u003eCMAKE_BINARY_DIR\u003c/code\u003e etc.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: conan workspace with plugins\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-conan-workspace-with-plugins\" class=\"anchor\" aria-label=\"Permalink: For contibutors: conan workspace with plugins\" href=\"#for-contibutors-conan-workspace-with-plugins\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBefore installation: plugins require pre-built flextool (in same workspace). You must build workspace without plugins; only then you will be able to re-build it with plugins.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAdd plugins to yml file:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"editables:\n chromium_base/master@conan/stable:\n path: /........./chromium_base\n basis/master@conan/stable:\n path: /........./basis\n flex_support_headers/master@conan/stable:\n path: /........./flex_support_headers\n flexlib/master@conan/stable:\n path: /........./flexlib\n flextool/master@conan/stable:\n path: /........./flextool\n flex_reflect_plugin/master@conan/stable:\n path: /........./flex_reflect_plugin\n squarets/master@conan/stable:\n path: /........./squarets\n flex_squarets_plugin/master@conan/stable:\n path: /........./flex_squarets_plugin\n flex_typeclass_plugin/master@conan/stable:\n path: /........./flex_typeclass_plugin\n flex_pimpl_plugin/master@conan/stable:\n path: /........./flex_pimpl_plugin\n flex_meta_plugin/master@conan/stable:\n path: /........./flex_meta_plugin\n flex_meta_demo/master@conan/stable:\n path: /........./flex_meta_demo\nlayout: layout_flex\nworkspace_generator: cmake\nroot:\n - flex_reflect_plugin/master@conan/stable\n - squarets/master@conan/stable\n - flex_squarets_plugin/master@conan/stable\n - flex_typeclass_plugin/master@conan/stable\n - flex_pimpl_plugin/master@conan/stable\n - flex_meta_plugin/master@conan/stable\n - flex_meta_demo/master@conan/stable\"\u003e\u003cpre\u003e\u003cspan class=\"pl-ent\"\u003eeditables\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003echromium_base/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./chromium_base\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003ebasis/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./basis\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflex_support_headers/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flex_support_headers\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflexlib/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flexlib\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflextool/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flextool\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflex_reflect_plugin/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flex_reflect_plugin\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003esquarets/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./squarets\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflex_squarets_plugin/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flex_squarets_plugin\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflex_typeclass_plugin/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flex_typeclass_plugin\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflex_pimpl_plugin/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flex_pimpl_plugin\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflex_meta_plugin/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flex_meta_plugin\u003c/span\u003e\n \u003cspan class=\"pl-ent\"\u003eflex_meta_demo/master@conan/stable\u003c/span\u003e:\n \u003cspan class=\"pl-ent\"\u003epath\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003e/........./flex_meta_demo\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003elayout\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003elayout_flex\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003eworkspace_generator\u003c/span\u003e: \u003cspan class=\"pl-s\"\u003ecmake\u003c/span\u003e\n\u003cspan class=\"pl-ent\"\u003eroot\u003c/span\u003e:\n - \u003cspan class=\"pl-s\"\u003eflex_reflect_plugin/master@conan/stable\u003c/span\u003e\n - \u003cspan class=\"pl-s\"\u003esquarets/master@conan/stable\u003c/span\u003e\n - \u003cspan class=\"pl-s\"\u003eflex_squarets_plugin/master@conan/stable\u003c/span\u003e\n - \u003cspan class=\"pl-s\"\u003eflex_typeclass_plugin/master@conan/stable\u003c/span\u003e\n - \u003cspan class=\"pl-s\"\u003eflex_pimpl_plugin/master@conan/stable\u003c/span\u003e\n - \u003cspan class=\"pl-s\"\u003eflex_meta_plugin/master@conan/stable\u003c/span\u003e\n - \u003cspan class=\"pl-s\"\u003eflex_meta_demo/master@conan/stable\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003eadd_dependencies\u003c/code\u003e in \u003ccode\u003eCMakeLists.txt\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"mkdir build_flex\n\ncd build_flex\n\ncat \u0026lt;\u0026lt;EOF \u0026gt; CMakeLists.txt\ncmake_minimum_required(VERSION 3.0)\n\nproject(WorkspaceProject)\n\ninclude(\\${CMAKE_BINARY_DIR}/conanworkspace.cmake)\n\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_chromium_base_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_basis_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flex_support_headers_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flexlib_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flex_reflect_plugin_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_squarets_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flex_squarets_plugin_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flex_typeclass_plugin_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flex_meta_plugin_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flex_meta_demo_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flex_pimpl_plugin_SRC}/cmake\u0026quot;)\nlist(PREPEND CMAKE_MODULE_PATH \u0026quot;\\${PACKAGE_flextool_SRC}/cmake\u0026quot;)\n\nconan_workspace_subdirectories()\n\nadd_dependencies(basis chromium_base-static)\nadd_dependencies(flexlib basis)\nadd_dependencies(flextool flexlib basis flex_support_headers)\nadd_dependencies(flex_reflect_plugin flextool)\nadd_dependencies(flex_squarets_plugin squarets)\nadd_dependencies(flex_squarets_plugin flextool)\nadd_dependencies(flex_pimpl_plugin flextool)\nadd_dependencies(flex_pimpl_plugin flex_reflect_plugin)\nadd_dependencies(flex_pimpl_plugin flex_squarets_plugin)\nadd_dependencies(flex_typeclass_plugin flextool)\nadd_dependencies(flex_typeclass_plugin flex_squarets_plugin)\nadd_dependencies(flex_meta_demo flex_meta_plugin)\nadd_dependencies(flex_meta_demo flex_typeclass_plugin)\nadd_dependencies(flex_meta_demo flex_pimpl_plugin)\nadd_dependencies(flex_meta_demo flex_squarets_plugin)\nEOF\"\u003e\u003cpre\u003emkdir build_flex\n\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e build_flex\n\ncat \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-k\"\u003e\u0026lt;\u0026lt;\u003c/span\u003e\u003cspan class=\"pl-k\"\u003eEOF\u003c/span\u003e \u0026gt; CMakeLists.txt\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003ecmake_minimum_required(VERSION 3.0)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eproject(WorkspaceProject)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003einclude(\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{CMAKE_BINARY_DIR}/conanworkspace.cmake)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_chromium_base_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_basis_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flex_support_headers_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flexlib_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flex_reflect_plugin_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_squarets_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flex_squarets_plugin_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flex_typeclass_plugin_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flex_meta_plugin_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flex_meta_demo_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flex_pimpl_plugin_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003elist(PREPEND CMAKE_MODULE_PATH \"\u003cspan class=\"pl-cce\"\u003e\\$\u003c/span\u003e{PACKAGE_flextool_SRC}/cmake\")\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003econan_workspace_subdirectories()\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(basis chromium_base-static)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flexlib basis)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flextool flexlib basis flex_support_headers)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_reflect_plugin flextool)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_squarets_plugin squarets)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_squarets_plugin flextool)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_pimpl_plugin flextool)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_pimpl_plugin flex_reflect_plugin)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_pimpl_plugin flex_squarets_plugin)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_typeclass_plugin flextool)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_typeclass_plugin flex_squarets_plugin)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_meta_demo flex_meta_plugin)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_meta_demo flex_typeclass_plugin)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_meta_demo flex_pimpl_plugin)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003eadd_dependencies(flex_meta_demo flex_squarets_plugin)\u003c/span\u003e\n\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-k\"\u003eEOF\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAdd plugins options to \u003ccode\u003econan workspace install\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# combines options from all projects\nconan workspace install \\\n ../conanws.yml \\\n --profile=clang \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n -e basis:enable_tests=True \\\n -o openssl:shared=True \\\n -o chromium_base:shared=True \\\n -o chromium_base:use_alloc_shim=True \\\n -o perfetto:is_hermetic_clang=False \\\n -o chromium_tcmalloc:use_alloc_shim=True \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True \\\n -o flexlib:shared=False \\\n -o flexlib:enable_clang_from_conan=False \\\n -e flexlib:enable_tests=True \\\n -o flex_reflect_plugin:shared=True \\\n -o flex_reflect_plugin:enable_clang_from_conan=False \\\n -e flex_reflect_plugin:enable_tests=True \\\n -o squarets:shared=False \\\n -o squarets:enable_clang_from_conan=False \\\n -e squarets:enable_tests=True \\\n -o flex_squarets_plugin:shared=False \\\n -o flex_squarets_plugin:enable_clang_from_conan=False \\\n -e flex_squarets_plugin:enable_tests=True \\\n -o flex_meta_plugin:shared=False \\\n -o flex_meta_plugin:enable_clang_from_conan=False \\\n -e flex_meta_plugin:enable_tests=True \\\n -o flex_typeclass_plugin:shared=False \\\n -o flex_typeclass_plugin:enable_clang_from_conan=False \\\n -e flex_typeclass_plugin:enable_tests=True \\\n -o flex_pimpl_plugin:shared=False \\\n -o flex_pimpl_plugin:enable_clang_from_conan=False \\\n -e flex_pimpl_plugin:enable_tests=True \\\n -o flex_meta_demo:enable_clang_from_conan=False \\\n -e flex_meta_demo:enable_tests=True\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e combines options from all projects\u003c/span\u003e\nconan workspace install \\\n ../conanws.yml \\\n --profile=clang \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n -e basis:enable_tests=True \\\n -o openssl:shared=True \\\n -o chromium_base:shared=True \\\n -o chromium_base:use_alloc_shim=True \\\n -o perfetto:is_hermetic_clang=False \\\n -o chromium_tcmalloc:use_alloc_shim=True \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True \\\n -o flexlib:shared=False \\\n -o flexlib:enable_clang_from_conan=False \\\n -e flexlib:enable_tests=True \\\n -o flex_reflect_plugin:shared=True \\\n -o flex_reflect_plugin:enable_clang_from_conan=False \\\n -e flex_reflect_plugin:enable_tests=True \\\n -o squarets:shared=False \\\n -o squarets:enable_clang_from_conan=False \\\n -e squarets:enable_tests=True \\\n -o flex_squarets_plugin:shared=False \\\n -o flex_squarets_plugin:enable_clang_from_conan=False \\\n -e flex_squarets_plugin:enable_tests=True \\\n -o flex_meta_plugin:shared=False \\\n -o flex_meta_plugin:enable_clang_from_conan=False \\\n -e flex_meta_plugin:enable_tests=True \\\n -o flex_typeclass_plugin:shared=False \\\n -o flex_typeclass_plugin:enable_clang_from_conan=False \\\n -e flex_typeclass_plugin:enable_tests=True \\\n -o flex_pimpl_plugin:shared=False \\\n -o flex_pimpl_plugin:enable_clang_from_conan=False \\\n -e flex_pimpl_plugin:enable_tests=True \\\n -o flex_meta_demo:enable_clang_from_conan=False \\\n -e flex_meta_demo:enable_tests=True\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild and test workspace:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# NOTE: change `build_type=Debug` to `build_type=Release` in production\nexport build_type=Debug\n\n# optional\n# remove old CMakeCache\n(rm CMakeCache.txt || true)\n\n# configure via cmake\ncmake -E time cmake . \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DENABLE_TESTS=TRUE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=ON \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=${build_type}\n\n# remove generated files\n# change paths to yours\n# rm ~/flex_typeclass_plugin/build/Debug/*generated*\n\n# build code\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n -- -j8\n\n# run unit tests for flexlib\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flexlib_run_all_tests\n\n# run unit tests for flextool\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flextool_run_all_tests\n\n# run unit tests for flex_reflect_plugin\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flex_reflect_plugin_run_all_tests\n\n# run unit tests for squarets\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target squarets_run_all_tests\n\n# run unit tests for flex_squarets_plugin\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flex_squarets_plugin_run_all_tests\n\n# run unit tests for flex_squarets_plugin\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flex_meta_plugin_run_all_tests\n\n# run unit tests for flex_squarets_plugin\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flex_typeclass_plugin_run_all_tests\n\n# run unit tests for flex_squarets_plugin\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flex_pimpl_plugin_run_all_tests\n\n# run unit tests for flex_squarets_plugin\ncmake -E time cmake --build . \\\n --config ${build_type} \\\n --target flex_meta_demo_run_all_tests\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: change `build_type=Debug` to `build_type=Release` in production\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e build_type=Debug\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e optional\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old CMakeCache\u003c/span\u003e\n(rm CMakeCache.txt \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e configure via cmake\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DENABLE_TESTS=TRUE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=ON \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=\u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove generated files\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e change paths to yours\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e rm ~/flex_typeclass_plugin/build/Debug/*generated*\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e build code\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n -- -j8\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flexlib\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flexlib_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flextool\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flextool_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flex_reflect_plugin\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flex_reflect_plugin_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for squarets\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target squarets_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flex_squarets_plugin\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flex_squarets_plugin_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flex_squarets_plugin\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flex_meta_plugin_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flex_squarets_plugin\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flex_typeclass_plugin_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flex_squarets_plugin\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flex_pimpl_plugin_run_all_tests\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run unit tests for flex_squarets_plugin\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --config \u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e \\\n --target flex_meta_demo_run_all_tests\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: cppcheck\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-cppcheck\" class=\"anchor\" aria-label=\"Permalink: For contibutors: cppcheck\" href=\"#for-contibutors-cppcheck\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure you use \u003ccode\u003eDebug\u003c/code\u003e build with \u003ccode\u003e-e flextool:enable_llvm_tools=True\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInstall cppcheck via conan:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cd /tmp\n\ngit clone -b testing/1.90 https://github.com/bincrafters/conan-cppcheck_installer.git\n\ncd conan-cppcheck_installer\n\nexport VERBOSE=1\nexport CONAN_REVISIONS_ENABLED=1\nexport CONAN_VERBOSE_TRACEBACK=1\nexport CONAN_PRINT_RUN_COMMANDS=1\nexport CONAN_LOGGING_LEVEL=10\n\n# NOTE: change `build_type=Debug` to `build_type=Release` in production\n# NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`\ncmake -E time \\\n conan create . conan/stable \\\n -s build_type=Release\n\n# clean build cache\nconan remove \u0026quot;*\u0026quot; --build --force\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e /tmp\n\ngit clone -b testing/1.90 https://github.com/bincrafters/conan-cppcheck_installer.git\n\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e conan-cppcheck_installer\n\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e VERBOSE=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_REVISIONS_ENABLED=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_VERBOSE_TRACEBACK=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_PRINT_RUN_COMMANDS=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_LOGGING_LEVEL=10\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: change `build_type=Debug` to `build_type=Release` in production\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan create \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e conan/stable \\\n -s build_type=Release\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e clean build cache\u003c/span\u003e\nconan remove \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e*\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e --build --force\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUsage (runs cmake with \u003ccode\u003e-DENABLE_CPPCHECK=ON\u003c/code\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# creates local build in separate folder and runs cmake targets\n# NOTE: -DCLEAN_OLD=\u0026quot;OFF\u0026quot; to keep generated html report\ncmake -DCPPCHECK=\u0026quot;ON\u0026quot; -DCLEAN_OLD=\u0026quot;OFF\u0026quot; -P tools/run_tool.cmake\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e creates local build in separate folder and runs cmake targets\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: -DCLEAN_OLD=\"OFF\" to keep generated html report\u003c/span\u003e\ncmake -DCPPCHECK=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -DCLEAN_OLD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eOFF\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -P tools/run_tool.cmake\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# `index.html` must exist\n# find $PWD -name index.html\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e `index.html` must exist\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e find $PWD -name index.html\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen 'index.html' to see the results.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: vue ui\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-vue-ui\" class=\"anchor\" aria-label=\"Permalink: For contibutors: vue ui\" href=\"#for-contibutors-vue-ui\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eDesktop application that provides a single context to manage and run multiple scripts.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSimplifies setup of local dev environment; this avoids opening a lot of shell terminals.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can add custom commands in \u003ccode\u003epackage.json\u003c/code\u003e or \u003ccode\u003eplugin/vue-cli-plugin/ui.js\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Before: Install Latest Node.js and NPM\n# see https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/\nnode --version\nnpm --version\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Before: Install Latest Node.js and NPM\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/\u003c/span\u003e\nnode --version\nnpm --version\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuild your project via npm:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"npm install\"\u003e\u003cpre\u003enpm install\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"sudo npm install -g @vue/cli\nsudo vue ui --dev --port 8061\"\u003e\u003cpre\u003esudo npm install -g @vue/cli\nsudo vue ui --dev --port 8061\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen \u003ccode\u003ehttp://localhost:8061/\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eImport project directory.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSelect \u003ccode\u003eTasks\u003c/code\u003e, like build/test...\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTasks may be changed in \u003ccode\u003epackage.json\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: We use \u003ccode\u003epackage.json\u003c/code\u003e only for tasks. Conan is controlled by a file called conanfile.txt.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUseful links:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://cli.vuejs.org/dev-guide/ui-api.html#ui-files\" rel=\"nofollow\"\u003ehttps://cli.vuejs.org/dev-guide/ui-api.html#ui-files\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Dewep/GCE\"\u003ehttps://github.com/Dewep/GCE\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/supnate/command-pad\"\u003ehttps://github.com/supnate/command-pad\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: gdbinit\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-gdbinit\" class=\"anchor\" aria-label=\"Permalink: For contibutors: gdbinit\" href=\"#for-contibutors-gdbinit\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe use \u003ccode\u003e.gdbinit\u003c/code\u003e add 'add-auto-load-safe-path .'\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor more details about \u003ccode\u003e.gdbinit\u003c/code\u003e, read: \u003ca href=\"https://metricpanda.com/tips-for-productive-debugging-with-gdb\" rel=\"nofollow\"\u003ehttps://metricpanda.com/tips-for-productive-debugging-with-gdb\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor more details about \u003ccode\u003egdb\u003c/code\u003e, read: \u003ca href=\"http://www.yolinux.com/TUTORIALS/GDB-Commands.html\" rel=\"nofollow\"\u003ehttp://www.yolinux.com/TUTORIALS/GDB-Commands.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eGDB debugging session can be automated like so:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# see https://gist.github.com/williballenthin/8bd6e29ad8504b9cb308039f675ee889\ngdb \\\n -ex \u0026quot;run\u0026quot; \\\n -ex \u0026quot;set pagination off\u0026quot; \\\n -ex \u0026quot;bt\u0026quot; \\\n -ex \u0026quot;set confirm off\u0026quot; \\\n -ex \u0026quot;quit\u0026quot; \\\n --args \\\n ${APP_EXE} \\\n ${APP_CMD_ARGS}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see https://gist.github.com/williballenthin/8bd6e29ad8504b9cb308039f675ee889\u003c/span\u003e\ngdb \\\n -ex \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003erun\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n -ex \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eset pagination off\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n -ex \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ebt\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n -ex \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eset confirm off\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n -ex \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003equit\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \\\n --args \\\n \u003cspan class=\"pl-smi\"\u003e${APP_EXE}\u003c/span\u003e \\\n \u003cspan class=\"pl-smi\"\u003e${APP_CMD_ARGS}\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: valgrind\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-valgrind\" class=\"anchor\" aria-label=\"Permalink: For contibutors: valgrind\" href=\"#for-contibutors-valgrind\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure you use \u003ccode\u003eDebug\u003c/code\u003e build with \u003ccode\u003e-e flextool:enable_llvm_tools=True\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://www.jetbrains.com/help/clion/memory-profiling-with-valgrind.html\" rel=\"nofollow\"\u003ehttps://www.jetbrains.com/help/clion/memory-profiling-with-valgrind.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://heeris.id.au/2016/valgrind-gdb/\" rel=\"nofollow\"\u003ehttps://heeris.id.au/2016/valgrind-gdb/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eInstall valgrind:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"sudo apt install valgrind # Ubuntu, Debian, etc.\n# OR\nsudo yum install valgrind # RHEL, CentOS, Fedora, etc.\"\u003e\u003cpre\u003esudo apt install valgrind \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Ubuntu, Debian, etc.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e OR\u003c/span\u003e\nsudo yum install valgrind \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e RHEL, CentOS, Fedora, etc.\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNOTE: make sure you set \u003ccode\u003euse_alloc_shim=False\u003c/code\u003e and \u003ccode\u003eenable_valgrind=True\u003c/code\u003e (see below).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRun valgrind via cmake:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export VERBOSE=1\nexport CONAN_REVISIONS_ENABLED=1\nexport CONAN_VERBOSE_TRACEBACK=1\nexport CONAN_PRINT_RUN_COMMANDS=1\nexport CONAN_LOGGING_LEVEL=10\n\n# NOTE: set `use_alloc_shim=False` and `enable_valgrind=True` for valgrind support\ncmake -E time \\\n conan install . \\\n --install-folder local_build_valgrind \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --profile clang12_compiler \\\n -o flextool:enable_valgrind=True \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True \\\n -e abseil:enable_llvm_tools=True \\\n -o chromium_base:enable_valgrind=True \\\n -e chromium_base:enable_llvm_tools=True \\\n -o chromium_base:use_alloc_shim=False \\\n -o perfetto:is_hermetic_clang=False \\\n -o basis:enable_valgrind=True \\\n -e basis:enable_llvm_tools=True \\\n -o flexlib:enable_valgrind=True \\\n -e flexlib:enable_llvm_tools=True \\\n -o flexlib:enable_clang_from_conan=False \\\n -o chromium_tcmalloc:use_alloc_shim=False \\\n --build chromium_base \\\n --build chromium_tcmalloc \\\n --build basis \\\n --build flexlib\n\ncd ~/flextool\n\n# see section about `conan editable mode`\ncd local_build_valgrind\n\n# optional\n# remove old CMakeCache\n(rm CMakeCache.txt || true)\n\n# remove old build artifacts\nrm -rf flextool\nrm -rf bin\nfind . -iname '*.o' -exec rm {} \\;\nfind . -iname '*.a' -exec rm {} \\;\nfind . -iname '*.dll' -exec rm {} \\;\nfind . -iname '*.lib' -exec rm {} \\;\n\n# NOTE: -DENABLE_VALGRIND=ON\ncmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DENABLE_VALGRIND=ON \\\n -DENABLE_TESTS=TRUE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=ON \\\n -DENABLE_VALGRIND_TESTS=TRUE \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=Debug\n\n# NOTE: to run some tests under valgrind\n# use `-DENABLE_VALGRIND_TESTS=TRUE`\ncmake -E time cmake --build . \\\n --target flextool-gmock_run_valgrind\n\n# Cmake will print valgrind command that was executed.\n# You can copy executed command and add custom command-line arguments:\n# --gtest_filter=ToolsSanityTest.DISABLED_ValgrindTest \\\n# --gtest_also_run_disabled_tests\n\n# search for valgrind log file\nfind $PWD -name *valgrind*.log\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e VERBOSE=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_REVISIONS_ENABLED=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_VERBOSE_TRACEBACK=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_PRINT_RUN_COMMANDS=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_LOGGING_LEVEL=10\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: set `use_alloc_shim=False` and `enable_valgrind=True` for valgrind support\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan install \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --install-folder local_build_valgrind \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --profile clang12_compiler \\\n -o flextool:enable_valgrind=True \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True \\\n -e abseil:enable_llvm_tools=True \\\n -o chromium_base:enable_valgrind=True \\\n -e chromium_base:enable_llvm_tools=True \\\n -o chromium_base:use_alloc_shim=False \\\n -o perfetto:is_hermetic_clang=False \\\n -o basis:enable_valgrind=True \\\n -e basis:enable_llvm_tools=True \\\n -o flexlib:enable_valgrind=True \\\n -e flexlib:enable_llvm_tools=True \\\n -o flexlib:enable_clang_from_conan=False \\\n -o chromium_tcmalloc:use_alloc_shim=False \\\n --build chromium_base \\\n --build chromium_tcmalloc \\\n --build basis \\\n --build flexlib\n\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/flextool\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see section about `conan editable mode`\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e local_build_valgrind\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e optional\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old CMakeCache\u003c/span\u003e\n(rm CMakeCache.txt \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old build artifacts\u003c/span\u003e\nrm -rf flextool\nrm -rf bin\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -iname \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e*.o\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -iname \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e*.a\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -iname \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e*.dll\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -iname \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e*.lib\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: -DENABLE_VALGRIND=ON\u003c/span\u003e\ncmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DENABLE_VALGRIND=ON \\\n -DENABLE_TESTS=TRUE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=ON \\\n -DENABLE_VALGRIND_TESTS=TRUE \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=Debug\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: to run some tests under valgrind\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e use `-DENABLE_VALGRIND_TESTS=TRUE`\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --target flextool-gmock_run_valgrind\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Cmake will print valgrind command that was executed.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e You can copy executed command and add custom command-line arguments:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e --gtest_filter=ToolsSanityTest.DISABLED_ValgrindTest \\\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e --gtest_also_run_disabled_tests\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e search for valgrind log file\u003c/span\u003e\nfind \u003cspan class=\"pl-smi\"\u003e$PWD\u003c/span\u003e -name \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003evalgrind\u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e.log\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo find leaks, you can seach for \u003ccode\u003edefinitely lost\u003c/code\u003e in log file.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: you can add valgrind suppressions in \u003ccode\u003ecmake/valgrind.cfg\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: compile program with a debug flag to run under valgrind.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: use \u003ccode\u003evalgrind --tool=helgrind\u003c/code\u003e to detect potential deadlocks and data races.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: use \u003ccode\u003evalgrind --tool=massif --massif-out-file=massif_file --stacks=true\u003c/code\u003e to measure size of heap.\nSee also: \u003ca href=\"https://kde.org/applications/development/org.kde.massif-visualizer\" rel=\"nofollow\"\u003ehttps://kde.org/applications/development/org.kde.massif-visualizer\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://stackoverflow.com/a/44989219\" rel=\"nofollow\"\u003ehttps://stackoverflow.com/a/44989219\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTODO: try to build with valgrind and clang 10 \u003ca href=\"https://stackoverflow.com/questions/40509986/valgrind-reporting-mismatched-free-delete-delete\" rel=\"nofollow\"\u003ehttps://stackoverflow.com/questions/40509986/valgrind-reporting-mismatched-free-delete-delete\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTODO: valgrind may not support chromium base, FIXME. And remove GTEST_NO_SUITE\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: clang-tidy\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-clang-tidy\" class=\"anchor\" aria-label=\"Permalink: For contibutors: clang-tidy\" href=\"#for-contibutors-clang-tidy\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure you use \u003ccode\u003eDebug\u003c/code\u003e build with \u003ccode\u003e-e flextool:enable_llvm_tools=True\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInstall clang-tidy:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"sudo apt-get install clang-tidy # Ubuntu, Debian, etc.\n# OR\nsudo yum install clang-tidy # RHEL, CentOS, Fedora, etc.\"\u003e\u003cpre\u003esudo apt-get install clang-tidy \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Ubuntu, Debian, etc.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e OR\u003c/span\u003e\nsudo yum install clang-tidy \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e RHEL, CentOS, Fedora, etc.\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUsage (runs cmake with \u003ccode\u003e-DENABLE_CLANG_TIDY=ON\u003c/code\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# creates local build in separate folder and runs cmake targets\ncmake -DCLANG_TIDY=\u0026quot;ON\u0026quot; -DCLEAN_OLD=\u0026quot;ON\u0026quot; -P tools/run_tool.cmake\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e creates local build in separate folder and runs cmake targets\u003c/span\u003e\ncmake -DCLANG_TIDY=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -DCLEAN_OLD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -P tools/run_tool.cmake\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: scan-build\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-scan-build\" class=\"anchor\" aria-label=\"Permalink: For contibutors: scan-build\" href=\"#for-contibutors-scan-build\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure you use \u003ccode\u003eDebug\u003c/code\u003e build with \u003ccode\u003e-e flextool:enable_llvm_tools=True\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://chromium.googlesource.com/chromium/src.git/+/master/docs/clang_static_analyzer.md\" rel=\"nofollow\"\u003ehttps://chromium.googlesource.com/chromium/src.git/+/master/docs/clang_static_analyzer.md\u003c/a\u003e\nand \u003ca href=\"https://clang-analyzer.llvm.org/scan-build.html\" rel=\"nofollow\"\u003ehttps://clang-analyzer.llvm.org/scan-build.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe program ccc-analyzer acts like a fake compiler, forwarding its command line arguments over to the compiler to perform regular compilation and clang to perform static analysis.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRunning configure typically generates makefiles that have hardwired paths to the compiler, and by running configure through scan-build that path is set to ccc-analyzer.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# must exist\nccc-analyzer -v\n\n# must exist\nc++-analyzer -v\n\n# must exist\nscan-build -v\n\nexport VERBOSE=1\nexport CONAN_REVISIONS_ENABLED=1\nexport CONAN_VERBOSE_TRACEBACK=1\nexport CONAN_PRINT_RUN_COMMANDS=1\nexport CONAN_LOGGING_LEVEL=10\n\ncmake -E time \\\n conan install . \\\n --install-folder local_build_scan_build \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --profile clang12_compiler \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True\n\ncmake -E time \\\n conan source . \\\n --source-folder local_build_scan_build \\\n --install-folder local_build_scan_build\n\n# see section about `conan editable mode`\ncd local_build_scan_build\n\n# NOTE: change `build_type=Debug` to `build_type=Release` in production\nexport build_type=Debug\n\n# optional\n# remove old CMakeCache\n(rm CMakeCache.txt || true)\n\n# NOTE: changed CMAKE_C_COMPILER to ccc-analyzer (!!!)\n# configure via cmake\nscan-build \\\n --use-cc=clang-10 \\\n --use-c++=clang++-10 \\\n -o ./scanbuildout/ \\\n cmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DCMAKE_C_COMPILER=ccc-analyzer \\\n -DCMAKE_CXX_COMPILER=c++-analyzer \\\n -DENABLE_TESTS=FALSE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=OFF \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=${build_type}\n\n# remove old build artifacts\n(make clean || true)\nrm -rf bin\n\n# NOTE: requires project configured in debug build\n# disable other static analyzers\n# run from build directory\nscan-build \\\n -maxloop 8 \\\n -enable-checker alpha.security.taint.TaintPropagation \\\n -enable-checker alpha.core.BoolAssignment \\\n -enable-checker alpha.core.CastSize \\\n -enable-checker alpha.core.DynamicTypeChecker \\\n -enable-checker alpha.core.FixedAddr \\\n -enable-checker alpha.core.IdenticalExpr \\\n -enable-checker alpha.core.PointerArithm \\\n -enable-checker alpha.core.PointerSub \\\n -enable-checker alpha.core.SizeofPtr \\\n -enable-checker alpha.core.TestAfterDivZero \\\n -enable-checker alpha.deadcode.UnreachableCode \\\n -enable-checker alpha.security.ArrayBoundV2 \\\n -enable-checker alpha.security.MallocOverflow \\\n -enable-checker alpha.security.ReturnPtrRange \\\n -enable-checker alpha.unix.PthreadLock \\\n -enable-checker alpha.unix.Stream \\\n -enable-checker alpha.unix.cstring.BufferOverlap \\\n -enable-checker alpha.unix.cstring.NotNullTerminated \\\n -enable-checker alpha.unix.cstring.OutOfBounds \\\n -enable-checker nullability.NullableDereferenced \\\n -enable-checker optin.performance.Padding \\\n -enable-checker security.insecureAPI.rand \\\n -enable-checker security.insecureAPI.strcpy \\\n --use-cc=clang-10 \\\n --use-c++=clang++-10 \\\n -o ./scanbuildout/ \\\n make \\\n -j8\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e must exist\u003c/span\u003e\nccc-analyzer -v\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e must exist\u003c/span\u003e\nc++-analyzer -v\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e must exist\u003c/span\u003e\nscan-build -v\n\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e VERBOSE=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_REVISIONS_ENABLED=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_VERBOSE_TRACEBACK=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_PRINT_RUN_COMMANDS=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_LOGGING_LEVEL=10\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan install \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --install-folder local_build_scan_build \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --profile clang12_compiler \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan \u003cspan class=\"pl-c1\"\u003esource\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --source-folder local_build_scan_build \\\n --install-folder local_build_scan_build\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see section about `conan editable mode`\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e local_build_scan_build\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: change `build_type=Debug` to `build_type=Release` in production\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e build_type=Debug\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e optional\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old CMakeCache\u003c/span\u003e\n(rm CMakeCache.txt \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: changed CMAKE_C_COMPILER to ccc-analyzer (!!!)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e configure via cmake\u003c/span\u003e\nscan-build \\\n --use-cc=clang-10 \\\n --use-c++=clang++-10 \\\n -o ./scanbuildout/ \\\n cmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DCMAKE_C_COMPILER=ccc-analyzer \\\n -DCMAKE_CXX_COMPILER=c++-analyzer \\\n -DENABLE_TESTS=FALSE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=OFF \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=\u003cspan class=\"pl-smi\"\u003e${build_type}\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old build artifacts\u003c/span\u003e\n(make clean \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\nrm -rf bin\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: requires project configured in debug build\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e disable other static analyzers\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e run from build directory\u003c/span\u003e\nscan-build \\\n -maxloop 8 \\\n -enable-checker alpha.security.taint.TaintPropagation \\\n -enable-checker alpha.core.BoolAssignment \\\n -enable-checker alpha.core.CastSize \\\n -enable-checker alpha.core.DynamicTypeChecker \\\n -enable-checker alpha.core.FixedAddr \\\n -enable-checker alpha.core.IdenticalExpr \\\n -enable-checker alpha.core.PointerArithm \\\n -enable-checker alpha.core.PointerSub \\\n -enable-checker alpha.core.SizeofPtr \\\n -enable-checker alpha.core.TestAfterDivZero \\\n -enable-checker alpha.deadcode.UnreachableCode \\\n -enable-checker alpha.security.ArrayBoundV2 \\\n -enable-checker alpha.security.MallocOverflow \\\n -enable-checker alpha.security.ReturnPtrRange \\\n -enable-checker alpha.unix.PthreadLock \\\n -enable-checker alpha.unix.Stream \\\n -enable-checker alpha.unix.cstring.BufferOverlap \\\n -enable-checker alpha.unix.cstring.NotNullTerminated \\\n -enable-checker alpha.unix.cstring.OutOfBounds \\\n -enable-checker nullability.NullableDereferenced \\\n -enable-checker optin.performance.Padding \\\n -enable-checker security.insecureAPI.rand \\\n -enable-checker security.insecureAPI.strcpy \\\n --use-cc=clang-10 \\\n --use-c++=clang++-10 \\\n -o ./scanbuildout/ \\\n make \\\n -j8\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen resulting \u003ccode\u003escanbuildout/...../index.html\u003c/code\u003e file\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: cppclean\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-cppclean\" class=\"anchor\" aria-label=\"Permalink: For contibutors: cppclean\" href=\"#for-contibutors-cppclean\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure you use \u003ccode\u003eDebug\u003c/code\u003e build with \u003ccode\u003e-e flextool:enable_llvm_tools=True\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://github.com/myint/cppclean\"\u003ehttps://github.com/myint/cppclean\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInstallation:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"pip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade cppclean\"\u003e\u003cpre\u003epip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade cppclean\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUsage (runs cmake with \u003ccode\u003e-DENABLE_CPPCLEAN=ON\u003c/code\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# creates local build in separate folder and runs cmake targets\ncmake -DCPPCLEAN=\u0026quot;ON\u0026quot; -DCLEAN_OLD=\u0026quot;ON\u0026quot; -P tools/run_tool.cmake\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e creates local build in separate folder and runs cmake targets\u003c/span\u003e\ncmake -DCPPCLEAN=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -DCLEAN_OLD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -P tools/run_tool.cmake\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNOTE: cppclean requires file encoding to be: \u003ccode\u003eUTF-8 without BOM\u003c/code\u003e (ascii)\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: IWYU\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-iwyu\" class=\"anchor\" aria-label=\"Permalink: For contibutors: IWYU\" href=\"#for-contibutors-iwyu\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure you use \u003ccode\u003eDebug\u003c/code\u003e build with \u003ccode\u003e-e flextool:enable_llvm_tools=True\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003einclude-what-you-use (IWYU) is a project intended to optimise includes.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt will calculate the required headers and add / remove includes as appropriate.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://include-what-you-use.org/\" rel=\"nofollow\"\u003ehttps://include-what-you-use.org/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsage (runs cmake with \u003ccode\u003e-DENABLE_IWYU=ON\u003c/code\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# creates local build in separate folder and runs cmake targets\ncmake -DIWYU=\u0026quot;ON\u0026quot; -DCLEAN_OLD=\u0026quot;ON\u0026quot; -P tools/run_tool.cmake\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e creates local build in separate folder and runs cmake targets\u003c/span\u003e\ncmake -DIWYU=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -DCLEAN_OLD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -P tools/run_tool.cmake\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eCODESTYLE: use \u003ccode\u003e// IWYU pragma: associated\u003c/code\u003e in C++ source files.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Read about IWYU Pragmas: \u003ca href=\"https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUPragmas.md\"\u003ehttps://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUPragmas.md\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: don't use \"bits/\" or \"/details/*\" includes, add them to mappings file (.imp)\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://llvm.org/devmtg/2010-11/Silverstein-IncludeWhatYouUse.pdf\" rel=\"nofollow\"\u003ehttps://llvm.org/devmtg/2010-11/Silverstein-IncludeWhatYouUse.pdf\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/include-what-you-use/include-what-you-use/tree/master/docs\"\u003ehttps://github.com/include-what-you-use/include-what-you-use/tree/master/docs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hdclark/Ygor/blob/master/artifacts/20180225_include-what-you-use/iwyu_how-to.txt\"\u003ehttps://github.com/hdclark/Ygor/blob/master/artifacts/20180225_include-what-you-use/iwyu_how-to.txt\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: ccache\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-ccache\" class=\"anchor\" aria-label=\"Permalink: For contibutors: ccache\" href=\"#for-contibutors-ccache\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003e-DUSE_CCACHE=ON\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"gcc -v\nexport CC=gcc\nexport CXX=g++\n# NOTE: -DUSE_CCACHE=ON\ncmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DUSE_CCACHE=ON \\\n -DENABLE_TESTS=FALSE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=OFF \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=Debug\"\u003e\u003cpre\u003egcc -v\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CC=gcc\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CXX=g++\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: -DUSE_CCACHE=ON\u003c/span\u003e\ncmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DUSE_CCACHE=ON \\\n -DENABLE_TESTS=FALSE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=OFF \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=Debug\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://www.virag.si/2015/07/use-ccache-with-cmake-for-faster-compilation/\" rel=\"nofollow\"\u003ehttps://www.virag.si/2015/07/use-ccache-with-cmake-for-faster-compilation/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo get the most out of ccache, put something like this in: \u003ccode\u003e~/.ccache/ccache.conf\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"max_size = 50.0G # or whatever cache size you prefer; default is 5G; 0 means unlimited\nbase_dir = /home/yourname # or wherever you keep your source files\"\u003e\u003cpre\u003emax_size = 50.0G \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e or whatever cache size you prefer; default is 5G; 0 means unlimited\u003c/span\u003e\nbase_dir = /home/yourname \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e or wherever you keep your source files\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNote: \u003ccode\u003ebase_dir\u003c/code\u003e is required for ccache to share cached compiles of the same file across different repositories / paths; it will only do this for paths under \u003ccode\u003ebase_dir\u003c/code\u003e.\nSo this option is required for effective use of ccache with git worktrees (described below).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou must not set \u003ccode\u003ebase_dir\u003c/code\u003e to \"/\", or anywhere that contains system headers (according to the ccache docs).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: GOLD linker\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-gold-linker\" class=\"anchor\" aria-label=\"Permalink: For contibutors: GOLD linker\" href=\"#for-contibutors-gold-linker\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eInstallation:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"sudo apt-get install ccache\n\n# On OS X use homebrew:\n# brew install ccache\n\nccache --version\"\u003e\u003cpre\u003esudo apt-get install ccache\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e On OS X use homebrew:\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e brew install ccache\u003c/span\u003e\n\nccache --version\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003e-DUSE_LD_GOLD=ON\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"gcc -v\nexport CC=gcc\nexport CXX=g++\n# NOTE: -DUSE_LD_GOLD=ON\ncmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DUSE_LD_GOLD=ON \\\n -DENABLE_TESTS=FALSE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=OFF \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=Debug\"\u003e\u003cpre\u003egcc -v\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CC=gcc\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CXX=g++\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: -DUSE_LD_GOLD=ON\u003c/span\u003e\ncmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DUSE_LD_GOLD=ON \\\n -DENABLE_TESTS=FALSE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=OFF \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=Debug\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://cristianadam.eu/20170709/speeding-up-cmake/\" rel=\"nofollow\"\u003ehttps://cristianadam.eu/20170709/speeding-up-cmake/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: gold not threaded by default, configure with \"--enable-threads\"\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: lld threaded by default, may be faster than gold\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: oclint\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-oclint\" class=\"anchor\" aria-label=\"Permalink: For contibutors: oclint\" href=\"#for-contibutors-oclint\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMake sure you use \u003ccode\u003eDebug\u003c/code\u003e build with \u003ccode\u003e-e flextool:enable_llvm_tools=True\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://oclint-docs.readthedocs.io/en/stable/devel/codingstandards.html\" rel=\"nofollow\"\u003ehttps://oclint-docs.readthedocs.io/en/stable/devel/codingstandards.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInstallation:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cd ~\nwget --no-check-certificate https://github.com/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz\n# mirror 1: http://github.strcpy.cn/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz\n# mirror 2: http://archives.oclint.org/releases/0.8/oclint-0.8.1-x86_64-linux-3.13.0-35-generic.tar.gz\ntar -xzvf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz\nrm -rf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz\nexport OCLINT_HOME=~/oclint-0.13.1\nexport PATH=$OCLINT_HOME/bin:$PATH\noclint -version\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e\nwget --no-check-certificate https://github.com/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e mirror 1: http://github.strcpy.cn/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e mirror 2: http://archives.oclint.org/releases/0.8/oclint-0.8.1-x86_64-linux-3.13.0-35-generic.tar.gz\u003c/span\u003e\ntar -xzvf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz\nrm -rf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e OCLINT_HOME=\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/oclint-0.13.1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e PATH=\u003cspan class=\"pl-smi\"\u003e$OCLINT_HOME\u003c/span\u003e/bin:\u003cspan class=\"pl-smi\"\u003e$PATH\u003c/span\u003e\noclint -version\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUsage (runs cmake with \u003ccode\u003e-DENABLE_OCLINT=ON\u003c/code\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# NOTE: -DCLEAN_OLD=\u0026quot;OFF\u0026quot; to keep generated html report\n# creates local build in separate folder and runs cmake targets\ncmake -DOCLINT=\u0026quot;ON\u0026quot; -DCLEAN_OLD=\u0026quot;OFF\u0026quot; -P tools/run_tool.cmake\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: -DCLEAN_OLD=\"OFF\" to keep generated html report\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e creates local build in separate folder and runs cmake targets\u003c/span\u003e\ncmake -DOCLINT=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -DCLEAN_OLD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eOFF\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -P tools/run_tool.cmake\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# `report.html` must exist\n# find $PWD -name report.html\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e `report.html` must exist\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e find $PWD -name report.html\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen report.html\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee oclint tutorial: \u003ca href=\"http://docs.oclint.org/en/stable/intro/tutorial.html\" rel=\"nofollow\"\u003ehttp://docs.oclint.org/en/stable/intro/tutorial.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee list of oclint rules at: \u003ca href=\"https://oclint-docs.readthedocs.io/en/stable/rules/\" rel=\"nofollow\"\u003ehttps://oclint-docs.readthedocs.io/en/stable/rules/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: you can suppress oclint warnings \u003ca href=\"http://docs.oclint.org/en/stable/howto/suppress.html#oclint-comment\" rel=\"nofollow\"\u003ehttp://docs.oclint.org/en/stable/howto/suppress.html#oclint-comment\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: clang-format\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-clang-format\" class=\"anchor\" aria-label=\"Permalink: For contibutors: clang-format\" href=\"#for-contibutors-clang-format\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://clang.llvm.org/docs/ClangFormat.html\" rel=\"nofollow\"\u003ehttps://clang.llvm.org/docs/ClangFormat.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsage (runs cmake with \u003ccode\u003e-DENABLE_CLANG_FORMAT=ON\u003c/code\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# creates local build in separate folder and runs cmake targets\ncmake -DCLANG_FORMAT=\u0026quot;ON\u0026quot; -DCLEAN_OLD=\u0026quot;ON\u0026quot; -P tools/run_tool.cmake\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e creates local build in separate folder and runs cmake targets\u003c/span\u003e\ncmake -DCLANG_FORMAT=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -DCLEAN_OLD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -P tools/run_tool.cmake\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe use \u003ccode\u003e.clang-format\u003c/code\u003e file. For details, see: \u003ca href=\"https://clang.llvm.org/docs/ClangFormatStyleOptions.html\" rel=\"nofollow\"\u003ehttps://clang.llvm.org/docs/ClangFormatStyleOptions.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: we use \u003ccode\u003eDisableFormat\u003c/code\u003e, so clang-format will change only include order based on \u003ccode\u003eSortIncludes\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUnfortunately, \u003ccode\u003eclang-format\u003c/code\u003e is not configurable enough, so it can be used only to sort includes. See: \u003ca href=\"https://stackoverflow.com/a/32191189\" rel=\"nofollow\"\u003ehttps://stackoverflow.com/a/32191189\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: uncrustify\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-uncrustify\" class=\"anchor\" aria-label=\"Permalink: For contibutors: uncrustify\" href=\"#for-contibutors-uncrustify\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe use uncrustify bacause clang-format and astyle \u003ca href=\"https://dev.to/voins/does-anybody-know-a-good-working-c-formatting-tool-2lpi\" rel=\"nofollow\"\u003edo not support a lot of options\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://patrickhenson.com/2018/06/07/uncrustify-configuration.html\" rel=\"nofollow\"\u003ehttps://patrickhenson.com/2018/06/07/uncrustify-configuration.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInstallation:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cd ~\ngit clone https://github.com/uncrustify/uncrustify.git\ncd uncrustify\nmkdir build\ncd build\ncmake -DCMAKE_BUILD_TYPE=Release ..\ncmake --build .\nexport UNCRUSTIFY_HOME=~/uncrustify/build\nexport PATH=$UNCRUSTIFY_HOME:$PATH\n# OR sudo make install\n\nuncrustify --version\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e\ngit clone https://github.com/uncrustify/uncrustify.git\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e uncrustify\nmkdir build\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e build\ncmake -DCMAKE_BUILD_TYPE=Release ..\ncmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e UNCRUSTIFY_HOME=\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/uncrustify/build\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e PATH=\u003cspan class=\"pl-smi\"\u003e$UNCRUSTIFY_HOME\u003c/span\u003e:\u003cspan class=\"pl-smi\"\u003e$PATH\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e OR sudo make install\u003c/span\u003e\n\nuncrustify --version\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUsage (runs cmake with \u003ccode\u003e-DENABLE_UNCRUSTIFY=ON\u003c/code\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# creates local build in separate folder and runs cmake targets\ncmake -DUNCRUSTIFY=\u0026quot;ON\u0026quot; -DCLEAN_OLD=\u0026quot;ON\u0026quot; -P tools/run_tool.cmake\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e creates local build in separate folder and runs cmake targets\u003c/span\u003e\ncmake -DUNCRUSTIFY=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -DCLEAN_OLD=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eON\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e -P tools/run_tool.cmake\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe use \u003ccode\u003euncrustify.cfg\u003c/code\u003e file. For details, see: \u003ca href=\"https://patrickhenson.com/2018/06/07/uncrustify-configuration.html\" rel=\"nofollow\"\u003ehttps://patrickhenson.com/2018/06/07/uncrustify-configuration.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo get a list of all available options use:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"uncrustify --show-config\"\u003e\u003cpre\u003euncrustify --show-config\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUncrustify has a lot of configurable options. You'll probably need Universal Indent GUI (in Konstantin's reply) as well to configure it: \u003ca href=\"http://universalindent.sourceforge.net/\" rel=\"nofollow\"\u003ehttp://universalindent.sourceforge.net/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUse comments containing \u003ccode\u003e/* *INDENT-OFF* */\u003c/code\u003e and \u003ccode\u003e/* *INDENT-ON* */\u003c/code\u003e to disable processing of parts of the source file.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee \u003ccode\u003edisable_processing_cmt\u003c/code\u003e from \u003ccode\u003euncrustify.cfg\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-ini notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Specify the marker used in comments to disable processing of part of the\n# file.\n# The comment should be used alone in one line.\n#\n# Default: *INDENT-OFF*\ndisable_processing_cmt = \u0026quot; *INDENT-OFF*\u0026quot; # string\n\n# Specify the marker used in comments to (re)enable processing in a file.\n# The comment should be used alone in one line.\n#\n# Default: *INDENT-ON*\nenable_processing_cmt = \u0026quot; *INDENT-ON*\u0026quot; # string\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Specify the marker used in comments to disable processing of part of the\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e file.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e The comment should be used alone in one line.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Default: *INDENT-OFF*\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003edisable_processing_cmt\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e *INDENT-OFF*\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e string\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Specify the marker used in comments to (re)enable processing in a file.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e The comment should be used alone in one line.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Default: *INDENT-ON*\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eenable_processing_cmt\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e *INDENT-ON*\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e string\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can integrate \u003ccode\u003euncrustify\u003c/code\u003e with IDE:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eQT Creator: \u003ca href=\"https://doc.qt.io/qtcreator/creator-beautifier.html\" rel=\"nofollow\"\u003ehttps://doc.qt.io/qtcreator/creator-beautifier.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVisual Studio Code: \u003ca href=\"https://marketplace.visualstudio.com/items?itemName=LaurentTreguier.uncrustify\" rel=\"nofollow\"\u003ehttps://marketplace.visualstudio.com/items?itemName=LaurentTreguier.uncrustify\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHOW TO BUILD WITH SANITIZERS ENABLED\u003c/h2\u003e\u003ca id=\"user-content-how-to-build-with-sanitizers-enabled\" class=\"anchor\" aria-label=\"Permalink: HOW TO BUILD WITH SANITIZERS ENABLED\" href=\"#how-to-build-with-sanitizers-enabled\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSee \u003ca href=\"https://github.com/blockspacer/llvm_9_installer#how-to-use-with-sanitizers\"\u003ehttps://github.com/blockspacer/llvm_9_installer#how-to-use-with-sanitizers\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: build using clang 10 from conan\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-build-using-clang-10-from-conan\" class=\"anchor\" aria-label=\"Permalink: For contibutors: build using clang 10 from conan\" href=\"#for-contibutors-build-using-clang-10-from-conan\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eRequires \u003ccode\u003eenable_llvm_tools=True\u003c/code\u003e, \u003ccode\u003ecompile_with_llvm_tools=True\u003c/code\u003e, and \u003ccode\u003ellvm_tools:build_type=Release\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"-s llvm_tools:build_type=Release \\\n -e flextool:enable_llvm_tools=True \\\n -e flextool:compile_with_llvm_tools=True \\\n -o llvm_tools:include_what_you_use=True \\\n ...\"\u003e\u003cpre\u003e-s llvm_tools:build_type=Release \\\n -e flextool:enable_llvm_tools=True \\\n -e flextool:compile_with_llvm_tools=True \\\n -o llvm_tools:include_what_you_use=True \\\n ...\u003c/pre\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ccode\u003eenable_llvm_tools\u003c/code\u003e installs clang 10 from conan\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecompile_with_llvm_tools\u003c/code\u003e sets cmake variables required to use clang 10 from conan\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eRun \u003ccode\u003econan install\u003c/code\u003e or \u003ccode\u003econan create\u003c/code\u003e with:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# OR create conan profile https://docs.conan.io/en/latest/reference/profiles.html\n-s compiler=clang \\\n -s compiler.version=10 \\\n -s compiler.libcxx=libc++\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e OR create conan profile https://docs.conan.io/en/latest/reference/profiles.html\u003c/span\u003e\n-s compiler=clang \\\n -s compiler.version=10 \\\n -s compiler.libcxx=libc++\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Change of compiler may require rebuild of all deps (\u003ccode\u003e--build=missing\u003c/code\u003e).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExample in case of local build:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"export CC=$(find ~/.conan/data/llvm_tools/master/conan/stable/package/ -path \u0026quot;*bin/clang\u0026quot; | head -n 1)\n\nexport CXX=$(find ~/.conan/data/llvm_tools/master/conan/stable/package/ -path \u0026quot;*bin/clang++\u0026quot; | head -n 1)\n\nexport VERBOSE=1\nexport CONAN_REVISIONS_ENABLED=1\nexport CONAN_VERBOSE_TRACEBACK=1\nexport CONAN_PRINT_RUN_COMMANDS=1\nexport CONAN_LOGGING_LEVEL=10\n\n# NOTE: NO `--profile` argument cause we use `CXX` env. var\n# NOTE: you may want to re-build `cling_conan` with clang 10\ncmake -E time \\\n conan install . \\\n --install-folder local_build_clang_10 \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --build missing \\\n --build cascade \\\n -s cling_conan:compiler=clang \\\n -s cling_conan:compiler.version=10 \\\n -s cling_conan:compiler.libcxx=libstdc++11 \\\n -o llvm_tools:include_what_you_use=True \\\n -s llvm_tools:compiler=clang \\\n -s llvm_tools:compiler.version=10 \\\n -s llvm_tools:compiler.libcxx=libstdc++11 \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True \\\n -e flextool:compile_with_llvm_tools=True \\\n -e boost:enable_llvm_tools=True \\\n -e boost:compile_with_llvm_tools=True \\\n -s compiler=clang \\\n -s compiler.version=10 \\\n -s compiler.libcxx=libc++\n\ncmake -E time \\\n conan source . \\\n --source-folder local_build_clang_10 \\\n --install-folder local_build_clang_10\n\n# remove old CMakeCache\n(rm local_build_clang_10/CMakeCache.txt || true)\n\n# see section about `conan editable mode`\nconan build . \\\n --build-folder local_build_clang_10 \\\n --source-folder local_build_clang_10 \\\n --install-folder local_build_clang_10\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CC=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e$(\u003c/span\u003efind \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.conan/data/llvm_tools/master/conan/stable/package/ -path \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e*bin/clang\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e head -n 1\u003cspan class=\"pl-pds\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CXX=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e$(\u003c/span\u003efind \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/.conan/data/llvm_tools/master/conan/stable/package/ -path \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e*bin/clang++\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e head -n 1\u003cspan class=\"pl-pds\"\u003e)\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e VERBOSE=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_REVISIONS_ENABLED=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_VERBOSE_TRACEBACK=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_PRINT_RUN_COMMANDS=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CONAN_LOGGING_LEVEL=10\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: NO `--profile` argument cause we use `CXX` env. var\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: you may want to re-build `cling_conan` with clang 10\u003c/span\u003e\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan install \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --install-folder local_build_clang_10 \\\n -s build_type=Debug \\\n -s cling_conan:build_type=Release \\\n -s llvm_tools:build_type=Release \\\n --build missing \\\n --build cascade \\\n -s cling_conan:compiler=clang \\\n -s cling_conan:compiler.version=10 \\\n -s cling_conan:compiler.libcxx=libstdc++11 \\\n -o llvm_tools:include_what_you_use=True \\\n -s llvm_tools:compiler=clang \\\n -s llvm_tools:compiler.version=10 \\\n -s llvm_tools:compiler.libcxx=libstdc++11 \\\n -e flextool:enable_tests=True \\\n -e flextool:enable_llvm_tools=True \\\n -e flextool:compile_with_llvm_tools=True \\\n -e boost:enable_llvm_tools=True \\\n -e boost:compile_with_llvm_tools=True \\\n -s compiler=clang \\\n -s compiler.version=10 \\\n -s compiler.libcxx=libc++\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e \\\n conan \u003cspan class=\"pl-c1\"\u003esource\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --source-folder local_build_clang_10 \\\n --install-folder local_build_clang_10\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old CMakeCache\u003c/span\u003e\n(rm local_build_clang_10/CMakeCache.txt \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see section about `conan editable mode`\u003c/span\u003e\nconan build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --build-folder local_build_clang_10 \\\n --source-folder local_build_clang_10 \\\n --install-folder local_build_clang_10\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePerform checks:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# check that `libcpp` symbol exists\nnm -an EXECUTABLE_PATH | grep libcpp\n\n# list linked dynamic libs\nldd EXECUTABLE_PATH\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e check that `libcpp` symbol exists\u003c/span\u003e\nnm -an EXECUTABLE_PATH \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e grep libcpp\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e list linked dynamic libs\u003c/span\u003e\nldd EXECUTABLE_PATH\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: doxygen\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-doxygen\" class=\"anchor\" aria-label=\"Permalink: For contibutors: doxygen\" href=\"#for-contibutors-doxygen\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eMCSS_ROOT_DIR_FOR_DOCS\u003c/code\u003e must point to \u003ccode\u003em.css\u003c/code\u003e sources like below:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cd ~\n\ngit clone https://github.com/mosra/m.css.git\n\npip3 install jinja2 Pygments\n\nsudo apt install \\\n texlive-base \\\n texlive-latex-extra \\\n texlive-fonts-extra \\\n texlive-fonts-recommended\n\nsudo apt-get install doxygen\n\nsudo apt install python3-pip\n\n# /usr/bin/python must point to python3\n/usr/bin/python --version\n\n# NOTE: switch to python3 for doxygen or use -DPYTHON_EXECUTABLE=/usr/bin/python3\nalias python='/usr/bin/python3'\n\n# You may need sudo here\npip3 install jinja2 Pygments\n\nsudo apt install \\\n texlive-base \\\n texlive-latex-extra \\\n texlive-fonts-extra \\\n texlive-fonts-recommended\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e\n\ngit clone https://github.com/mosra/m.css.git\n\npip3 install jinja2 Pygments\n\nsudo apt install \\\n texlive-base \\\n texlive-latex-extra \\\n texlive-fonts-extra \\\n texlive-fonts-recommended\n\nsudo apt-get install doxygen\n\nsudo apt install python3-pip\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e /usr/bin/python must point to python3\u003c/span\u003e\n/usr/bin/python --version\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: switch to python3 for doxygen or use -DPYTHON_EXECUTABLE=/usr/bin/python3\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003ealias\u003c/span\u003e python=\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e/usr/bin/python3\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e You may need sudo here\u003c/span\u003e\npip3 install jinja2 Pygments\n\nsudo apt install \\\n texlive-base \\\n texlive-latex-extra \\\n texlive-fonts-extra \\\n texlive-fonts-recommended\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse cmake build with '--target doxyDoc' and \u003ccode\u003e-DBUILD_DOXY_DOC=ON\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"cd ~/flextool\n\n# see section about `conan editable mode`\ncd local_build_clang_10\n\n# optional\n# remove old CMakeCache\n(rm CMakeCache.txt || true)\n\n# remove old build artifacts\nrm -rf flextool\nrm -rf bin\nfind . -iname '*.o' -exec rm {} \\;\nfind . -iname '*.a' -exec rm {} \\;\nfind . -iname '*.dll' -exec rm {} \\;\nfind . -iname '*.lib' -exec rm {} \\;\n\n# remove old build docs\nrm -rf doc-mcss\nrm -rf docs\n\ncmake -E make_directory \u0026quot;doc-mcss\u0026quot;\n\n# NOTE: you can change python version like so: -DPYTHON_EXECUTABLE=/usr/bin/python3\ncmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DMCSS_ROOT_DIR_FOR_DOCS=$HOME/m.css \\\n -DPYTHON_EXECUTABLE=/usr/bin/python3 \\\n -DENABLE_TESTS=TRUE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=ON \\\n -DBUILD_DOXY_DOC=ON \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=Debug \\\n -DDOXY_ROOT_DIR=$PWD/doc-mcss \\\n -DDOXY_DOC_COMMON_IMG_PATH=$PWD/.. \\\n -DPROJECT_SOURCES_DIR_FOR_DOCS=$PWD/../src\n\ncmake -E time cmake --build . \\\n --target doxyDoc_notheme\n\ncmake -E time cmake --build . \\\n --target doxyDoc\n\n# Use to find index.html\nfind $PWD -name *.html\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/flextool\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see section about `conan editable mode`\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e local_build_clang_10\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e optional\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old CMakeCache\u003c/span\u003e\n(rm CMakeCache.txt \u003cspan class=\"pl-k\"\u003e||\u003c/span\u003e true)\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old build artifacts\u003c/span\u003e\nrm -rf flextool\nrm -rf bin\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -iname \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e*.o\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -iname \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e*.a\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -iname \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e*.dll\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\nfind \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e -iname \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e*.lib\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e -exec rm {} \u003cspan class=\"pl-cce\"\u003e\\;\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e remove old build docs\u003c/span\u003e\nrm -rf doc-mcss\nrm -rf docs\n\ncmake -E make_directory \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003edoc-mcss\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: you can change python version like so: -DPYTHON_EXECUTABLE=/usr/bin/python3\u003c/span\u003e\ncmake .. \\\n -DCMAKE_VERBOSE_MAKEFILE=TRUE \\\n -DMCSS_ROOT_DIR_FOR_DOCS=\u003cspan class=\"pl-smi\"\u003e$HOME\u003c/span\u003e/m.css \\\n -DPYTHON_EXECUTABLE=/usr/bin/python3 \\\n -DENABLE_TESTS=TRUE \\\n -DBASE_NEED_GEN_BUILD_DATE=FALSE \\\n -DENABLE_DOCTEST=ON \\\n -DBUILD_DOXY_DOC=ON \\\n -DBUILD_SHARED_LIBS=FALSE \\\n -DCONAN_AUTO_INSTALL=OFF \\\n -DCMAKE_BUILD_TYPE=Debug \\\n -DDOXY_ROOT_DIR=\u003cspan class=\"pl-smi\"\u003e$PWD\u003c/span\u003e/doc-mcss \\\n -DDOXY_DOC_COMMON_IMG_PATH=\u003cspan class=\"pl-smi\"\u003e$PWD\u003c/span\u003e/.. \\\n -DPROJECT_SOURCES_DIR_FOR_DOCS=\u003cspan class=\"pl-smi\"\u003e$PWD\u003c/span\u003e/../src\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --target doxyDoc_notheme\n\ncmake -E \u003cspan class=\"pl-k\"\u003etime\u003c/span\u003e cmake --build \u003cspan class=\"pl-c1\"\u003e.\u003c/span\u003e \\\n --target doxyDoc\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Use to find index.html\u003c/span\u003e\nfind \u003cspan class=\"pl-smi\"\u003e$PWD\u003c/span\u003e -name \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e.html\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen doxyDoc/html/index.html\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Document namespaces in docs/namespaces.dox\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: \u003ca href=\"https://mcss.mosra.cz/doxygen/#troubleshooting\" rel=\"nofollow\"\u003eFiles, directories and symbols with no documentation are not present in the output at all\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsed \u003ca href=\"https://mcss.mosra.cz/doxygen/\" rel=\"nofollow\"\u003ecomments style\u003c/a\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"/**\n * @brief Path utils\n *\n * Example usage:\n *\n * @code{.cpp}\n * const ::fs::path workdir = storage::getThisBinaryDirectoryPath();\n * @endcode\n **/\"\u003e\u003cpre\u003e/\u003cspan class=\"pl-k\"\u003e**\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e @brief Path utils\n \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e Example usage:\n \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e @code{.cpp}\n \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e const ::fs::path workdir = \u003cspan class=\"pl-en\"\u003estorage::getThisBinaryDirectoryPath\u003c/span\u003e();\n \u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e @endcode\n \u003cspan class=\"pl-k\"\u003e**\u003c/span\u003e/\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSee:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"http://www.agapow.net/programming/tools/doxygen-cheatsheet/\" rel=\"nofollow\"\u003edoxygen cheatsheet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://doc.magnum.graphics/magnum/coding-style.html#coding-style-documentation\" rel=\"nofollow\"\u003edoxygen coding style\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: Fuzzing with AFL\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-fuzzing-with-afl\" class=\"anchor\" aria-label=\"Permalink: For contibutors: Fuzzing with AFL\" href=\"#for-contibutors-fuzzing-with-afl\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://afl-1.readthedocs.io/en/latest/index.html\" rel=\"nofollow\"\u003ehttps://afl-1.readthedocs.io/en/latest/index.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: prefer github.com/google/AFL or aflplus.plus to not updated AFL from \u003ccode\u003elcamtuf.coredump.cx/afl\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFuzzing is a Black Box software testing technique.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFuzzing consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFuzzer tries to modify the input so that it can reach as much lines of the program code as possible.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTherefore, fuzzing allows the discovery of vulnerabilities lying in code paths that are hard to reach by normal usage.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eInstall + compile the source code using following commands:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# optional\n# sudo apt-get update\n\n# optional\n# sudo apt-get -y install autoconf automake bison build-essential \\\nca-certificates llvm-dev libtool libtool-bin \\\nlibglib2.0-dev make nasm wget\n\n# Tested with clang 10 and gcc 7\nsudo apt-get -y install clang-10 g++-7 gcc-7\n\nexport CXX=g++-7\nexport CC=gcc-7\nexport PATH=/usr/bin/:$PATH\n$CC -v\n\n\n# llvm-config binary that coresponds to the same clang you are using to compile\nexport LLVM_CONFIG=/usr/bin/llvm-config-10\n$LLVM_CONFIG --cxxflags\n\ncd ~\ngit clone -b v2.56b https://github.com/google/AFL.git --recursive\n\n# NOTE: original AFL not updated since November 2017,\n# so prefer `google/AFL.git` to `lcamtuf.coredump.cx/afl`\n# wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz\n# tar -xf afl-latest.tgz\n# rm afl-latest.tgz\n# cd afl*\n\ncd AFL\nmake\n# build llvm using the sample compiler as afl code uses\n# see https://groups.google.com/forum/#!topic/afl-users/1WqZpGXvYY0\nmake \\\n -C llvm_mode \\\n LLVM_CONFIG=$LLVM_CONFIG \\\n CC=clang-10 \\\n CXX=clang++-10\n#\n# optional\n# cd qemu_mode\n# ./build_qemu_support.sh\n# cd ..\n#\nmake \\\n -C libdislocator\nmake \\\n -C libtokencap\nsudo make install\n\n# OR add to PATH via export PATH=$PATH:...\n\n# do not forget to reset CC and LLVM_CONFIG\nunset CXX\nunset CC\nunset LLVM_CONFIG\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e optional\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e sudo apt-get update\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e optional\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e sudo apt-get -y install autoconf automake bison build-essential \\\u003c/span\u003e\nca-certificates llvm-dev libtool libtool-bin \\\nlibglib2.0-dev make nasm wget\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Tested with clang 10 and gcc 7\u003c/span\u003e\nsudo apt-get -y install clang-10 g++-7 gcc-7\n\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CXX=g++-7\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e CC=gcc-7\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e PATH=/usr/bin/:\u003cspan class=\"pl-smi\"\u003e$PATH\u003c/span\u003e\n\u003cspan class=\"pl-smi\"\u003e$CC\u003c/span\u003e -v\n\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e llvm-config binary that coresponds to the same clang you are using to compile\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e LLVM_CONFIG=/usr/bin/llvm-config-10\n\u003cspan class=\"pl-smi\"\u003e$LLVM_CONFIG\u003c/span\u003e --cxxflags\n\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e\ngit clone -b v2.56b https://github.com/google/AFL.git --recursive\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: original AFL not updated since November 2017,\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e so prefer `google/AFL.git` to `lcamtuf.coredump.cx/afl`\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e tar -xf afl-latest.tgz\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e rm afl-latest.tgz\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e cd afl*\u003c/span\u003e\n\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e AFL\nmake\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e build llvm using the sample compiler as afl code uses\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see https://groups.google.com/forum/#!topic/afl-users/1WqZpGXvYY0\u003c/span\u003e\nmake \\\n -C llvm_mode \\\n LLVM_CONFIG=\u003cspan class=\"pl-smi\"\u003e$LLVM_CONFIG\u003c/span\u003e \\\n CC=clang-10 \\\n CXX=clang++-10\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e optional\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e cd qemu_mode\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e ./build_qemu_support.sh\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e cd ..\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e\u003c/span\u003e\nmake \\\n -C libdislocator\nmake \\\n -C libtokencap\nsudo make install\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e OR add to PATH via export PATH=$PATH:...\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e do not forget to reset CC and LLVM_CONFIG\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003eunset\u003c/span\u003e CXX\n\u003cspan class=\"pl-c1\"\u003eunset\u003c/span\u003e CC\n\u003cspan class=\"pl-c1\"\u003eunset\u003c/span\u003e LLVM_CONFIG\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWe compile code using the AFL compiler: \u003ccode\u003e-DCMAKE_C_COMPILER=afl-clang-fast\u003c/code\u003e, \u003ccode\u003e-DCMAKE_CXX_COMPILER=afl-clang-fast++\u003c/code\u003e, and \u003ccode\u003e-DCMAKE_LINKER=afl-clang-fast\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo verify if binary uses the AFL compiler: \u003ccode\u003enm BINARY_PATH | grep afl\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo build application with some sanitizers and debug information enabled: (\u003ccode\u003e-DENABLE_ASAN=ON\u003c/code\u003e etc.):\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: There are some things to consider when using Address Sanitizer. Even if ASan finds a memory access violation, it doesn't automatically crash the application.\nThis is a problem when using automated fuzzing tools because they usually try to detect segfaults by checking the return code.\nWe can, however, force ASan to crash software when an error happens with the environment variable ASAN_OPTIONS before fuzzing: \u003ccode\u003eexport ASAN_OPTIONS='abort_on_error=1'\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Disable custom memory allocation functions. This can hide memory access bugs and prevent the detection of memory access errors.\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# see https://afl-1.readthedocs.io/en/latest/instrumenting.html\n\n# Setting AFL_HARDEN automatically adds code hardening options\n# when invoking the downstream compiler.\n# This includes -D_FORTIFY_SOURCE=2 and -fstack-protector-all.\n# NOTE: _FORTIFY_SOURCE not compatible with ASAN\n# export AFL_HARDEN=1\n\n# see https://aflplus.plus/docs/env_variables/\nexport AFL_EXIT_WHEN_DONE=1\n\n# By default, the wrapper appends -O3 to optimize builds.\nexport AFL_DONT_OPTIMIZE=1\n\n# or AFL_USE_MSAN, etc.\n# READ https://aflplus.plus/docs/notes_for_asan/\nNOTE: if you run several slaves only one should run the\n# target compiled with ASAN (and UBSAN, CFISAN),\n# the others should run the target with no sanitizers compiled in.\nexport AFL_USE_UBSAN=1\nexport AFL_USE_ASAN=1\n\n# AFL_PRELOAD causes AFL to set LD_PRELOAD for the target binary\n# without disrupting the afl-fuzz process itself.\n# This is useful, among other things, for bootstrapping libdislocator.so.\n\n# see __AFL_LOOP\n# export AFL_PERSISTENT=1\n\n# make sure you compile app with `-fsanitize=address` or `-fsanitize=memory` etc.\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see https://afl-1.readthedocs.io/en/latest/instrumenting.html\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Setting AFL_HARDEN automatically adds code hardening options\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e when invoking the downstream compiler.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e This includes -D_FORTIFY_SOURCE=2 and -fstack-protector-all.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e NOTE: _FORTIFY_SOURCE not compatible with ASAN\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e export AFL_HARDEN=1\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see https://aflplus.plus/docs/env_variables/\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e AFL_EXIT_WHEN_DONE=1\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e By default, the wrapper appends -O3 to optimize builds.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e AFL_DONT_OPTIMIZE=1\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e or AFL_USE_MSAN, etc.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e READ https://aflplus.plus/docs/notes_for_asan/\u003c/span\u003e\nNOTE: \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e you run several slaves only one should run the\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e target compiled with ASAN (and UBSAN, CFISAN),\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e the others should run the target with no sanitizers compiled in.\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e AFL_USE_UBSAN=1\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e AFL_USE_ASAN=1\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e AFL_PRELOAD causes AFL to set LD_PRELOAD for the target binary\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e without disrupting the afl-fuzz process itself.\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e This is useful, among other things, for bootstrapping libdislocator.so.\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see __AFL_LOOP\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e export AFL_PERSISTENT=1\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e make sure you compile app with `-fsanitize=address` or `-fsanitize=memory` etc.\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Use \u003ccode\u003eAFL_DONT_OPTIMIZE=1\u003c/code\u003e; read: \u003ca href=\"http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html\" rel=\"nofollow\"\u003ehttp://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see: \u003ca href=\"https://afl-1.readthedocs.io/en/latest/notes_for_asan.html\" rel=\"nofollow\"\u003eUsing ASAN with AFL\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBefore fuzzing the program, we may require switching to root user to arrange the core_pattern. Login as root and type the following command:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# see https://afl-1.readthedocs.io/en/latest/tips.html#check-os-configuration\nsudo su\n# disable core dumps and CPU frequency scaling on your system (AFL will warn you if you should do this)\necho core \u0026gt;/proc/sys/kernel/core_pattern\n# afl-fuzz will usually complain that you should change your `CPUFREQ` settings to performance because the automatic frequency scaling by the Linux kernel doesn't work well with afl.\necho performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor\nexit\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see https://afl-1.readthedocs.io/en/latest/tips.html#check-os-configuration\u003c/span\u003e\nsudo su\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e disable core dumps and CPU frequency scaling on your system (AFL will warn you if you should do this)\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003eecho\u003c/span\u003e core \u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e/proc/sys/kernel/core_pattern\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e afl-fuzz will usually complain that you should change your `CPUFREQ` settings to performance because the automatic frequency scaling by the Linux kernel doesn't work well with afl.\u003c/span\u003e\n\u003cspan class=\"pl-c1\"\u003eecho\u003c/span\u003e performance \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e tee /sys/devices/system/cpu/cpu\u003cspan class=\"pl-k\"\u003e*\u003c/span\u003e/cpufreq/scaling_governor\n\u003cspan class=\"pl-c1\"\u003eexit\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Do not run the fuzzer with root access\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Get a solid environment for the fuzzer; never run the fuzzer on low configured hypervisors.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eafl-fuzz\u003c/code\u003e is used to run AFL. The actual syntax is as follows:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# see https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries\n# -i is a directory of files to use as fuzz input \u0026quot;seeds\u0026quot;\n# -o is a directory to write the results (including inputs that provoke crashes or hangs)\n# -m is the memory allowed to use. Example: -m500\n# You can use -m none to disable memory limit\n# -t is the maximum time that a run is allowed to take before being declared a \u0026quot;hang\u0026quot;\n# Timeout of 10 seconds: -t 10000\n# @@ is fuzzer input file name\n# if you skip @@ it will pass the fuzzed file on the standard input\nAFL_PERSISTENT=1 afl-fuzz -i [TESTCASE DIR] -o [RESULT_DIR] [TARGET_BINARY] [BINARY_PARAMS] @@\n\n# Example 1: runs `tar` with arguments `xfJ @@ -C fuzz-garbage/ --force-local`\n# where @@ is fuzzer input file name\n ./afl-1.56b/afl-fuzz -i fuzz-input/ -o fuzz-state/ -t 10000 ~/tar-1.28/src/tar xfJ @@ -C fuzz-garbage/ --force-local\n\n# Example 2: server is dual core, so we can run one AFL instance per core\nAFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -M master ./fuzz_capstone\n# In another terminal\nAFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -S slave1 ./fuzz_capstone\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e -i is a directory of files to use as fuzz input \"seeds\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e -o is a directory to write the results (including inputs that provoke crashes or hangs)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e -m is the memory allowed to use. Example: -m500\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e You can use -m none to disable memory limit\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e -t is the maximum time that a run is allowed to take before being declared a \"hang\"\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Timeout of 10 seconds: -t 10000\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e @@ is fuzzer input file name\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e if you skip @@ it will pass the fuzzed file on the standard input\u003c/span\u003e\nAFL_PERSISTENT=1 afl-fuzz -i [TESTCASE DIR] -o [RESULT_DIR] [TARGET_BINARY] [BINARY_PARAMS] @@\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Example 1: runs `tar` with arguments `xfJ @@ -C fuzz-garbage/ --force-local`\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e where @@ is fuzzer input file name\u003c/span\u003e\n ./afl-1.56b/afl-fuzz -i fuzz-input/ -o fuzz-state/ -t 10000 \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/tar-1.28/src/tar xfJ @@ -C fuzz-garbage/ --force-local\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Example 2: server is dual core, so we can run one AFL instance per core\u003c/span\u003e\nAFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -M master ./fuzz_capstone\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e In another terminal\u003c/span\u003e\nAFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -S slave1 ./fuzz_capstone\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo understand AFL status screen, read: \u003ca href=\"https://afl-1.readthedocs.io/en/latest/user_guide.html#status-screen\" rel=\"nofollow\"\u003ehttps://afl-1.readthedocs.io/en/latest/user_guide.html#status-screen\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: If \u003ccode\u003etotal paths\u003c/code\u003e stays at 1 you probably have set up something wrong.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Prefer \u003ccode\u003e-m none\u003c/code\u003e. We use AddressSanitizer; this maps a lot of pages for the shadow memory, so we have to remove the memory limit to have it up and running.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: With \u003ccode\u003e-m none\u003c/code\u003e, your fuzzed software may actually try to really allocate and use a lot of memory due to your fuzzed samples.\nThis may lead to random crashes in your system. You shouldn't do any important work while doing so.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: you can try \u003ccode\u003eASAN_OPTIONS=hard_rss_limit_mb=2000\u003c/code\u003e to avoid \u003ccode\u003e-m none\u003c/code\u003e. See: \u003ca href=\"https://countuponsecurity.com/category/fuzzing/\" rel=\"nofollow\"\u003ehttps://countuponsecurity.com/category/fuzzing/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can write custom binary that will run using \u003ccode\u003eafl-fuzz\u003c/code\u003e. It may wrap function that you want to test like so:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// harness is simply a C program that makes use of certain methods from\n// a library, allowing you to indirectly fuzz it\n\n#include \u0026lt;cstdio\u0026gt;\n#include \u0026lt;cstdlib\u0026gt;\n#include \u0026lt;string\u0026gt;\n#include \u0026lt;iostream\u0026gt;\n#include \u0026lt;ifstream\u0026gt;\n\nint main(int argc, char *argv[]) {\n{\n // init resources here\n if (argc \u0026gt; 1) {\n std::ifstream fin;\n fin.open(argv[1]);\n parse(fin); // custom logic\n } else {\n /// \\note requires AFL_PERSISTENT=1\n // __AFL_LOOP is the way that we have to tell AFL\n // that we want persistent mode.\n // Each fuzzing iteration,\n // instead of to fork and re-execute the target with a different input,\n // is just an execution of this loop.\n // Force AFL to run 1000 times,\n // with 1000 different inputs fed to the library.\n // After that, the process is restarted by AFL.\n // This ensures we regularly replace the process to avoid memory leaks.\n // see https://toastedcornflakes.github.io/articles/fuzzing_capstone_with_afl.html\n while (__AFL_LOOP(1000)) {\n parse(std::cin); // custom logic\n }\n }\n // free resources here\n return 0;\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e harness is simply a C program that makes use of certain methods from\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e a library, allowing you to indirectly fuzz it\u003c/span\u003e\n\n#\u003cspan class=\"pl-k\"\u003einclude\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c/span\u003ecstdio\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c/span\u003e\u003c/span\u003e\n#\u003cspan class=\"pl-k\"\u003einclude\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c/span\u003ecstdlib\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c/span\u003e\u003c/span\u003e\n#\u003cspan class=\"pl-k\"\u003einclude\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c/span\u003estring\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c/span\u003e\u003c/span\u003e\n#\u003cspan class=\"pl-k\"\u003einclude\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c/span\u003eiostream\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c/span\u003e\u003c/span\u003e\n#\u003cspan class=\"pl-k\"\u003einclude\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c/span\u003eifstream\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c/span\u003e\u003c/span\u003e\n\n\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003emain\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e argc, \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e *argv[]) {\n{\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e init resources here\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (argc \u0026gt; \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e) {\n std::ifstream fin;\n fin.\u003cspan class=\"pl-c1\"\u003eopen\u003c/span\u003e(argv[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e]);\n \u003cspan class=\"pl-c1\"\u003eparse\u003c/span\u003e(fin); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e custom logic\u003c/span\u003e\n } \u003cspan class=\"pl-k\"\u003eelse\u003c/span\u003e {\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e/ \\note requires AFL_PERSISTENT=1\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e __AFL_LOOP is the way that we have to tell AFL\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e that we want persistent mode.\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Each fuzzing iteration,\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e instead of to fork and re-execute the target with a different input,\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e is just an execution of this loop.\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Force AFL to run 1000 times,\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e with 1000 different inputs fed to the library.\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e After that, the process is restarted by AFL.\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e This ensures we regularly replace the process to avoid memory leaks.\u003c/span\u003e\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e see https://toastedcornflakes.github.io/articles/fuzzing_capstone_with_afl.html\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ewhile\u003c/span\u003e (\u003cspan class=\"pl-c1\"\u003e__AFL_LOOP\u003c/span\u003e(\u003cspan class=\"pl-c1\"\u003e1000\u003c/span\u003e)) {\n \u003cspan class=\"pl-c1\"\u003eparse\u003c/span\u003e(std::cin); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e custom logic\u003c/span\u003e\n }\n }\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e free resources here\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e;\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNOTE: __AFL_LOOP() allows AFL to perform the fuzzing of the binary in process through some memory wizardry, as opposed to starting up a new process for every new testcase we want to test. Requires \u003ccode\u003eAFL_PERSISTENT=1\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBy default, AFL forks a process every time it tests a different input. We can control AFL to run multiple fuzz cases in a single instance of the program, rather than reverting the program state back for every test sample. This will reduce the time spent in the kernel space and improve the fuzzing speed. This is called AFL_PERSISTENT mode. We can do that by including the __AFL_LOOP(1000) macro within our test harness.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: you may be interested in __AFL_INIT; see for details: \u003ca href=\"https://robertheaton.com/2019/07/08/how-to-write-an-afl-wrapper-for-any-language/\" rel=\"nofollow\"\u003ehttps://robertheaton.com/2019/07/08/how-to-write-an-afl-wrapper-for-any-language/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eLet the fuzzer run for few hours or days as it generates maximum code execution paths based on the test cases provided.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eStop fuzzing issuing \u003ccode\u003ectrl+c’ observing \u003c/code\u003etotal paths\u003ccode\u003eand\u003c/code\u003euniq crashes\u003ccode\u003ein the section\u003c/code\u003eoverall results` of AFL statistics screen.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCreate dictionary that takes all of the constants and strings found in the program binary and adds them to the dictionary.\nSee for script code:\u003ca href=\"http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html\" rel=\"nofollow\"\u003ehttp://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"#!/bin/bash\n\n# see http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html\n\nobjdump -d \u0026quot;${1}\u0026quot; | grep -Eo '\\$0x[0-9a-f]+' | cut -c 2- | sort -u | while read const; do echo $const | python -c 'import sys, struct; sys.stdout.write(\u0026quot;\u0026quot;.join(struct.pack(\u0026quot;\u0026lt;I\u0026quot; if len(l) \u0026lt;= 11 else \u0026quot;\u0026lt;Q\u0026quot;, int(l,0)) for l in sys.stdin.readlines()))' \u0026gt; testcases/$const; done\ni=0; strings \u0026quot;${1}\u0026quot;| while read line; do echo -n \u0026quot;$line\u0026quot; \u0026gt; testcases/string_${i} ; i=$[ $i + 1 ] ; done\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#!\u003c/span\u003e/bin/bash\u003c/span\u003e\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e see http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html\u003c/span\u003e\n\nobjdump -d \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e${1}\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e grep -Eo \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\\$0x[0-9a-f]+\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e cut -c 2- \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e sort -u \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eread\u003c/span\u003e const\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edo\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eecho\u003c/span\u003e \u003cspan class=\"pl-smi\"\u003e$const\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e python -c \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003eimport sys, struct; sys.stdout.write(\"\".join(struct.pack(\"\u0026lt;I\" if len(l) \u0026lt;= 11 else \"\u0026lt;Q\", int(l,0)) for l in sys.stdin.readlines()))\u003cspan class=\"pl-pds\"\u003e'\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e testcases/\u003cspan class=\"pl-smi\"\u003e$const\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edone\u003c/span\u003e\ni=0\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e strings \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e${1}\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"pl-k\"\u003e|\u003c/span\u003e \u003cspan class=\"pl-k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eread\u003c/span\u003e line\u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edo\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eecho\u003c/span\u003e -n \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003cspan class=\"pl-smi\"\u003e$line\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u0026gt;\u003c/span\u003e testcases/string_\u003cspan class=\"pl-smi\"\u003e${i}\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e i=$[ \u003cspan class=\"pl-smi\"\u003e$i\u003c/span\u003e + 1 ] \u003cspan class=\"pl-k\"\u003e;\u003c/span\u003e \u003cspan class=\"pl-k\"\u003edone\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou need to create a dictionary in one of the two formats discussed in dictionaries/README.dictionaries and then point the fuzzer to it via the -x option in the command line.\nRead: \u003ca href=\"https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries\" rel=\"nofollow\"\u003ehttps://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries\u003c/a\u003e and \u003ca href=\"https://github.com/mirrorer/afl/blob/master/dictionaries/README.dictionaries\"\u003ehttps://github.com/mirrorer/afl/blob/master/dictionaries/README.dictionaries\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eYou can also use \u003ccode\u003elibtokencap\u003c/code\u003e to create a dictionary; see: \u003ca href=\"https://github.com/mirrorer/afl/blob/master/libtokencap/README.tokencap\"\u003ehttps://github.com/mirrorer/afl/blob/master/libtokencap/README.tokencap\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWe can find the test cases which cause the crash in the \u003ccode\u003eresults\u003c/code\u003e folder which we have created. On navigating to the folder \u003ccode\u003eresults\u003c/code\u003e, we observe few folders get generated.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Keep the input data files small; under 1 kB is ideal.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003eafl-cmin\u003c/code\u003e to minimize number of input data files.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003eafl-tmin\u003c/code\u003e to minimize each input data file (removes any bytes that do not affect the code paths taken).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003eafl-ptmin\u003c/code\u003e to run \u003ccode\u003eafl-tmin\u003c/code\u003e in parallel. For details, see: \u003ca href=\"https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/\" rel=\"nofollow\"\u003ehttps://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo reproduce found crash you can use \u003ccode\u003ecrashwalk\u003c/code\u003e (it is gdb plugin), see: \u003ca href=\"https://ritcsec.wordpress.com/2018/05/10/vulnerability-discovery-by-fuzzing/\" rel=\"nofollow\"\u003ehttps://ritcsec.wordpress.com/2018/05/10/vulnerability-discovery-by-fuzzing/\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"apt-get install gdb golang\nmkdir src\ncd src\ngit clone https://github.com/jfoote/exploitable.git\ncd \u0026amp;\u0026amp; mkdir go\nexport GOPATH=~/go\n# crashwalk installed in $GOPATH/bin/\ngo get -u github.com/bnagy/crashwalk/cmd/...\n\n# USAGE\n~/go/bin/cwtriage -root syncdir/fuzzer1/crashes/ -match id -- ~/parse @@\"\u003e\u003cpre\u003eapt-get install gdb golang\nmkdir src\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e src\ngit clone https://github.com/jfoote/exploitable.git\n\u003cspan class=\"pl-c1\"\u003ecd\u003c/span\u003e \u003cspan class=\"pl-k\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e mkdir go\n\u003cspan class=\"pl-k\"\u003eexport\u003c/span\u003e GOPATH=\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/go\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e crashwalk installed in $GOPATH/bin/\u003c/span\u003e\ngo get -u github.com/bnagy/crashwalk/cmd/...\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e USAGE\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/go/bin/cwtriage -root syncdir/fuzzer1/crashes/ -match id -- \u003cspan class=\"pl-k\"\u003e~\u003c/span\u003e/parse @@\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhen you can not reproduce a crash found by afl-fuzz, the most likely cause is that you are not setting the same memory limit as used by the tool.\nRead: \u003ca href=\"https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries\" rel=\"nofollow\"\u003ehttps://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: You can use \u003ccode\u003eafl-cov\u003c/code\u003e to quantify how well you are exercising the available code paths in the binary.\nFor details, see: \u003ca href=\"https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/\" rel=\"nofollow\"\u003ehttps://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: putting the AFL working directory on a RAM disk, you can potentially gain some additional speed and avoid wearing out the disks at the same time.\nFor details, see: \u003ca href=\"https://bananamafia.dev/post/gb-fuzz/\" rel=\"nofollow\"\u003ehttps://bananamafia.dev/post/gb-fuzz/\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# Fuzzing involves billions of reads and writes to the filesystem (!!!)\n# Use RAMdisks for input since, we don't want to destroy harddrives\n# Make a 1GB ramdisk file from which AFL can read input\nsudo mkdir -p /mnt/inputfiles\nsudo chown -R $USER:$(id -gn $USER) /mnt/inputfiles\nsudo mount -t tmpfs -o size=1024M tmpfs /mnt/inputfiles/\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Fuzzing involves billions of reads and writes to the filesystem (!!!)\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Use RAMdisks for input since, we don't want to destroy harddrives\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e#\u003c/span\u003e Make a 1GB ramdisk file from which AFL can read input\u003c/span\u003e\nsudo mkdir -p /mnt/inputfiles\nsudo chown -R \u003cspan class=\"pl-smi\"\u003e$USER\u003c/span\u003e:\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e$(\u003c/span\u003eid -gn \u003cspan class=\"pl-smi\"\u003e$USER\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e)\u003c/span\u003e\u003c/span\u003e /mnt/inputfiles\nsudo mount -t tmpfs -o size=1024M tmpfs /mnt/inputfiles/\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNOTE: \u003ccode\u003e-fvisibility-inlines-hidden\u003c/code\u003e flag MAY BREAK AFL INSTRUMENTATION\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAFL provides a crash exploration script in \u003ccode\u003eexperimental/crash_triage/triage_crashes.sh\u003c/code\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWhen run, the triage script will cycle through each crash file in the \u003ccode\u003e/out/crashes\u003c/code\u003e directory and print the resulting crash data to the screen.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003etriage_crashes\u003c/code\u003e usage: \u003ccode\u003e./triage_crashes.sh ~/targets/out/ ~/targets/target-app/target-app_binary\u003c/code\u003e\nFor details, see: \u003ca href=\"https://research.aurainfosec.io/hunting-for-bugs-101/\" rel=\"nofollow\"\u003ehttps://research.aurainfosec.io/hunting-for-bugs-101/\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: Instrument with AFL just the libraries you actually want to stress-test right now, one at a time.\nLet the program use system-wide, non-instrumented libraries for any functionality you don’t actually want to fuzz.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: you can enable \u003ccode\u003ecrash exploration mode\u003c/code\u003e via \u003ccode\u003e-C\u003c/code\u003e; see: \u003ca href=\"https://lcamtuf.blogspot.com/2014/11/afl-fuzz-crash-exploration-mode.html\" rel=\"nofollow\"\u003ehttps://lcamtuf.blogspot.com/2014/11/afl-fuzz-crash-exploration-mode.html\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: AFL detects faults by checking for the first spawned process dying due to a signal (SIGSEGV, SIGABRT, etc). Programs that install custom handlers for these signals may need to have the relevant code commented out.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mykter/afl-training\"\u003ehttps://github.com/mykter/afl-training\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.loginsoft.com/blog/2018/02/02/discovering-vulnerabilities-with-afl-fuzzer/\" rel=\"nofollow\"\u003ehttps://www.loginsoft.com/blog/2018/02/02/discovering-vulnerabilities-with-afl-fuzzer/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=vzfhHjnycnE\" rel=\"nofollow\"\u003ehttps://www.youtube.com/watch?v=vzfhHjnycnE\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gamozolabs.github.io/fuzzing/2018/09/16/scaling_afl.html\" rel=\"nofollow\"\u003ehttps://gamozolabs.github.io/fuzzing/2018/09/16/scaling_afl.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://ritcsec.wordpress.com/2018/05/10/vulnerability-discovery-by-fuzzing/\" rel=\"nofollow\"\u003ehttps://ritcsec.wordpress.com/2018/05/10/vulnerability-discovery-by-fuzzing/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Dor1s/libfuzzer-workshop/blob/master/lessons/01/Modern_Fuzzing_of_C_C%2B%2B_projects_slides_1-23.pdf\"\u003ehttps://github.com/Dor1s/libfuzzer-workshop/blob/master/lessons/01/Modern_Fuzzing_of_C_C%2B%2B_projects_slides_1-23.pdf\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/hbowden/nextgen/blob/master/CMakeLists.txt#L92\"\u003ehttps://github.com/hbowden/nextgen/blob/master/CMakeLists.txt#L92\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/\" rel=\"nofollow\"\u003ehttps://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://cs.anu.edu.au/courses/csprojects/19S1/reports/u6759601_report.pdf\" rel=\"nofollow\"\u003ehttps://cs.anu.edu.au/courses/csprojects/19S1/reports/u6759601_report.pdf\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.fastly.com/blog/how-fuzz-server-american-fuzzy-lop\" rel=\"nofollow\"\u003ehttps://www.fastly.com/blog/how-fuzz-server-american-fuzzy-lop\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: Fuzzing with libFuzzer\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-fuzzing-with-libfuzzer\" class=\"anchor\" aria-label=\"Permalink: For contibutors: Fuzzing with libFuzzer\" href=\"#for-contibutors-fuzzing-with-libfuzzer\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003elibFuzzer is part of the LLVM compiler infrastructure project and comes built-in with the clang compiler.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThen libFuzzer can be linked to the desired driver by passing in \u003ccode\u003e-fsanitize=fuzzer\u003c/code\u003e during the linking stage.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: \u003ccode\u003e-fsanitize=fuzzer\u003c/code\u003e links in the libFuzzer’s main() symbol.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: In most cases you may want to combine libFuzzer with AddressSanitizer (ASAN), UndefinedBehaviorSanitizer (UBSAN), or both. You can also build with MemorySanitizer (MSAN), but support is experimental: \u003ccode\u003e-fsanitize=undefined,address,fuzzer\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExecutable repeatedly calls the following function:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"extern \u0026quot;C\u0026quot; int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {\n // DoStuffWithYourAPI(Data, Size);\n return 0;\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eextern\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eC\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eLLVMFuzzerTestOneInput\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003euint8_t\u003c/span\u003e *Data, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003eSize\u003c/span\u003e) {\n \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e DoStuffWithYourAPI(Data, Size);\u003c/span\u003e\n \u003cspan class=\"pl-k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e;\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUse \u003ccode\u003e-fsanitize=address,fuzzer\u003c/code\u003e. Note that you can change sanitizer (address, memory, thread, etc.).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNOTE: if you suspect memory leaks in your target you should run libFuzzer with \u003ccode\u003e-runs=N\u003c/code\u003e or \u003ccode\u003e-max_total_time=N\u003c/code\u003e. If your target has massive leaks you will eventually run out of RAM. To protect your machine from OOM death you may use: \u003ccode\u003eASAN_OPTIONS=hard_rss_limit_mb=2000\u003c/code\u003e (with AddressSanitizer).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003elibFuzzer requires seed corpus. For details, see: \u003ca href=\"https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md\"\u003ehttps://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor details, see:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://llvm.org/docs/LibFuzzer.html\" rel=\"nofollow\"\u003ehttps://llvm.org/docs/LibFuzzer.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://medium.com/@levwalkin/compile-llvm-clang-libfuzzer-b61e82718430\" rel=\"nofollow\"\u003ehttps://medium.com/@levwalkin/compile-llvm-clang-libfuzzer-b61e82718430\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Dor1s/libfuzzer-workshop\"\u003ehttps://github.com/Dor1s/libfuzzer-workshop\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md\"\u003ehttps://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFor contibutors: Prefer Clang To GCC\u003c/h2\u003e\u003ca id=\"user-content-for-contibutors-prefer-clang-to-gcc\" class=\"anchor\" aria-label=\"Permalink: For contibutors: Prefer Clang To GCC\" href=\"#for-contibutors-prefer-clang-to-gcc\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eClang supports thread safety annotations (GUARDED_BY)\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eEnable \u003ccode\u003e-Wthread-safety-analysis\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eUse \u003ccode\u003ebase/thread_annotations.h\u003c/code\u003e \u003ca href=\"https://github.com/chromium/chromium/blob/master/base/thread_annotations.h\"\u003ehttps://github.com/chromium/chromium/blob/master/base/thread_annotations.h\u003c/a\u003e\nFor details, see:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"http://clang.llvm.org/docs/ThreadSafetyAnalysis.html\" rel=\"nofollow\"\u003ehttp://clang.llvm.org/docs/ThreadSafetyAnalysis.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003esee \u003ca href=\"https://github.com/isocpp/CppCoreGuidelines/blob/master/docs/Lifetime.pdf\"\u003ehttps://github.com/isocpp/CppCoreGuidelines/blob/master/docs/Lifetime.pdf\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://insights.sei.cmu.edu/sei_blog/2014/10/thread-safety-analysis-in-c-and-c.html\" rel=\"nofollow\"\u003ehttps://insights.sei.cmu.edu/sei_blog/2014/10/thread-safety-analysis-in-c-and-c.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eClang fas first-class support for sanitizers.\nSee details about MSAN, ASAN, TSAN, etc. in docs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eClang can be build with lifetime profile:\u003c/p\u003e\n\u003col dir=\"auto\"\u003e\n\u003cli\u003eBuild special branch of Clang \u003ca href=\"https://github.com/mgehre/llvm-project\"\u003ehttps://github.com/mgehre/llvm-project\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEnable \u003ccode\u003e-Wlifetime\u003c/code\u003e\nFor details, see:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://pspdfkit.com/blog/2020/the-cpp-lifetime-profile/\" rel=\"nofollow\"\u003ehttps://pspdfkit.com/blog/2020/the-cpp-lifetime-profile/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://herbsutter.com/2018/09/20/lifetime-profile-v1-0-posted/\" rel=\"nofollow\"\u003ehttps://herbsutter.com/2018/09/20/lifetime-profile-v1-0-posted/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLICENSE for open source components\u003c/h2\u003e\u003ca id=\"user-content-license-for-open-source-components\" class=\"anchor\" aria-label=\"Permalink: LICENSE for open source components\" href=\"#license-for-open-source-components\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAll the open source components are used under their associated open source licences.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsed open source components:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eicu\u003c/li\u003e\n\u003cli\u003eced\u003c/li\u003e\n\u003cli\u003eboost\u003c/li\u003e\n\u003cli\u003eharfbuzz\u003c/li\u003e\n\u003cli\u003eboost.outcome\u003c/li\u003e\n\u003cli\u003echromium (base)\u003c/li\u003e\n\u003cli\u003elibevent\u003c/li\u003e\n\u003cli\u003emodp_b64\u003c/li\u003e\n\u003cli\u003etcmalloc\u003c/li\u003e\n\u003cli\u003exdg_mime\u003c/li\u003e\n\u003cli\u003exdg_user_dirs\u003c/li\u003e\n\u003cli\u003edynamic_annotations\u003c/li\u003e\n\u003cli\u003e(Facebook) Folly\u003c/li\u003e\n\u003cli\u003e(Microsoft) GSL\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eSee LICENSE files\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eLICENSE\u003c/h2\u003e\u003ca id=\"user-content-license\" class=\"anchor\" aria-label=\"Permalink: LICENSE\" href=\"#license\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ethe MIT license\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee LICENSE for the full content of the licenses.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDisclaimer\u003c/h2\u003e\u003ca id=\"user-content-disclaimer\" class=\"anchor\" aria-label=\"Permalink: Disclaimer\" href=\"#disclaimer\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThat open source project based on the Google Chromium project.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis is not official Google product.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePortions Copyright (c) Google Inc.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSee LICENSE files.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributors List: Example Profile\u003c/h3\u003e\u003ca id=\"user-content-contributors-list-example-profile\" class=\"anchor\" aria-label=\"Permalink: Contributors List: Example Profile\" href=\"#contributors-list-example-profile\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eI'm an example that you can copy, if you want :)\u003c/li\u003e\n\u003cli\u003eI work on many things like...\u003c/li\u003e\n\u003cli\u003eMy hobbies include...\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eContributors List\u003c/h3\u003e\u003ca id=\"user-content-contributors-list\" class=\"anchor\" aria-label=\"Permalink: Contributors List\" href=\"#contributors-list\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eA\u003c/h4\u003e\u003ca id=\"user-content-a\" class=\"anchor\" aria-label=\"Permalink: A\" href=\"#a\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAnindita Basu\u003c/h5\u003e\u003ca id=\"user-content-anindita-basu\" class=\"anchor\" aria-label=\"Permalink: Anindita Basu\" href=\"#anindita-basu\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eTechnical writer\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://twitter.com/anindita_basu\" rel=\"nofollow\"\u003etwitter\u003c/a\u003e\n\u003ca href=\"https://github.com/AninditaBasu\"\u003egithub\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAnna Hayhurst\u003c/h5\u003e\u003ca id=\"user-content-anna-hayhurst\" class=\"anchor\" aria-label=\"Permalink: Anna Hayhurst\" href=\"#anna-hayhurst\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eJunior Developer\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/annahayhurst\"\u003egithub\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eC\u003c/h4\u003e\u003ca id=\"user-content-c\" class=\"anchor\" aria-label=\"Permalink: C\" href=\"#c\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCassio Espindola\u003c/h5\u003e\u003ca id=\"user-content-cassio-espindola\" class=\"anchor\" aria-label=\"Permalink: Cassio Espindola\" href=\"#cassio-espindola\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eAnalyst Developer\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/cassioesp\"\u003egithub\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eD\u003c/h4\u003e\u003ca id=\"user-content-d\" class=\"anchor\" aria-label=\"Permalink: D\" href=\"#d\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDenis Trofimov\u003c/h5\u003e\u003ca id=\"user-content-denis-trofimov\" class=\"anchor\" aria-label=\"Permalink: Denis Trofimov\" href=\"#denis-trofimov\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eC++ Developer\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/blockspacer\"\u003egithub\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/derofim\"\u003egithub\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.linkedin.com/in/denis-trofimov-4335bb13b/\" rel=\"nofollow\"\u003elinkedin\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eM\u003c/h4\u003e\u003ca id=\"user-content-m\" class=\"anchor\" aria-label=\"Permalink: M\" href=\"#m\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMohib Qureshi\u003c/h5\u003e\u003ca id=\"user-content-mohib-qureshi\" class=\"anchor\" aria-label=\"Permalink: Mohib Qureshi\" href=\"#mohib-qureshi\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eSoftware Development Enthusiast\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/mohibqureshi\"\u003egithub\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eY\u003c/h4\u003e\u003ca id=\"user-content-y\" class=\"anchor\" aria-label=\"Permalink: Y\" href=\"#y\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eYousif Alebyary\u003c/h5\u003e\u003ca id=\"user-content-yousif-alebyary\" class=\"anchor\" aria-label=\"Permalink: Yousif Alebyary\" href=\"#yousif-alebyary\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eWeb/Mobile Developer.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/yousifm\"\u003egithub\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eYves Mancera\u003c/h5\u003e\u003ca id=\"user-content-yves-mancera\" class=\"anchor\" aria-label=\"Permalink: Yves Mancera\" href=\"#yves-mancera\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eSoftware Engineer\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/yvesmh\"\u003egithub\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/article\u003e","loaded":true,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":[{"level":3,"text":"Add custom features to C++ language, like metaclasses, Rust-like traits, reflection and many more","anchor":"add-custom-features-to-c-language-like-metaclasses-rust-like-traits-reflection-and-many-more","htmlText":"Add custom features to C++ language, like metaclasses, Rust-like traits, reflection and many more"},{"level":2,"text":"Tutorials and examples","anchor":"tutorials-and-examples","htmlText":"Tutorials and examples"},{"level":2,"text":"Supported platforms","anchor":"supported-platforms","htmlText":"Supported platforms"},{"level":2,"text":"Before installation: Add conan remotes","anchor":"before-installation-add-conan-remotes","htmlText":"Before installation: Add conan remotes"},{"level":2,"text":"Before installation","anchor":"before-installation","htmlText":"Before installation"},{"level":2,"text":"Easy install with common plugins","anchor":"easy-install-with-common-plugins","htmlText":"Easy install with common plugins"},{"level":2,"text":"Installation (without plugins)","anchor":"installation-without-plugins","htmlText":"Installation (without plugins)"},{"level":2,"text":"NOTE: flextool not compatible with compile_commands.json","anchor":"note-flextool-not-compatible-with-compile_commandsjson","htmlText":"NOTE: flextool not compatible with compile_commands.json"},{"level":2,"text":"Standing on the Shoulders of Giants","anchor":"standing-on-the-shoulders-of-giants","htmlText":"Standing on the Shoulders of Giants"},{"level":2,"text":"Dev-only build (local conan flow)","anchor":"dev-only-build-local-conan-flow","htmlText":"Dev-only build (local conan flow)"},{"level":2,"text":"For contibutors: conan editable mode","anchor":"for-contibutors-conan-editable-mode","htmlText":"For contibutors: conan editable mode"},{"level":2,"text":"For contibutors: conan workspace","anchor":"for-contibutors-conan-workspace","htmlText":"For contibutors: conan workspace"},{"level":2,"text":"For contibutors: conan workspace with plugins","anchor":"for-contibutors-conan-workspace-with-plugins","htmlText":"For contibutors: conan workspace with plugins"},{"level":2,"text":"For contibutors: cppcheck","anchor":"for-contibutors-cppcheck","htmlText":"For contibutors: cppcheck"},{"level":2,"text":"For contibutors: vue ui","anchor":"for-contibutors-vue-ui","htmlText":"For contibutors: vue ui"},{"level":2,"text":"For contibutors: gdbinit","anchor":"for-contibutors-gdbinit","htmlText":"For contibutors: gdbinit"},{"level":2,"text":"For contibutors: valgrind","anchor":"for-contibutors-valgrind","htmlText":"For contibutors: valgrind"},{"level":2,"text":"For contibutors: clang-tidy","anchor":"for-contibutors-clang-tidy","htmlText":"For contibutors: clang-tidy"},{"level":2,"text":"For contibutors: scan-build","anchor":"for-contibutors-scan-build","htmlText":"For contibutors: scan-build"},{"level":2,"text":"For contibutors: cppclean","anchor":"for-contibutors-cppclean","htmlText":"For contibutors: cppclean"},{"level":2,"text":"For contibutors: IWYU","anchor":"for-contibutors-iwyu","htmlText":"For contibutors: IWYU"},{"level":2,"text":"For contibutors: ccache","anchor":"for-contibutors-ccache","htmlText":"For contibutors: ccache"},{"level":2,"text":"For contibutors: GOLD linker","anchor":"for-contibutors-gold-linker","htmlText":"For contibutors: GOLD linker"},{"level":2,"text":"For contibutors: oclint","anchor":"for-contibutors-oclint","htmlText":"For contibutors: oclint"},{"level":2,"text":"For contibutors: clang-format","anchor":"for-contibutors-clang-format","htmlText":"For contibutors: clang-format"},{"level":2,"text":"For contibutors: uncrustify","anchor":"for-contibutors-uncrustify","htmlText":"For contibutors: uncrustify"},{"level":2,"text":"HOW TO BUILD WITH SANITIZERS ENABLED","anchor":"how-to-build-with-sanitizers-enabled","htmlText":"HOW TO BUILD WITH SANITIZERS ENABLED"},{"level":2,"text":"For contibutors: build using clang 10 from conan","anchor":"for-contibutors-build-using-clang-10-from-conan","htmlText":"For contibutors: build using clang 10 from conan"},{"level":2,"text":"For contibutors: doxygen","anchor":"for-contibutors-doxygen","htmlText":"For contibutors: doxygen"},{"level":2,"text":"For contibutors: Fuzzing with AFL","anchor":"for-contibutors-fuzzing-with-afl","htmlText":"For contibutors: Fuzzing with AFL"},{"level":2,"text":"For contibutors: Fuzzing with libFuzzer","anchor":"for-contibutors-fuzzing-with-libfuzzer","htmlText":"For contibutors: Fuzzing with libFuzzer"},{"level":2,"text":"For contibutors: Prefer Clang To GCC","anchor":"for-contibutors-prefer-clang-to-gcc","htmlText":"For contibutors: Prefer Clang To GCC"},{"level":2,"text":"LICENSE for open source components","anchor":"license-for-open-source-components","htmlText":"LICENSE for open source components"},{"level":2,"text":"LICENSE","anchor":"license","htmlText":"LICENSE"},{"level":2,"text":"Disclaimer","anchor":"disclaimer","htmlText":"Disclaimer"},{"level":3,"text":"Contributors List: Example Profile","anchor":"contributors-list-example-profile","htmlText":"Contributors List: Example Profile"},{"level":3,"text":"Contributors List","anchor":"contributors-list","htmlText":"Contributors List"},{"level":4,"text":"A","anchor":"a","htmlText":"A"},{"level":5,"text":"Anindita Basu","anchor":"anindita-basu","htmlText":"Anindita Basu"},{"level":5,"text":"Anna Hayhurst","anchor":"anna-hayhurst","htmlText":"Anna Hayhurst"},{"level":4,"text":"C","anchor":"c","htmlText":"C"},{"level":5,"text":"Cassio Espindola","anchor":"cassio-espindola","htmlText":"Cassio Espindola"},{"level":4,"text":"D","anchor":"d","htmlText":"D"},{"level":5,"text":"Denis Trofimov","anchor":"denis-trofimov","htmlText":"Denis Trofimov"},{"level":4,"text":"M","anchor":"m","htmlText":"M"},{"level":5,"text":"Mohib Qureshi","anchor":"mohib-qureshi","htmlText":"Mohib Qureshi"},{"level":4,"text":"Y","anchor":"y","htmlText":"Y"},{"level":5,"text":"Yousif Alebyary","anchor":"yousif-alebyary","htmlText":"Yousif Alebyary"},{"level":5,"text":"Yves Mancera","anchor":"yves-mancera","htmlText":"Yves Mancera"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fblockspacer%2Fflextool"}},{"displayName":"LICENSE","repoName":"flextool","refName":"master","path":"LICENSE","preferredFileType":"license","tabName":"MIT","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fblockspacer%2Fflextool"}}],"overviewFilesProcessingTime":0}},"appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-1583894afd38.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-67668e8c2caa.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"overview_shared_code_dropdown_button":false,"react_blob_overlay":false,"copilot_conversational_ux_embedding_update":false,"copilot_smell_icebreaker_ux":true,"copilot_workspace":false,"accessible_code_button":true}}}}</script> <div data-target="react-partial.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.iVEunk{margin-top:16px;margin-bottom:16px;}/*!sc*/ .jzuOtQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .bGojzy{margin-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;row-gap:16px;}/*!sc*/ .iNSVHo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-bottom:16px;padding-top:8px;}/*!sc*/ .bVgnfw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:8px;}/*!sc*/ @media screen and (max-width:320px){.bVgnfw{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .CEgMp{position:relative;}/*!sc*/ @media screen and (max-width:380px){.CEgMp .ref-selector-button-text-container{max-width:80px;}}/*!sc*/ @media screen and (max-width:320px){.CEgMp{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.CEgMp .overview-ref-selector{width:100%;}.CEgMp .overview-ref-selector > span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}.CEgMp .overview-ref-selector > span > span[data-component="text"]{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ffLUq{font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .hzSPyu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;pointer-events:none;}/*!sc*/ .fLXEGX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1079px){.fLXEGX{display:none;}}/*!sc*/ .dqfxud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1080px){.dqfxud{display:none;}}/*!sc*/ @media screen and (max-width:543px){.dqfxud{display:none;}}/*!sc*/ .jxTzTd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;gap:8px;}/*!sc*/ .gqqBXN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;}/*!sc*/ @media screen and (max-width:543px){.gqqBXN{display:none;}}/*!sc*/ .dzXgxt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1011px){.dzXgxt{display:none;}}/*!sc*/ .iWFGlI{margin-left:8px;margin-right:8px;margin:0;}/*!sc*/ .YUPas{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1012px){.YUPas{display:none;}}/*!sc*/ .izFOf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:544px){.izFOf{display:none;}}/*!sc*/ .vIPPs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:16px;}/*!sc*/ .fdROMU{width:100%;border-collapse:separate;border-spacing:0;border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;table-layout:fixed;overflow:unset;}/*!sc*/ .jGKpsv{height:0px;line-height:0px;}/*!sc*/ .jGKpsv tr{height:0px;font-size:0px;}/*!sc*/ .jdgHnn{padding:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;text-align:left;height:40px;}/*!sc*/ .jdgHnn th{padding-left:16px;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));}/*!sc*/ .bQivRW{width:100%;border-top-left-radius:6px;}/*!sc*/ @media screen and (min-width:544px){.bQivRW{display:none;}}/*!sc*/ .ldkMIO{width:40%;border-top-left-radius:6px;}/*!sc*/ @media screen and (max-width:543px){.ldkMIO{display:none;}}/*!sc*/ .jMbWeI{text-align:right;padding-right:16px;width:136px;border-top-right-radius:6px;}/*!sc*/ .gpqjiB{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;height:40px;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .eNCcrz{text-align:center;vertical-align:center;height:40px;border-top:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .bHTcCe{border-top:1px solid var(--borderColor-default,var(--color-border-default));cursor:pointer;}/*!sc*/ .csrIcr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;gap:16px;}/*!sc*/ .bUQNHB{border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ @media screen and (max-width:543px){.bUQNHB{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);}}/*!sc*/ @media screen and (min-width:544px){.bUQNHB{max-width:100%;}}/*!sc*/ .jPdcfu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:var(--borderColor-default,var(--color-border-default,#d0d7de));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:8px;position:-webkit-sticky;position:sticky;top:0;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));z-index:1;border-top-left-radius:6px;border-top-right-radius:6px;}/*!sc*/ .hUCRAk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .QkQOb{padding:32px;overflow:auto;}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"iVEunk,jzuOtQ,bGojzy,iNSVHo,bVgnfw,CEgMp,gUkoLg,bZBlpz,lhTYNA,ffLUq,hzSPyu,fLXEGX,dqfxud,jxTzTd,gqqBXN,dzXgxt,iWFGlI,YUPas,izFOf,vIPPs,fdROMU,jGKpsv,jdgHnn,bQivRW,ldkMIO,jMbWeI,gpqjiB,dzCJzi,eNCcrz,bHTcCe,csrIcr,bUQNHB,jPdcfu,hUCRAk,QkQOb,"}/*!sc*/ .eMMFM{min-width:0;}/*!sc*/ .eMMFM:where([data-size='small']){font-size:var(--text-body-size-small,0.75rem);line-height:var(--text-body-lineHeight-small,1.6666);}/*!sc*/ .eMMFM:where([data-size='medium']){font-size:var(--text-body-size-medium,0.875rem);line-height:var(--text-body-lineHeight-medium,1.4285);}/*!sc*/ .eMMFM:where([data-size='large']){font-size:var(--text-body-size-large,1rem);line-height:var(--text-body-lineHeight-large,1.5);}/*!sc*/ .eMMFM:where([data-weight='light']){font-weight:var(--base-text-weight-light,300);}/*!sc*/ .eMMFM:where([data-weight='normal']){font-weight:var(--base-text-weight-normal,400);}/*!sc*/ .eMMFM:where([data-weight='medium']){font-weight:var(--base-text-weight-medium,500);}/*!sc*/ .eMMFM:where([data-weight='semibold']){font-weight:var(--base-text-weight-semibold,600);}/*!sc*/ data-styled.g3[id="Text__StyledText-sc-17v1xeu-0"]{content:"eMMFM,"}/*!sc*/ .brGdpi{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);white-space:nowrap;border-width:0;}/*!sc*/ data-styled.g4[id="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0"]{content:"brGdpi,"}/*!sc*/ .gwqFqs{font-size:14px;line-height:20px;color:var(--fgColor-default,var(--color-fg-default,#1F2328));vertical-align:middle;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));border:1px solid var(--control-borderColor-rest,var(--borderColor-default,var(--color-border-default,#d0d7de)));border-radius:6px;outline:none;box-shadow:var(--shadow-inset,var(--color-primer-shadow-inset,inset 0 1px 0 rgba(208,215,222,0.2)));display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:32px;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .gwqFqs input,.gwqFqs textarea{cursor:text;}/*!sc*/ .gwqFqs select{cursor:pointer;}/*!sc*/ .gwqFqs input::-webkit-input-placeholder,.gwqFqs textarea::-webkit-input-placeholder,.gwqFqs select::-webkit-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input::-moz-placeholder,.gwqFqs textarea::-moz-placeholder,.gwqFqs select::-moz-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input:-ms-input-placeholder,.gwqFqs textarea:-ms-input-placeholder,.gwqFqs select:-ms-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input::placeholder,.gwqFqs textarea::placeholder,.gwqFqs select::placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs:focus-within{border-color:var(--fgColor-accent,var(--color-accent-fg,#0969da));outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .gwqFqs > textarea{padding:12px;}/*!sc*/ @media (min-width:768px){.gwqFqs{font-size:14px;}}/*!sc*/ data-styled.g9[id="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0"]{content:"gwqFqs,"}/*!sc*/ .decvaq{background-repeat:no-repeat;background-position:right 8px center;padding-left:12px;padding-right:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .decvaq > :not(:last-child){margin-right:8px;}/*!sc*/ .decvaq .TextInput-icon,.decvaq .TextInput-action{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}/*!sc*/ .decvaq > input,.decvaq > select{padding-left:0;padding-right:0;}/*!sc*/ data-styled.g10[id="TextInputWrapper-sc-1mqhpbi-1"]{content:"decvaq,"}/*!sc*/ .gVXRRg{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .gVXRRg:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gVXRRg:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .gVXRRg:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gVXRRg[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .gVXRRg[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gVXRRg:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .gVXRRg:active{-webkit-transition:none;transition:none;}/*!sc*/ .gVXRRg[data-inactive]{cursor:auto;}/*!sc*/ .gVXRRg:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .gVXRRg:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.gVXRRg:focus{outline:solid 1px transparent;}}/*!sc*/ .gVXRRg [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .gVXRRg[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .gVXRRg[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .gVXRRg[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .gVXRRg[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gVXRRg[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .gVXRRg[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .gVXRRg[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .gVXRRg[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gVXRRg[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .gVXRRg[data-block="block"]{width:100%;}/*!sc*/ .gVXRRg[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .gVXRRg[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .gVXRRg[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .gVXRRg[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .gVXRRg[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .gVXRRg[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .gVXRRg[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .gVXRRg[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .gVXRRg[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .gVXRRg [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .gVXRRg [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .gVXRRg [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .gVXRRg [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .gVXRRg [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .gVXRRg [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gVXRRg [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gVXRRg [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .gVXRRg:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .gVXRRg:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gVXRRg[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gVXRRg [data-component="leadingVisual"],.gVXRRg [data-component="trailingVisual"],.gVXRRg [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gVXRRg[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gVXRRg[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;}/*!sc*/ .gVXRRg[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gVXRRg[data-size="medium"] > span{width:inherit;}/*!sc*/ .loAzyw{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .loAzyw:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .loAzyw:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .loAzyw:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .loAzyw[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .loAzyw[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .loAzyw:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .loAzyw:active{-webkit-transition:none;transition:none;}/*!sc*/ .loAzyw[data-inactive]{cursor:auto;}/*!sc*/ .loAzyw:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .loAzyw:disabled [data-component=ButtonCounter],.loAzyw:disabled [data-component="leadingVisual"],.loAzyw:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.loAzyw:focus{outline:solid 1px transparent;}}/*!sc*/ .loAzyw [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .loAzyw[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .loAzyw[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .loAzyw[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .loAzyw[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .loAzyw[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .loAzyw[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .loAzyw[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .loAzyw[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .loAzyw[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .loAzyw[data-block="block"]{width:100%;}/*!sc*/ .loAzyw[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .loAzyw[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .loAzyw[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .loAzyw[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .loAzyw[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .loAzyw[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .loAzyw[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .loAzyw[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .loAzyw[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .loAzyw [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .loAzyw [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .loAzyw [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .loAzyw [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .loAzyw [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .loAzyw [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .loAzyw [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .loAzyw [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .loAzyw:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .loAzyw:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .loAzyw[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .loAzyw[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .loAzyw[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .loAzyw:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .loAzyw:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .loAzyw:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .loAzyw[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:4px;padding-right:4px;}/*!sc*/ .loAzyw[data-size="medium"] span[data-component="leadingVisual"]{margin-right:4px !important;}/*!sc*/ .cXsOlJ{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .cXsOlJ:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .cXsOlJ:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .cXsOlJ:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .cXsOlJ[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .cXsOlJ[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .cXsOlJ:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .cXsOlJ:active{-webkit-transition:none;transition:none;}/*!sc*/ .cXsOlJ[data-inactive]{cursor:auto;}/*!sc*/ .cXsOlJ:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .cXsOlJ:disabled [data-component=ButtonCounter],.cXsOlJ:disabled [data-component="leadingVisual"],.cXsOlJ:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.cXsOlJ:focus{outline:solid 1px transparent;}}/*!sc*/ .cXsOlJ [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .cXsOlJ[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .cXsOlJ[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .cXsOlJ[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .cXsOlJ[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .cXsOlJ[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .cXsOlJ[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .cXsOlJ[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .cXsOlJ[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .cXsOlJ[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .cXsOlJ[data-block="block"]{width:100%;}/*!sc*/ .cXsOlJ[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .cXsOlJ[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .cXsOlJ[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .cXsOlJ[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .cXsOlJ[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .cXsOlJ[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .cXsOlJ[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .cXsOlJ[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .cXsOlJ[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .cXsOlJ [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cXsOlJ [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .cXsOlJ [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cXsOlJ [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cXsOlJ [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .cXsOlJ [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .cXsOlJ [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .cXsOlJ [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .cXsOlJ:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .cXsOlJ:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .cXsOlJ[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .cXsOlJ[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cXsOlJ[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .cXsOlJ:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .cXsOlJ:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .cXsOlJ:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .cXsOlJ[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gGdPyq{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .gGdPyq:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gGdPyq:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .gGdPyq:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gGdPyq[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .gGdPyq[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gGdPyq:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .gGdPyq:active{-webkit-transition:none;transition:none;}/*!sc*/ .gGdPyq[data-inactive]{cursor:auto;}/*!sc*/ .gGdPyq:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .gGdPyq:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.gGdPyq:focus{outline:solid 1px transparent;}}/*!sc*/ .gGdPyq [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .gGdPyq[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .gGdPyq[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .gGdPyq[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .gGdPyq[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gGdPyq[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .gGdPyq[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .gGdPyq[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .gGdPyq[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gGdPyq[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .gGdPyq[data-block="block"]{width:100%;}/*!sc*/ .gGdPyq[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .gGdPyq[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .gGdPyq[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .gGdPyq[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .gGdPyq [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .gGdPyq [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .gGdPyq [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .gGdPyq [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .gGdPyq [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .gGdPyq [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gGdPyq [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gGdPyq [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .gGdPyq:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq [data-component="leadingVisual"],.gGdPyq [data-component="trailingVisual"],.gGdPyq [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gGdPyq[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .bmlmSe{border-radius:6px;border:1px solid;border-color:var(--button-primary-borderColor-rest,var(--color-btn-primary-border,rgba(31,35,40,0.15)));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-primary-fgColor-rest,var(--color-btn-primary-text,#ffffff));background-color:var(--button-primary-bgColor-rest,var(--color-btn-primary-bg,#1f883d));box-shadow:var(--shadow-resting-small,var(--color-btn-primary-shadow,0 1px 0 rgba(31,35,40,0.1)));}/*!sc*/ .bmlmSe:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .bmlmSe:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .bmlmSe:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .bmlmSe[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .bmlmSe[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .bmlmSe:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .bmlmSe:active{-webkit-transition:none;transition:none;}/*!sc*/ .bmlmSe[data-inactive]{cursor:auto;}/*!sc*/ .bmlmSe:disabled{cursor:not-allowed;box-shadow:none;color:var(--button-primary-fgColor-disabled,var(--color-btn-primary-disabled-text,rgba(255,255,255,0.8)));background-color:var(--button-primary-bgColor-disabled,var(--color-btn-primary-disabled-bg,#94d3a2));border-color:var(--button-primary-borderColor-disabled,var(--color-btn-primary-disabled-border,rgba(31,35,40,0.15)));}/*!sc*/ .bmlmSe:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.bmlmSe:focus{outline:solid 1px transparent;}}/*!sc*/ .bmlmSe [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-primary-bgColor-rest,var(--color-btn-primary-counter-bg,rgba(0,45,17,0.2)));color:var(--button-primary-fgColor-rest,var(--color-btn-primary-text,#ffffff));}/*!sc*/ .bmlmSe[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .bmlmSe[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .bmlmSe[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .bmlmSe[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .bmlmSe[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .bmlmSe[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .bmlmSe[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .bmlmSe[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .bmlmSe[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .bmlmSe[data-block="block"]{width:100%;}/*!sc*/ .bmlmSe[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .bmlmSe[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .bmlmSe[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .bmlmSe[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .bmlmSe[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .bmlmSe[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .bmlmSe[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .bmlmSe[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .bmlmSe[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .bmlmSe [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .bmlmSe [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .bmlmSe [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .bmlmSe [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .bmlmSe [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .bmlmSe [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .bmlmSe [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .bmlmSe [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .bmlmSe:hover:not([disabled]):not([data-inactive]){color:btn.primary.hoverText;background-color:var(--button-primary-bgColor-hover,var(--color-btn-primary-hover-bg,#1a7f37));}/*!sc*/ .bmlmSe:focus:not([disabled]){box-shadow:inset 0 0 0 3px;}/*!sc*/ .bmlmSe:focus-visible:not([disabled]){box-shadow:inset 0 0 0 3px;}/*!sc*/ .bmlmSe:active:not([disabled]):not([data-inactive]){background-color:var(--button-primary-bgColor-active,var(--color-btn-primary-selected-bg,hsla(137,66%,28%,1)));box-shadow:var(--button-primary-shadow-selected,var(--color-btn-primary-selected-shadow,inset 0 1px 0 rgba(0,45,17,0.2)));}/*!sc*/ .bmlmSe[aria-expanded=true]{background-color:var(--button-primary-bgColor-active,var(--color-btn-primary-selected-bg,hsla(137,66%,28%,1)));box-shadow:var(--button-primary-shadow-selected,var(--color-btn-primary-selected-shadow,inset 0 1px 0 rgba(0,45,17,0.2)));}/*!sc*/ .dPmZyJ{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .dPmZyJ:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dPmZyJ:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .dPmZyJ:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dPmZyJ[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .dPmZyJ[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .dPmZyJ:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .dPmZyJ:active{-webkit-transition:none;transition:none;}/*!sc*/ .dPmZyJ[data-inactive]{cursor:auto;}/*!sc*/ .dPmZyJ:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .dPmZyJ:disabled [data-component=ButtonCounter],.dPmZyJ:disabled [data-component="leadingVisual"],.dPmZyJ:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.dPmZyJ:focus{outline:solid 1px transparent;}}/*!sc*/ .dPmZyJ [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dPmZyJ[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .dPmZyJ[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .dPmZyJ[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .dPmZyJ[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .dPmZyJ[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dPmZyJ[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .dPmZyJ[data-block="block"]{width:100%;}/*!sc*/ .dPmZyJ[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .dPmZyJ[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .dPmZyJ[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .dPmZyJ[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .dPmZyJ [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .dPmZyJ [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .dPmZyJ [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dPmZyJ [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dPmZyJ [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .dPmZyJ:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .dPmZyJ:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .dPmZyJ[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .dPmZyJ[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .dPmZyJ:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .dPmZyJ:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .dPmZyJ:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .gXPTqA{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .gXPTqA:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gXPTqA:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .gXPTqA:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gXPTqA[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .gXPTqA[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gXPTqA:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .gXPTqA:active{-webkit-transition:none;transition:none;}/*!sc*/ .gXPTqA[data-inactive]{cursor:auto;}/*!sc*/ .gXPTqA:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .gXPTqA:disabled [data-component=ButtonCounter],.gXPTqA:disabled [data-component="leadingVisual"],.gXPTqA:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.gXPTqA:focus{outline:solid 1px transparent;}}/*!sc*/ .gXPTqA [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gXPTqA[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .gXPTqA[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .gXPTqA[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .gXPTqA[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gXPTqA[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .gXPTqA[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .gXPTqA[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .gXPTqA[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gXPTqA[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .gXPTqA[data-block="block"]{width:100%;}/*!sc*/ .gXPTqA[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .gXPTqA[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .gXPTqA[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .gXPTqA[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .gXPTqA[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .gXPTqA[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .gXPTqA[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .gXPTqA[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .gXPTqA[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .gXPTqA [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gXPTqA [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .gXPTqA [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gXPTqA [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gXPTqA [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .gXPTqA [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gXPTqA [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gXPTqA [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .gXPTqA:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .gXPTqA:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .gXPTqA[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .gXPTqA[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gXPTqA[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .gXPTqA:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .gXPTqA:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .gXPTqA:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .gXPTqA[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-subtle,#6e7781));padding-left:8px;padding-right:8px;}/*!sc*/ data-styled.g11[id="types__StyledButton-sc-ws60qy-0"]{content:"gVXRRg,loAzyw,cXsOlJ,gGdPyq,bmlmSe,dPmZyJ,gXPTqA,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g14[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .kbCLEG{border:0;font-size:inherit;font-family:inherit;background-color:transparent;-webkit-appearance:none;color:inherit;width:100%;}/*!sc*/ .kbCLEG:focus{outline:0;}/*!sc*/ data-styled.g15[id="UnstyledTextInput-sc-14ypya-0"]{content:"kbCLEG,"}/*!sc*/ .liVpTx{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;}/*!sc*/ data-styled.g17[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"liVpTx,"}/*!sc*/ .iBVwpg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-inline:var(--stack-padding-normal,16px);-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:var(--control-xlarge-size,48px);box-shadow:inset 0px -1px var(--borderColor-muted,var(--borderColor-muted,var(--color-border-muted,hsla(210,18%,87%,1))));-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-bottom:none;max-width:100%;padding-left:8px;padding-right:8px;}/*!sc*/ data-styled.g92[id="UnderlineTabbedInterface__StyledUnderlineWrapper-sc-4ilrg0-0"]{content:"iBVwpg,"}/*!sc*/ .gJyWUl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;list-style:none;white-space:nowrap;padding:0;margin:0;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;position:relative;}/*!sc*/ data-styled.g93[id="UnderlineTabbedInterface__StyledUnderlineItemList-sc-4ilrg0-1"]{content:"gJyWUl,"}/*!sc*/ .beOdPj{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0;cursor:pointer;font:inherit;position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;color:var(--fgColor-default,var(--color-fg-default,#1F2328));text-align:center;-webkit-text-decoration:none;text-decoration:none;line-height:var(--text-body-lineHeight-medium,1.4285);border-radius:var(--borderRadius-medium,6px);font-size:var(--text-body-size-medium,14px);padding-inline:var(--control-medium-paddingInline-condensed,8px);padding-block:var(--control-medium-paddingBlock,6px);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ @media (hover:hover){.beOdPj:hover{background-color:var(--bgColor-neutral-muted,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))));-webkit-transition:background 0.12s ease-out;transition:background 0.12s ease-out;-webkit-text-decoration:none;text-decoration:none;}}/*!sc*/ .beOdPj:focus:{outline:2px solid transparent;box-shadow:inset 0 0 0 2px var(--fgColor-accent,var(--fgColor-accent,var(--color-accent-fg,#0969da)));}/*!sc*/ .beOdPj:focus::not(:focus-visible){box-shadow:none;}/*!sc*/ .beOdPj:focus-visible{outline:2px solid transparent;box-shadow:inset 0 0 0 2px var(--fgColor-accent,var(--fgColor-accent,var(--color-accent-fg,#0969da)));}/*!sc*/ .beOdPj [data-content]::before{content:attr(data-content);display:block;height:0;font-weight:var(--base-text-weight-semibold,500);visibility:hidden;white-space:nowrap;}/*!sc*/ .beOdPj [data-component='icon']{color:var(--fgColor-muted,var(--fgColor-muted,var(--color-fg-muted,#656d76)));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin-inline-end:var(--control-medium-gap,8px);}/*!sc*/ .beOdPj [data-component='counter']{margin-inline-start:var(--control-medium-gap,8px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .beOdPj::after{position:absolute;right:50%;bottom:calc(50% - calc(var(--control-xlarge-size,48px) / 2 + 1px));width:100%;height:2px;content:'';background-color:transparent;border-radius:0;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%);}/*!sc*/ .beOdPj[aria-current]:not([aria-current='false']) [data-component='text'],.beOdPj[aria-selected='true'] [data-component='text']{font-weight:var(--base-text-weight-semibold,500);}/*!sc*/ .beOdPj[aria-current]:not([aria-current='false'])::after,.beOdPj[aria-selected='true']::after{background-color:var(--underlineNav-borderColor-active,var(--color-primer-border-active,#fd8c73));}/*!sc*/ @media (forced-colors:active){.beOdPj[aria-current]:not([aria-current='false'])::after,.beOdPj[aria-selected='true']::after{background-color:LinkText;}}/*!sc*/ data-styled.g94[id="UnderlineTabbedInterface__StyledUnderlineItem-sc-4ilrg0-2"]{content:"beOdPj,"}/*!sc*/ </style> <!-- --> <!-- --> <div class="Box-sc-g0xbh4-0 iVEunk"><div class="Box-sc-g0xbh4-0 jzuOtQ"><div class="Box-sc-g0xbh4-0 bGojzy"></div></div><div class="Box-sc-g0xbh4-0 iNSVHo"><div class="Box-sc-g0xbh4-0 bVgnfw"><div class="Box-sc-g0xbh4-0 CEgMp"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="types__StyledButton-sc-ws60qy-0 gVXRRg overview-ref-selector width-full" data-loading="false" data-size="medium" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"><span class="Text__StyledText-sc-17v1xeu-0 eMMFM"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 fLXEGX"><a style="--button-color:fg.muted" type="button" href="/blockspacer/flextool/branches" class="types__StyledButton-sc-ws60qy-0 loAzyw" data-loading="false" data-size="medium" aria-describedby=":Rclab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text">Branches</span></span></a><a style="--button-color:fg.muted" type="button" href="/blockspacer/flextool/tags" class="types__StyledButton-sc-ws60qy-0 loAzyw" data-loading="false" data-size="medium" aria-describedby=":Rklab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></span><span data-component="text">Tags</span></span></a></div><div class="Box-sc-g0xbh4-0 dqfxud"><a style="--button-color:fg.muted" type="button" aria-label="Go to Branches page" href="/blockspacer/flextool/branches" class="types__StyledButton-sc-ws60qy-0 cXsOlJ" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":Relab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></a><a style="--button-color:fg.muted" type="button" aria-label="Go to Tags page" href="/blockspacer/flextool/tags" class="types__StyledButton-sc-ws60qy-0 cXsOlJ" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":Rmlab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></a></div></div><div class="Box-sc-g0xbh4-0 jxTzTd"><div class="Box-sc-g0xbh4-0 gqqBXN"><div class="Box-sc-g0xbh4-0 dzXgxt"><!--$--><div class="Box-sc-g0xbh4-0 iWFGlI"><span class="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0 TextInputWrapper-sc-1mqhpbi-1 gwqFqs decvaq TextInput-wrapper" aria-busy="false"><span class="TextInput-icon" id=":R2j5ab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R2j5ab: :R2j5abH1:" data-component="input" class="UnstyledTextInput-sc-14ypya-0 kbCLEG" value=""/><span class="TextInput-icon" id=":R2j5abH1:" aria-hidden="true"></span></span></div><!--/$--></div><div class="Box-sc-g0xbh4-0 YUPas"><button type="button" class="types__StyledButton-sc-ws60qy-0 gGdPyq" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":Rr5ab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text">Go to file</span></span></button></div><div class="react-directory-add-file-icon"></div><div class="react-directory-remove-file-icon"></div></div><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 bmlmSe" data-loading="false" data-size="medium" aria-describedby=":R55ab:-loading-announcement" id=":R55ab:"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="hide-sm" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text">Code</span><span data-component="trailingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="Box-sc-g0xbh4-0 izFOf"><button data-component="IconButton" type="button" aria-label="Open more actions menu" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 gGdPyq prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R75ab:-loading-announcement" id=":R75ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div><div class="Box-sc-g0xbh4-0 vIPPs"><div data-hpc="true"><button hidden="" data-testid="focus-next-element-button" data-hotkey="j"></button><button hidden="" data-testid="focus-previous-element-button" data-hotkey="k"></button><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="folders-and-files">Folders and files</h2><table aria-labelledby="folders-and-files" class="Box-sc-g0xbh4-0 fdROMU"><thead class="Box-sc-g0xbh4-0 jGKpsv"><tr class="Box-sc-g0xbh4-0 jdgHnn"><th colSpan="2" class="Box-sc-g0xbh4-0 bQivRW"><span class="text-bold">Name</span></th><th colSpan="1" class="Box-sc-g0xbh4-0 ldkMIO"><span class="text-bold">Name</span></th><th class="hide-sm"><div title="Last commit message" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit message</span></div></th><th colSpan="1" class="Box-sc-g0xbh4-0 jMbWeI"><div title="Last commit date" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit date</span></div></th></tr></thead><tbody><tr class="Box-sc-g0xbh4-0 gpqjiB"><td colSpan="3" class="bgColor-muted p-1 rounded-top-2"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/blockspacer/flextool/commits/master/" class="types__StyledButton-sc-ws60qy-0 dPmZyJ d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" aria-describedby=":Raqj8pab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text"><span class="fgColor-default">89 Commits</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="89 Commits" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/blockspacer/flextool/commits/master/" class="types__StyledButton-sc-ws60qy-0 dPmZyJ LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" aria-describedby=":R1iqj8pab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></td></tr><tr class="react-directory-row undefined" id="folder-row-0"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSES" aria-label="LICENSES, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/LICENSES">LICENSES</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSES" aria-label="LICENSES, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/LICENSES">LICENSES</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-1"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="cmake" aria-label="cmake, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/cmake">cmake</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="cmake" aria-label="cmake, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/cmake">cmake</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-2"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="conan" aria-label="conan, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/conan">conan</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="conan" aria-label="conan, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/conan">conan</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-3"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="docs" aria-label="docs, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/docs">docs</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="docs" aria-label="docs, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/docs">docs</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-4"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="flextool/test, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/flextool/test"><span class="react-directory-default-color" data-testid="path-name-segment">flextool/</span><span class="" data-testid="path-name-segment">test</span></a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="flextool/test, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/flextool/test"><span class="react-directory-default-color" data-testid="path-name-segment">flextool/</span><span class="" data-testid="path-name-segment">test</span></a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-5"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="include/flextool, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/include/flextool"><span class="react-directory-default-color" data-testid="path-name-segment">include/</span><span class="" data-testid="path-name-segment">flextool</span></a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="include/flextool, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/include/flextool"><span class="react-directory-default-color" data-testid="path-name-segment">include/</span><span class="" data-testid="path-name-segment">flextool</span></a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-6"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="plugin/vue-cli-plugin, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/plugin/vue-cli-plugin"><span class="react-directory-default-color" data-testid="path-name-segment">plugin/</span><span class="" data-testid="path-name-segment">vue-cli-plugin</span></a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="plugin/vue-cli-plugin, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/plugin/vue-cli-plugin"><span class="react-directory-default-color" data-testid="path-name-segment">plugin/</span><span class="" data-testid="path-name-segment">vue-cli-plugin</span></a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-7"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="resources" aria-label="resources, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/resources">resources</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="resources" aria-label="resources, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/resources">resources</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-8"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="src" aria-label="src, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/src">src</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="src" aria-label="src, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/src">src</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-9"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="test_package" aria-label="test_package, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/test_package">test_package</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="test_package" aria-label="test_package, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/test_package">test_package</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-10"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="tests" aria-label="tests, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/tests">tests</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="tests" aria-label="tests, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/tests">tests</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-11"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="tools" aria-label="tools, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/tools">tools</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="tools" aria-label="tools, (Directory)" class="Link--primary" href="/blockspacer/flextool/tree/master/tools">tools</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-12"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".clang-format" aria-label=".clang-format, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/.clang-format">.clang-format</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".clang-format" aria-label=".clang-format, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/.clang-format">.clang-format</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-13"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gdbinit" aria-label=".gdbinit, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/.gdbinit">.gdbinit</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gdbinit" aria-label=".gdbinit, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/.gdbinit">.gdbinit</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-14"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitattributes" aria-label=".gitattributes, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/.gitattributes">.gitattributes</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitattributes" aria-label=".gitattributes, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/.gitattributes">.gitattributes</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-15"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-16"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Acknowledgements.txt" aria-label="Acknowledgements.txt, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/Acknowledgements.txt">Acknowledgements.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Acknowledgements.txt" aria-label="Acknowledgements.txt, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/Acknowledgements.txt">Acknowledgements.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-17"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CMakeLists.txt" aria-label="CMakeLists.txt, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/CMakeLists.txt">CMakeLists.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CMakeLists.txt" aria-label="CMakeLists.txt, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/CMakeLists.txt">CMakeLists.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-18"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE" aria-label="LICENSE, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/LICENSE">LICENSE</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE" aria-label="LICENSE, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/LICENSE">LICENSE</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-19"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="NOTICE" aria-label="NOTICE, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/NOTICE">NOTICE</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="NOTICE" aria-label="NOTICE, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/NOTICE">NOTICE</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-20"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="OWNERS" aria-label="OWNERS, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/OWNERS">OWNERS</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="OWNERS" aria-label="OWNERS, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/OWNERS">OWNERS</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-21"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-22"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="VERSION" aria-label="VERSION, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/VERSION">VERSION</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="VERSION" aria-label="VERSION, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/VERSION">VERSION</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-23"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="conanfile.py" aria-label="conanfile.py, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/conanfile.py">conanfile.py</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="conanfile.py" aria-label="conanfile.py, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/conanfile.py">conanfile.py</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-24"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="get_conan_dependencies.cmake" aria-label="get_conan_dependencies.cmake, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/get_conan_dependencies.cmake">get_conan_dependencies.cmake</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="get_conan_dependencies.cmake" aria-label="get_conan_dependencies.cmake, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/get_conan_dependencies.cmake">get_conan_dependencies.cmake</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-25"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="logo.png" aria-label="logo.png, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/logo.png">logo.png</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="logo.png" aria-label="logo.png, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/logo.png">logo.png</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-26"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="package.json" aria-label="package.json, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/package.json">package.json</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="package.json" aria-label="package.json, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/package.json">package.json</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-27"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="uncrustify.cfg" aria-label="uncrustify.cfg, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/uncrustify.cfg">uncrustify.cfg</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="uncrustify.cfg" aria-label="uncrustify.cfg, (File)" class="Link--primary" href="/blockspacer/flextool/blob/master/uncrustify.cfg">uncrustify.cfg</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="Box-sc-g0xbh4-0 eNCcrz show-for-mobile" data-testid="view-all-files-row"><td colSpan="3" class="Box-sc-g0xbh4-0 bHTcCe"><div><button class="prc-Link-Link-85e08">View all files</button></div></td></tr></tbody></table></div><div class="Box-sc-g0xbh4-0 csrIcr"><div class="Box-sc-g0xbh4-0 bUQNHB"><div itemscope="" itemType="https://schema.org/abstract" class="Box-sc-g0xbh4-0 jPdcfu"><h2 class="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0 brGdpi">Repository files navigation</h2><nav aria-label="Repository files" class="UnderlineTabbedInterface__StyledUnderlineWrapper-sc-4ilrg0-0 iBVwpg"><ul role="list" class="UnderlineTabbedInterface__StyledUnderlineItemList-sc-4ilrg0-1 gJyWUl"><li class="Box-sc-g0xbh4-0 hUCRAk"><a href="#" aria-current="page" class="UnderlineTabbedInterface__StyledUnderlineItem-sc-4ilrg0-2 beOdPj"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-book" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg></span><span data-component="text" data-content="README">README</span></a></li><li class="Box-sc-g0xbh4-0 hUCRAk"><a href="#" class="UnderlineTabbedInterface__StyledUnderlineItem-sc-4ilrg0-2 beOdPj"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-law" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path></svg></span><span data-component="text" data-content="MIT license">MIT license</span></a></li></ul></nav><button style="--button-color:fg.subtle" type="button" aria-label="Outline" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 gXPTqA" data-loading="false" data-size="medium" aria-describedby=":Rr9ab:-loading-announcement" id=":Rr9ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button></div><div class="Box-sc-g0xbh4-0 QkQOb js-snippet-clipboard-copy-unpositioned" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><p dir="auto"> </p> <p align="center" dir="auto"> <a href="https://blockspacer.github.io/flex_docs" rel="nofollow"> <img src="https://camo.githubusercontent.com/4dad0fd0ce15ce2906fd26053f2b0becf211150d166df1ab8e0f7cdda4d23b07/68747470733a2f2f626c6f636b7370616365722e6769746875622e696f2f666c65785f646f63732f696d616765732f6c6f676f2e706e67" width="100px" alt="flextool" data-canonical-src="https://blockspacer.github.io/flex_docs/images/logo.png" style="max-width: 100%;"> </a> </p> <div class="markdown-heading" dir="auto"><h3 align="center" tabindex="-1" class="heading-element" dir="auto">Add custom features to C++ language, like <a href="https://www.fluentcpp.com/2018/03/09/c-metaclasses-proposal-less-5-minutes/" rel="nofollow">metaclasses</a>, <a href="https://twitter.com/TartanLlama/status/1159457033441165313" rel="nofollow">Rust-like traits</a>, reflection and many more</h3><a id="user-content-add-custom-features-to-c-language-like-metaclasses-rust-like-traits-reflection-and-many-more" class="anchor" aria-label="Permalink: Add custom features to C++ language, like metaclasses, Rust-like traits, reflection and many more" href="#add-custom-features-to-c-language-like-metaclasses-rust-like-traits-reflection-and-many-more"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p align="center" dir="auto">A fully open source, powerful solution for modification and generation of C++ source code. Reduce the amount of boilerplate code in your C++ projects.</p> <hr> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c6ef85dff78c0f58249b743e2aa5004f30e066e039c206337b0efcc2ed6693eb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f70656e253230536f757263652d2545322539442541342d70696e6b2e737667"><img src="https://camo.githubusercontent.com/c6ef85dff78c0f58249b743e2aa5004f30e066e039c206337b0efcc2ed6693eb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f70656e253230536f757263652d2545322539442541342d70696e6b2e737667" alt="Open Source Love" data-canonical-src="https://img.shields.io/badge/Open%20Source-%E2%9D%A4-pink.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0cc6bd9ecdab31b445fa37e0f60a8fd24009b4ea54b7463dc708f5026b4cb875/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f66697273742d2d74696d6572732d2d6f6e6c792d667269656e646c792d626c75652e7376673f7374796c653d666c6174"><img src="https://camo.githubusercontent.com/0cc6bd9ecdab31b445fa37e0f60a8fd24009b4ea54b7463dc708f5026b4cb875/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f66697273742d2d74696d6572732d2d6f6e6c792d667269656e646c792d626c75652e7376673f7374796c653d666c6174" alt="First Timers Only" data-canonical-src="https://img.shields.io/badge/first--timers--only-friendly-blue.svg?style=flat" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ad4a2ed2992085ed9e9fb6d9f94cad63a95780fa42fe7f76852de61ee9f24800/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f75702d2d666f722d2d67726162732d667269656e646c792d677265656e2e7376673f7374796c653d666c6174"><img src="https://camo.githubusercontent.com/ad4a2ed2992085ed9e9fb6d9f94cad63a95780fa42fe7f76852de61ee9f24800/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f75702d2d666f722d2d67726162732d667269656e646c792d677265656e2e7376673f7374796c653d666c6174" alt="Up For Grabs" data-canonical-src="https://img.shields.io/badge/up--for--grabs-friendly-green.svg?style=flat" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3f7e202d87407c2b619c44092c69a84ffd59961e682dabdfab5a10d75306be41/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/3f7e202d87407c2b619c44092c69a84ffd59961e682dabdfab5a10d75306be41/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub" data-canonical-src="https://img.shields.io/github/license/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/43780de34fb3ce5d1b98ddd350f0737b0d152417b83037d5600249e57880e9d9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/43780de34fb3ce5d1b98ddd350f0737b0d152417b83037d5600249e57880e9d9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub forks" data-canonical-src="https://img.shields.io/github/forks/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/966ac0afc69790becced86608599a6a54f8b88ecbf3aa67739c127b17becc53d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/966ac0afc69790becced86608599a6a54f8b88ecbf3aa67739c127b17becc53d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub issues" data-canonical-src="https://img.shields.io/github/issues/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/53128ce94e0b8e33c47acffda528abccd6c705c7565ed426f99aa8a5c8463b2f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/53128ce94e0b8e33c47acffda528abccd6c705c7565ed426f99aa8a5c8463b2f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732d70722f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub pull requests" data-canonical-src="https://img.shields.io/github/issues-pr/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/95637fd676e633086981c0e9711080e01045a9d9f5bf1bd2f1c0bdeaa1d7e029/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/95637fd676e633086981c0e9711080e01045a9d9f5bf1bd2f1c0bdeaa1d7e029/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6e7472696275746f72732f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub contributors" data-canonical-src="https://img.shields.io/github/contributors/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/de7aea76b99547cd22019ab4310d5c096ea0872f91b4dcc761ebf9b4731c1066/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/de7aea76b99547cd22019ab4310d5c096ea0872f91b4dcc761ebf9b4731c1066/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub commit activity the past week, 4 weeks, year" data-canonical-src="https://img.shields.io/github/commit-activity/w/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/161b3a7f6a5154de47141830bea84d097368f1aa60b248d7087e201bff688f47/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/161b3a7f6a5154de47141830bea84d097368f1aa60b248d7087e201bff688f47/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub last commit" data-canonical-src="https://img.shields.io/github/last-commit/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/62b419d2361fe9dec3713f78795f3e058816162ba8a5bb48a1fb2d1451fa1e4c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f746f702f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/62b419d2361fe9dec3713f78795f3e058816162ba8a5bb48a1fb2d1451fa1e4c/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f746f702f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub top language" data-canonical-src="https://img.shields.io/github/languages/top/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9ec1fd131015bf302ec9c1824d4f89ed4b970239a398b66342875d44cc8b848a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f756e742f626c6f636b7370616365722f666c6578746f6f6c2e737667"><img src="https://camo.githubusercontent.com/9ec1fd131015bf302ec9c1824d4f89ed4b970239a398b66342875d44cc8b848a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f756e742f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="GitHub language count" data-canonical-src="https://img.shields.io/github/languages/count/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a href="http://www.repostatus.org/#wip" rel="nofollow"><img src="https://camo.githubusercontent.com/5ae4f15271bff5ec20026e9f5ce9c895c687d000f7cf21a32674d29adea51d86/687474703a2f2f7777772e7265706f7374617475732e6f72672f6261646765732f6c61746573742f7769702e737667" alt="Project Status: WIP - Initial development is in progress, but there has not yet been a stable, usable release suitable for the public." data-canonical-src="http://www.repostatus.org/badges/latest/wip.svg" style="max-width: 100%;"></a> <a href="https://github.com/blockspacer/flextool/master/LICENSE"><img src="https://camo.githubusercontent.com/9056b102779c6ff7869fe0cbca338b24ba7761fa4b7e15d81fdf33d251860fe5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f626c6f636b7370616365722f666c6578746f6f6c2e7376673f7374796c653d666c61742d737175617265" alt="license" data-canonical-src="https://img.shields.io/github/license/blockspacer/flextool.svg?style=flat-square" style="max-width: 100%;"></a> <a href="https://lgtm.com/projects/g/blockspacer/flextool/alerts/" rel="nofollow"><img src="https://camo.githubusercontent.com/4ea615073b20d12eba7c68ed6ba9ebbeda52b4352f1e0ac54ec0fc54e3da7c7d/68747470733a2f2f696d672e736869656c64732e696f2f6c67746d2f616c657274732f672f6273616d736574682f6370702d70726f6a6563742e7376673f6c6f676f3d6c67746d266c6f676f57696474683d3138" alt="Total alerts" data-canonical-src="https://img.shields.io/lgtm/alerts/g/bsamseth/cpp-project.svg?logo=lgtm&logoWidth=18" style="max-width: 100%;"></a> <a href="https://github.com/blockspacer/flextool"><img src="https://camo.githubusercontent.com/422fe6090bf6dcd5cb15b348743afc0b58359f74e49c007006658c2911cb4ff2/68747470733a2f2f746f6b65692e72732f62312f6769746875622f626c6f636b7370616365722f666c6578746f6f6c" alt="Lines of Code" data-canonical-src="https://tokei.rs/b1/github/blockspacer/flextool" style="max-width: 100%;"></a> <a href="http://isitmaintained.com/project/blockspacer/flextool" title="Average time to resolve an issue" rel="nofollow"><img src="https://camo.githubusercontent.com/4df2d581ae9dde2619ed178995d5e5b66a83d19678d1e76e49c3a8b6c9135e83/687474703a2f2f697369746d61696e7461696e65642e636f6d2f62616467652f7265736f6c7574696f6e2f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="Average time to resolve an issue" data-canonical-src="http://isitmaintained.com/badge/resolution/blockspacer/flextool.svg" style="max-width: 100%;"></a> <a href="http://isitmaintained.com/project/blockspacer/flextool" title="Percentage of issues still open" rel="nofollow"><img src="https://camo.githubusercontent.com/71e0f19e3de391e297f5cef6859b20454a32fe773af054e4aa3d0e336a92b6b2/687474703a2f2f697369746d61696e7461696e65642e636f6d2f62616467652f6f70656e2f626c6f636b7370616365722f666c6578746f6f6c2e737667" alt="Percentage of issues still open" data-canonical-src="http://isitmaintained.com/badge/open/blockspacer/flextool.svg" style="max-width: 100%;"></a></p> <p dir="auto">Main project page: <a href="https://blockspacer.github.io/flex_docs/" rel="nofollow">https://blockspacer.github.io/flex_docs/</a></p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Tutorials and examples</h2><a id="user-content-tutorials-and-examples" class="anchor" aria-label="Permalink: Tutorials and examples" href="#tutorials-and-examples"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li><a href="https://blockspacer.github.io/flex_docs/tutorial/" rel="nofollow">Tutorial</a></li> <li><a href="https://blockspacer.github.io/flex_docs/building_projects/" rel="nofollow">Usage</a></li> <li><a href="https://blockspacer.github.io/flex_docs/adding_plugins/" rel="nofollow">Plugins</a></li> <li><a href="https://blockspacer.github.io/flex_docs/bug_report/" rel="nofollow">Tracing and log levels</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Supported platforms</h2><a id="user-content-supported-platforms" class="anchor" aria-label="Permalink: Supported platforms" href="#supported-platforms"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Tested on Ubuntu 20.04.2 LTS.</p> <p dir="auto">May work on other platforms with minor modifications.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Before installation: Add conan remotes</h2><a id="user-content-before-installation-add-conan-remotes" class="anchor" aria-label="Permalink: Before installation: Add conan remotes" href="#before-installation-add-conan-remotes"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">To be able to add the list of dependency remotes please type the following command:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cmake -E time conan config install conan/remotes/ # OR: # cmake -E time conan config install conan/remotes_disabled_ssl/"><pre>cmake -E <span class="pl-k">time</span> conan config install conan/remotes/ <span class="pl-c"><span class="pl-c">#</span> OR:</span> <span class="pl-c"><span class="pl-c">#</span> cmake -E time conan config install conan/remotes_disabled_ssl/</span></pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Before installation</h2><a id="user-content-before-installation" class="anchor" aria-label="Permalink: Before installation" href="#before-installation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto"><a href="https://blockspacer.github.io/flex_docs/download/" rel="nofollow">Installation Guide</a></p> </li> <li> <p dir="auto">conan packages</p> </li> </ul> <p dir="auto">NOTE: cling with LLVM build may take couple of hours.</p> <p dir="auto">Command below uses <code>--profile clang12_compiler12_compiler</code>.</p> <p dir="auto">Example conan profile <code>~/.conan/profiles/clang</code>:</p> <div class="highlight highlight-text-adblock notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="[settings] # We are building in Ubuntu Linux os_build=Linux os=Linux arch_build=x86_64 arch=x86_64 compiler=clang compiler.version=10 compiler.libcxx=libstdc++11 [env] CC=/usr/bin/clang-10 CXX=/usr/bin/clang++-10 [build_requires] cmake_installer/3.15.5@conan/stable"><pre>[<span class="pl-ii">settings</span>] <span class="pl-c"># We are building in Ubuntu Linux</span> os_build=Linux os=Linux arch_build=x86_64 arch=x86_64 compiler=clang compiler.version=10 compiler.libcxx=libstdc++11 [<span class="pl-ii">env</span>] CC=/usr/bin/clang-10 CXX=/usr/bin/clang++-10 [<span class="pl-ii">build_requires</span>] cmake_installer/3.15.5@conan/stable</pre></div> <p dir="auto">Create clang12_compiler profile:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="[settings] # We are building in Ubuntu Linux os_build=Linux os=Linux arch_build=x86_64 arch=x86_64 compiler=clang compiler.version=12 compiler.libcxx=libstdc++11 compiler.cppstd=17 llvm_9:build_type=Release [env] CC=/usr/bin/clang-12 CXX=/usr/bin/clang++-12 [build_requires] cmake_installer/3.15.5@conan/stable"><pre>[settings] <span class="pl-c"><span class="pl-c">#</span> We are building in Ubuntu Linux</span> os_build=Linux os=Linux arch_build=x86_64 arch=x86_64 compiler=clang compiler.version=12 compiler.libcxx=libstdc++11 compiler.cppstd=17 llvm_9:build_type=Release [env] CC=/usr/bin/clang-12 CXX=/usr/bin/clang++-12 [build_requires] cmake_installer/3.15.5@conan/stable</pre></div> <p dir="auto">Before creation of conan profile file, see: <a href="https://docs.conan.io/en/latest/using_packages/using_profiles.html" rel="nofollow">https://docs.conan.io/en/latest/using_packages/using_profiles.html</a>.</p> <p dir="auto">We use <code>.cmake</code> script to download and install conan packages.</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/blockspacer/conan_github_downloader.git ~/conan_github_downloader cmake \ -DSCRIPT_PATH="$PWD/get_conan_dependencies.cmake"\ -DENABLE_CLING=TRUE\ -DENABLE_LLVM=TRUE\ -DENABLE_LLVM_INSTALLER=FALSE\ -DEXTRA_CONAN_OPTS="--profile;clang12_compiler\ ;-s;build_type=Debug\ ;-s;cling_conan:build_type=Release\ ;-s;llvm_12:build_type=Release\ ;--build;missing" \ -P ~/conan_github_downloader/conan_github_downloader.cmake # clean build cache conan remove "*" --build --force"><pre>git clone https://github.com/blockspacer/conan_github_downloader.git <span class="pl-k">~</span>/conan_github_downloader cmake \ -DSCRIPT_PATH=<span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$PWD</span>/get_conan_dependencies.cmake<span class="pl-pds">"</span></span>\ -DENABLE_CLING=TRUE\ -DENABLE_LLVM=TRUE\ -DENABLE_LLVM_INSTALLER=FALSE\ -DEXTRA_CONAN_OPTS=<span class="pl-s"><span class="pl-pds">"</span>--profile;clang12_compiler<span class="pl-cce">\</span></span> <span class="pl-s">;-s;build_type=Debug<span class="pl-cce">\</span></span> <span class="pl-s">;-s;cling_conan:build_type=Release<span class="pl-cce">\</span></span> <span class="pl-s">;-s;llvm_12:build_type=Release<span class="pl-cce">\</span></span> <span class="pl-s">;--build;missing<span class="pl-pds">"</span></span> \ -P <span class="pl-k">~</span>/conan_github_downloader/conan_github_downloader.cmake <span class="pl-c"><span class="pl-c">#</span> clean build cache</span> conan remove <span class="pl-s"><span class="pl-pds">"</span>*<span class="pl-pds">"</span></span> --build --force</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Easy install with common plugins</h2><a id="user-content-easy-install-with-common-plugins" class="anchor" aria-label="Permalink: Easy install with common plugins" href="#easy-install-with-common-plugins"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">If you want to install flextool and its plugins in single command, change the options provided to <code>tools/buildConanThirdparty.cmake</code>.</p> <p dir="auto">NOTE: <code>tools/buildConanThirdparty.cmake</code> will perform a FULL RE-BUILD; it may take couple of hours.</p> <p dir="auto">Command below uses <code>--profile clang12_compiler12_compiler</code>. Before creation of conan profile file, see: <a href="https://docs.conan.io/en/latest/using_packages/using_profiles.html" rel="nofollow">https://docs.conan.io/en/latest/using_packages/using_profiles.html</a>.</p> <p dir="auto">We use <code>buildConanThirdparty.cmake</code> script to download and install conan packages.</p> <p dir="auto">NOTE: set <code>-DENABLE_CLING=FALSE</code> if you already installed Cling using <code>tools/buildConanThirdparty.cmake</code> above.</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="git clone https://github.com/blockspacer/conan_github_downloader.git ~/conan_github_downloader cmake \ -DSCRIPT_PATH="$PWD/get_conan_dependencies.cmake"\ -DENABLE_CLING=TRUE\ -DENABLE_LLVM=TRUE\ -DENABLE_LLVM_INSTALLER=FALSE\ -DENABLE_FLEXTOOL=TRUE \ -DENABLE_BASIS_PLUGIN_HELPER=TRUE \ -DENABLE_FLEX_REFLECT_PLUGIN=TRUE \ -DENABLE_SQUARETS=TRUE \ -DENABLE_FLEX_SQUARETS_PLUGIN=TRUE \ -DENABLE_FLEX_PIMPL_PLUGIN=TRUE \ -DENABLE_FLEX_TYPECLASS_PLUGIN=TRUE \ -DENABLE_FLEX_META_PLUGIN=TRUE \ -DENABLE_FLEX_META_DEMO=TRUE \ -DEXTRA_CONAN_OPTS="--profile;clang12_compiler\ ;-s;build_type=Debug\ ;-s;cling_conan:build_type=Release\ ;-s;llvm_12:build_type=Release\ ;--build;missing" \ -P ~/conan_github_downloader/conan_github_downloader.cmake # clean build cache conan remove "*" --build --force"><pre>git clone https://github.com/blockspacer/conan_github_downloader.git <span class="pl-k">~</span>/conan_github_downloader cmake \ -DSCRIPT_PATH=<span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$PWD</span>/get_conan_dependencies.cmake<span class="pl-pds">"</span></span>\ -DENABLE_CLING=TRUE\ -DENABLE_LLVM=TRUE\ -DENABLE_LLVM_INSTALLER=FALSE\ -DENABLE_FLEXTOOL=TRUE \ -DENABLE_BASIS_PLUGIN_HELPER=TRUE \ -DENABLE_FLEX_REFLECT_PLUGIN=TRUE \ -DENABLE_SQUARETS=TRUE \ -DENABLE_FLEX_SQUARETS_PLUGIN=TRUE \ -DENABLE_FLEX_PIMPL_PLUGIN=TRUE \ -DENABLE_FLEX_TYPECLASS_PLUGIN=TRUE \ -DENABLE_FLEX_META_PLUGIN=TRUE \ -DENABLE_FLEX_META_DEMO=TRUE \ -DEXTRA_CONAN_OPTS=<span class="pl-s"><span class="pl-pds">"</span>--profile;clang12_compiler<span class="pl-cce">\</span></span> <span class="pl-s">;-s;build_type=Debug<span class="pl-cce">\</span></span> <span class="pl-s">;-s;cling_conan:build_type=Release<span class="pl-cce">\</span></span> <span class="pl-s">;-s;llvm_12:build_type=Release<span class="pl-cce">\</span></span> <span class="pl-s">;--build;missing<span class="pl-pds">"</span></span> \ -P <span class="pl-k">~</span>/conan_github_downloader/conan_github_downloader.cmake <span class="pl-c"><span class="pl-c">#</span> clean build cache</span> conan remove <span class="pl-s"><span class="pl-pds">"</span>*<span class="pl-pds">"</span></span> --build --force</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Installation (without plugins)</h2><a id="user-content-installation-without-plugins" class="anchor" aria-label="Permalink: Installation (without plugins)" href="#installation-without-plugins"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Use command below to re-build flextool (plugins must be installed separately).</p> <p dir="auto">Command below uses <code>--profile clang12_compiler12_compiler</code>. Before creation of conan profile file, see: <a href="https://docs.conan.io/en/latest/using_packages/using_profiles.html" rel="nofollow">https://docs.conan.io/en/latest/using_packages/using_profiles.html</a></p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export VERBOSE=1 export CONAN_REVISIONS_ENABLED=1 export CONAN_VERBOSE_TRACEBACK=1 export CONAN_PRINT_RUN_COMMANDS=1 export CONAN_LOGGING_LEVEL=10 # NOTE: change `build_type=Debug` to `build_type=Release` in production # NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package` cmake -E time \ conan create . conan/stable \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --profile clang12_compiler \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True # clean build cache conan remove "*" --build --force"><pre><span class="pl-k">export</span> VERBOSE=1 <span class="pl-k">export</span> CONAN_REVISIONS_ENABLED=1 <span class="pl-k">export</span> CONAN_VERBOSE_TRACEBACK=1 <span class="pl-k">export</span> CONAN_PRINT_RUN_COMMANDS=1 <span class="pl-k">export</span> CONAN_LOGGING_LEVEL=10 <span class="pl-c"><span class="pl-c">#</span> NOTE: change `build_type=Debug` to `build_type=Release` in production</span> <span class="pl-c"><span class="pl-c">#</span> NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`</span> cmake -E <span class="pl-k">time</span> \ conan create <span class="pl-c1">.</span> conan/stable \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --profile clang12_compiler \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True <span class="pl-c"><span class="pl-c">#</span> clean build cache</span> conan remove <span class="pl-s"><span class="pl-pds">"</span>*<span class="pl-pds">"</span></span> --build --force</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">NOTE: flextool not compatible with <code>compile_commands.json</code></h2><a id="user-content-note-flextool-not-compatible-with-compile_commandsjson" class="anchor" aria-label="Permalink: NOTE: flextool not compatible with compile_commands.json" href="#note-flextool-not-compatible-with-compile_commandsjson"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Disable generation of compilation database when you use flextool.</p> <p dir="auto">If you are using CMake, set <code>CMAKE_EXPORT_COMPILE_COMMANDS</code> to <code>FALSE</code>.</p> <p dir="auto">If <code>compile_commands.json</code> exists in build folder (or in parent folder), flextool may fail.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Standing on the Shoulders of Giants</h2><a id="user-content-standing-on-the-shoulders-of-giants" class="anchor" aria-label="Permalink: Standing on the Shoulders of Giants" href="#standing-on-the-shoulders-of-giants"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">This project is possible because of <a href="https://github.com/flexferrum/autoprogrammer">flexferrum's <code>autoprogrammer</code></a>.</p> <p dir="auto">Articles about flexferrum's <code>autoprogrammer</code> in media:</p> <ul dir="auto"> <li>[RUS] (article) metaclasses <a href="https://habr.com/ru/article/448466/" rel="nofollow">https://habr.com/ru/article/448466/</a></li> <li>[RUS] (slides) C++17 metaclasses <a href="https://assets.ctfassets.net/oxjq45e8ilak/55bGdX2PnYzmrpM8rwCjcE/791e7eee3236c2023e86e169faca8a0e/Sergei_Sadovnikov_Metaclasses_in_C___dream_Reality.pdf" rel="nofollow">https://assets.ctfassets.net/oxjq45e8ilak/55bGdX2PnYzmrpM8rwCjcE/791e7eee3236c2023e86e169faca8a0e/Sergei_Sadovnikov_Metaclasses_in_C___dream_Reality.pdf</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Dev-only build (local conan flow)</h2><a id="user-content-dev-only-build-local-conan-flow" class="anchor" aria-label="Permalink: Dev-only build (local conan flow)" href="#dev-only-build-local-conan-flow"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="find . -type f -name "*_buildflags.h" -exec rm {} \; find . -type f -name "*_buildflags.tmp" -exec rm {} \; (rm -rf local_build || true) export CONAN_REVISIONS_ENABLED=1 export CONAN_VERBOSE_TRACEBACK=1 export CONAN_PRINT_RUN_COMMANDS=1 export CONAN_LOGGING_LEVEL=10 export PKG_NAME=flextool/master@conan/stable (CONAN_REVISIONS_ENABLED=1 \ conan remove --force $PKG_NAME || true) # NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package` cmake -E time \ conan install . \ --install-folder local_build \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_12:build_type=Release \ -o openssl:shared=True \ -e basis:enable_tests=True \ -o chromium_base:shared=True \ -e chromium_base:enable_tests=True \ -o perfetto:is_hermetic_clang=False \ --profile clang12_compiler \ -e flexlib:enable_tests=True \ -o flexlib:shared=False \ -o perfetto:is_hermetic_clang=False \ -o flexlib:enable_cling=True \ -e flextool:enable_tests=True \ -o flextool:enable_cling=True (rm local_build/CMakeCache.txt || true) cmake -E time \ conan source . \ --source-folder . \ --install-folder local_build # You can use `cmake --build . -- -j14` on second run. cmake -E time \ conan build . \ --build-folder local_build \ --source-folder . \ --install-folder local_build conan package . \ --build-folder local_build \ --package-folder local_build/package_dir \ --source-folder . \ --install-folder local_build cmake -E time \ conan export-pkg . conan/stable \ --package-folder local_build/package_dir \ -s build_type=Debug \ --force \ -s cling_conan:build_type=Release \ -s llvm_12:build_type=Release \ -o openssl:shared=True \ -e basis:enable_tests=True \ -o chromium_base:shared=True \ -e chromium_base:enable_tests=True \ -o perfetto:is_hermetic_clang=False \ --profile clang12_compiler \ -e flexlib:enable_tests=True \ -o flexlib:shared=False \ -o perfetto:is_hermetic_clang=False \ -o flexlib:enable_cling=True \ -e flextool:enable_tests=True \ -o flextool:enable_cling=True cmake -E time \ conan test test_package \ flextool/master@conan/stable \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_12:build_type=Release \ -o openssl:shared=True \ -e basis:enable_tests=True \ -o chromium_base:shared=True \ -e chromium_base:enable_tests=True \ -o perfetto:is_hermetic_clang=False \ --profile clang12_compiler \ -e flexlib:enable_tests=True \ -o flexlib:shared=False \ -o perfetto:is_hermetic_clang=False \ -o flexlib:enable_cling=True \ -e flextool:enable_tests=True \ -o flextool:enable_cling=True"><pre>find <span class="pl-c1">.</span> -type f -name <span class="pl-s"><span class="pl-pds">"</span>*_buildflags.h<span class="pl-pds">"</span></span> -exec rm {} <span class="pl-cce">\;</span> find <span class="pl-c1">.</span> -type f -name <span class="pl-s"><span class="pl-pds">"</span>*_buildflags.tmp<span class="pl-pds">"</span></span> -exec rm {} <span class="pl-cce">\;</span> (rm -rf local_build <span class="pl-k">||</span> true) <span class="pl-k">export</span> CONAN_REVISIONS_ENABLED=1 <span class="pl-k">export</span> CONAN_VERBOSE_TRACEBACK=1 <span class="pl-k">export</span> CONAN_PRINT_RUN_COMMANDS=1 <span class="pl-k">export</span> CONAN_LOGGING_LEVEL=10 <span class="pl-k">export</span> PKG_NAME=flextool/master@conan/stable (CONAN_REVISIONS_ENABLED=1 \ conan remove --force <span class="pl-smi">$PKG_NAME</span> <span class="pl-k">||</span> true) <span class="pl-c"><span class="pl-c">#</span> NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`</span> cmake -E <span class="pl-k">time</span> \ conan install <span class="pl-c1">.</span> \ --install-folder local_build \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_12:build_type=Release \ -o openssl:shared=True \ -e basis:enable_tests=True \ -o chromium_base:shared=True \ -e chromium_base:enable_tests=True \ -o perfetto:is_hermetic_clang=False \ --profile clang12_compiler \ -e flexlib:enable_tests=True \ -o flexlib:shared=False \ -o perfetto:is_hermetic_clang=False \ -o flexlib:enable_cling=True \ -e flextool:enable_tests=True \ -o flextool:enable_cling=True (rm local_build/CMakeCache.txt <span class="pl-k">||</span> true) cmake -E <span class="pl-k">time</span> \ conan <span class="pl-c1">source</span> <span class="pl-c1">.</span> \ --source-folder <span class="pl-c1">.</span> \ --install-folder local_build <span class="pl-c"><span class="pl-c">#</span> You can use `cmake --build . -- -j14` on second run.</span> cmake -E <span class="pl-k">time</span> \ conan build <span class="pl-c1">.</span> \ --build-folder local_build \ --source-folder <span class="pl-c1">.</span> \ --install-folder local_build conan package <span class="pl-c1">.</span> \ --build-folder local_build \ --package-folder local_build/package_dir \ --source-folder <span class="pl-c1">.</span> \ --install-folder local_build cmake -E <span class="pl-k">time</span> \ conan export-pkg <span class="pl-c1">.</span> conan/stable \ --package-folder local_build/package_dir \ -s build_type=Debug \ --force \ -s cling_conan:build_type=Release \ -s llvm_12:build_type=Release \ -o openssl:shared=True \ -e basis:enable_tests=True \ -o chromium_base:shared=True \ -e chromium_base:enable_tests=True \ -o perfetto:is_hermetic_clang=False \ --profile clang12_compiler \ -e flexlib:enable_tests=True \ -o flexlib:shared=False \ -o perfetto:is_hermetic_clang=False \ -o flexlib:enable_cling=True \ -e flextool:enable_tests=True \ -o flextool:enable_cling=True cmake -E <span class="pl-k">time</span> \ conan <span class="pl-c1">test</span> test_package \ flextool/master@conan/stable \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_12:build_type=Release \ -o openssl:shared=True \ -e basis:enable_tests=True \ -o chromium_base:shared=True \ -e chromium_base:enable_tests=True \ -o perfetto:is_hermetic_clang=False \ --profile clang12_compiler \ -e flexlib:enable_tests=True \ -o flexlib:shared=False \ -o perfetto:is_hermetic_clang=False \ -o flexlib:enable_cling=True \ -e flextool:enable_tests=True \ -o flextool:enable_cling=True</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: conan editable mode</h2><a id="user-content-for-contibutors-conan-editable-mode" class="anchor" aria-label="Permalink: For contibutors: conan editable mode" href="#for-contibutors-conan-editable-mode"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">With the editable packages, you can tell Conan where to find the headers and the artifacts ready for consumption in your local working directory. There is no need to run <code>conan create</code> or <code>conan export-pkg</code>.</p> <p dir="auto">For details, see: <a href="https://docs.conan.io/en/latest/developing_packages/editable_packages.html" rel="nofollow">https://docs.conan.io/en/latest/developing_packages/editable_packages.html</a></p> <p dir="auto">Build locally:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export VERBOSE=1 export CONAN_REVISIONS_ENABLED=1 export CONAN_VERBOSE_TRACEBACK=1 export CONAN_PRINT_RUN_COMMANDS=1 export CONAN_LOGGING_LEVEL=10 cmake -E time \ conan install . \ --install-folder local_build \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --profile clang12_compiler \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True cmake -E time \ conan source . \ --source-folder local_build \ --install-folder local_build conan build . \ --build-folder local_build \ --source-folder local_build \ --install-folder local_build conan package . \ --build-folder local_build \ --package-folder local_build/package_dir \ --source-folder local_build \ --install-folder local_build"><pre><span class="pl-k">export</span> VERBOSE=1 <span class="pl-k">export</span> CONAN_REVISIONS_ENABLED=1 <span class="pl-k">export</span> CONAN_VERBOSE_TRACEBACK=1 <span class="pl-k">export</span> CONAN_PRINT_RUN_COMMANDS=1 <span class="pl-k">export</span> CONAN_LOGGING_LEVEL=10 cmake -E <span class="pl-k">time</span> \ conan install <span class="pl-c1">.</span> \ --install-folder local_build \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --profile clang12_compiler \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True cmake -E <span class="pl-k">time</span> \ conan <span class="pl-c1">source</span> <span class="pl-c1">.</span> \ --source-folder local_build \ --install-folder local_build conan build <span class="pl-c1">.</span> \ --build-folder local_build \ --source-folder local_build \ --install-folder local_build conan package <span class="pl-c1">.</span> \ --build-folder local_build \ --package-folder local_build/package_dir \ --source-folder local_build \ --install-folder local_build</pre></div> <p dir="auto">Set package to editable mode:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="conan editable add local_build/package_dir \ flextool/master@conan/stable"><pre>conan editable add local_build/package_dir \ flextool/master@conan/stable</pre></div> <p dir="auto">Note that <code>conanfile.py</code> is modified to detect local builds via <code>self.in_local_cache</code>.</p> <p dir="auto">After change source in folder local_build (run commands in source package folder):</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="conan build . \ --build-folder local_build \ --source-folder local_build \ --install-folder local_build conan package . \ --build-folder local_build \ --package-folder local_build/package_dir \ --source-folder local_build \ --install-folder local_build"><pre class="notranslate"><code>conan build . \ --build-folder local_build \ --source-folder local_build \ --install-folder local_build conan package . \ --build-folder local_build \ --package-folder local_build/package_dir \ --source-folder local_build \ --install-folder local_build </code></pre></div> <p dir="auto">Build your test project.</p> <p dir="auto">In order to revert the editable mode just remove the link using:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="conan editable remove \ flextool/master@conan/stable"><pre>conan editable remove \ flextool/master@conan/stable</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: conan workspace</h2><a id="user-content-for-contibutors-conan-workspace" class="anchor" aria-label="Permalink: For contibutors: conan workspace" href="#for-contibutors-conan-workspace"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Allows to build multiple projects at once; it just creates <code>CMakeLists.txt</code> with <code>add_subdirectory</code> pointing to each package folder.</p> <p dir="auto">NOTE: You can open workspace in IDE as usual CMake based project (change build directory to WorkspaceProject path)!</p> <p dir="auto">For details, see: <a href="https://docs.conan.io/en/latest/developing_packages/workspaces.html" rel="nofollow">https://docs.conan.io/en/latest/developing_packages/workspaces.html</a></p> <p dir="auto">For example, we want to build both flextool and flexlib at the same time (flextool requires flexlib).</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# change ~ to desired build folder cd ~ # Replace paths to yours! # Make sure each project in NOT in editable mode! cat <<EOF > ~/conanws.yml editables: flexlib/master@conan/stable: path: /......../flexlib flextool/master@conan/stable: path: /......../flextool layout: layout_flex workspace_generator: cmake root: - flextool/master@conan/stable EOF cat <<EOF > ~/layout_flex # This helps to define the location of CMakeLists.txt within package [source_folder] . # This defines where the conanbuildinfo.cmake will be written to [build_folder] build/{{settings.build_type}} EOF"><pre><span class="pl-c"><span class="pl-c">#</span> change ~ to desired build folder</span> <span class="pl-c1">cd</span> <span class="pl-k">~</span> <span class="pl-c"><span class="pl-c">#</span> Replace paths to yours!</span> <span class="pl-c"><span class="pl-c">#</span> Make sure each project in NOT in editable mode!</span> cat <span class="pl-s"><span class="pl-k"><<</span><span class="pl-k">EOF</span> > ~/conanws.yml</span> <span class="pl-s">editables:</span> <span class="pl-s"> flexlib/master@conan/stable:</span> <span class="pl-s"> path: /......../flexlib</span> <span class="pl-s"> flextool/master@conan/stable:</span> <span class="pl-s"> path: /......../flextool</span> <span class="pl-s">layout: layout_flex</span> <span class="pl-s">workspace_generator: cmake</span> <span class="pl-s">root:</span> <span class="pl-s"> - flextool/master@conan/stable</span> <span class="pl-s"><span class="pl-k">EOF</span></span> cat <span class="pl-s"><span class="pl-k"><<</span><span class="pl-k">EOF</span> > ~/layout_flex</span> <span class="pl-s"># This helps to define the location of CMakeLists.txt within package</span> <span class="pl-s">[source_folder]</span> <span class="pl-s">.</span> <span class="pl-s"></span> <span class="pl-s"># This defines where the conanbuildinfo.cmake will be written to</span> <span class="pl-s">[build_folder]</span> <span class="pl-s">build/{{settings.build_type}}</span> <span class="pl-s"><span class="pl-k">EOF</span></span></pre></div> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="mkdir build_flex cd build_flex cat <<EOF > CMakeLists.txt cmake_minimum_required(VERSION 3.0) project(WorkspaceProject) include(\${CMAKE_BINARY_DIR}/conanworkspace.cmake) list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flexlib_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flextool_SRC}/cmake") conan_workspace_subdirectories() add_dependencies(flextool flexlib) EOF # must contain `include(${CMAKE_BINARY_DIR}/conanworkspace.cmake)` without slash `\` (slash added for bash cat command) cat CMakeLists.txt # combines options from all projects conan workspace install \ ../conanws.yml \ --profile=clang \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ -o openssl:shared=True \ -o chromium_base:shared=True \ -e basis:enable_tests=True \ -e abseil:enable_llvm_tools=True \ -o chromium_base:use_alloc_shim=True \ -o chromium_tcmalloc:use_alloc_shim=True \ -o perfetto:is_hermetic_clang=False \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True \ -o flexlib:shared=False \ -o flexlib:enable_clang_from_conan=False \ -e flexlib:enable_tests=True"><pre>mkdir build_flex <span class="pl-c1">cd</span> build_flex cat <span class="pl-s"><span class="pl-k"><<</span><span class="pl-k">EOF</span> > CMakeLists.txt</span> <span class="pl-s">cmake_minimum_required(VERSION 3.0)</span> <span class="pl-s"></span> <span class="pl-s">project(WorkspaceProject)</span> <span class="pl-s"></span> <span class="pl-s">include(<span class="pl-cce">\$</span>{CMAKE_BINARY_DIR}/conanworkspace.cmake)</span> <span class="pl-s"></span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flexlib_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flextool_SRC}/cmake")</span> <span class="pl-s"></span> <span class="pl-s">conan_workspace_subdirectories()</span> <span class="pl-s"></span> <span class="pl-s">add_dependencies(flextool flexlib)</span> <span class="pl-s"><span class="pl-k">EOF</span></span> <span class="pl-c"><span class="pl-c">#</span> must contain `include(${CMAKE_BINARY_DIR}/conanworkspace.cmake)` without slash `\` (slash added for bash cat command)</span> cat CMakeLists.txt <span class="pl-c"><span class="pl-c">#</span> combines options from all projects</span> conan workspace install \ ../conanws.yml \ --profile=clang \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ -o openssl:shared=True \ -o chromium_base:shared=True \ -e basis:enable_tests=True \ -e abseil:enable_llvm_tools=True \ -o chromium_base:use_alloc_shim=True \ -o chromium_tcmalloc:use_alloc_shim=True \ -o perfetto:is_hermetic_clang=False \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True \ -o flexlib:shared=False \ -o flexlib:enable_clang_from_conan=False \ -e flexlib:enable_tests=True</pre></div> <p dir="auto">Build into folder created by <code>conan workspace install</code>:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# NOTE: change `build_type=Debug` to `build_type=Release` in production export build_type=Debug # optional # remove old CMakeCache (rm CMakeCache.txt || true) # configure via cmake cmake -E time cmake . \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DENABLE_TESTS=TRUE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=ON \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=${build_type} # remove generated files # change paths to yours # rm ~/flex_typeclass_plugin/build/Debug/*generated* # build code cmake -E time cmake --build . \ --config ${build_type} \ -- -j8 # run unit tests for flexlib cmake -E time cmake --build . \ --config ${build_type} \ --target flexlib_run_all_tests # run unit tests for flextool cmake -E time cmake --build . \ --config ${build_type} \ --target flextool_run_all_tests"><pre><span class="pl-c"><span class="pl-c">#</span> NOTE: change `build_type=Debug` to `build_type=Release` in production</span> <span class="pl-k">export</span> build_type=Debug <span class="pl-c"><span class="pl-c">#</span> optional</span> <span class="pl-c"><span class="pl-c">#</span> remove old CMakeCache</span> (rm CMakeCache.txt <span class="pl-k">||</span> true) <span class="pl-c"><span class="pl-c">#</span> configure via cmake</span> cmake -E <span class="pl-k">time</span> cmake <span class="pl-c1">.</span> \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DENABLE_TESTS=TRUE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=ON \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=<span class="pl-smi">${build_type}</span> <span class="pl-c"><span class="pl-c">#</span> remove generated files</span> <span class="pl-c"><span class="pl-c">#</span> change paths to yours</span> <span class="pl-c"><span class="pl-c">#</span> rm ~/flex_typeclass_plugin/build/Debug/*generated*</span> <span class="pl-c"><span class="pl-c">#</span> build code</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ -- -j8 <span class="pl-c"><span class="pl-c">#</span> run unit tests for flexlib</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flexlib_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for flextool</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flextool_run_all_tests</pre></div> <p dir="auto">Workspace allows to make quick changes in existing source files.</p> <p dir="auto">We use <code>self.in_local_cache</code> to detect conan editable mode:</p> <div class="highlight highlight-source-python notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Local build # see https://docs.conan.io/en/latest/developing_packages/editable_packages.html if not self.in_local_cache: self.copy("conanfile.py", dst=".", keep_path=False)"><pre><span class="pl-c"># Local build</span> <span class="pl-c"># see https://docs.conan.io/en/latest/developing_packages/editable_packages.html</span> <span class="pl-k">if</span> <span class="pl-c1">not</span> <span class="pl-s1">self</span>.<span class="pl-s1">in_local_cache</span>: <span class="pl-s1">self</span>.<span class="pl-en">copy</span>(<span class="pl-s">"conanfile.py"</span>, <span class="pl-s1">dst</span><span class="pl-c1">=</span><span class="pl-s">"."</span>, <span class="pl-s1">keep_path</span><span class="pl-c1">=</span><span class="pl-c1">False</span>)</pre></div> <p dir="auto">Make sure that all targets have globally unique names.</p> <p dir="auto">For example: you can not have a target in each project with the same name like "test". You can solve that issue by adding project-specific prefix to name of each target like "${ROOT_PROJECT_NAME}-test_main_gtest".</p> <p dir="auto">Because <code>CMAKE_BINARY_DIR</code> will point to folder created by <code>conan workspace install</code>, make sure that you prefer <code>CMAKE_CURRENT_BINARY_DIR</code> to <code>CMAKE_BINARY_DIR</code> etc.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: conan workspace with plugins</h2><a id="user-content-for-contibutors-conan-workspace-with-plugins" class="anchor" aria-label="Permalink: For contibutors: conan workspace with plugins" href="#for-contibutors-conan-workspace-with-plugins"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Before installation: plugins require pre-built flextool (in same workspace). You must build workspace without plugins; only then you will be able to re-build it with plugins.</p> <p dir="auto">Add plugins to yml file:</p> <div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="editables: chromium_base/master@conan/stable: path: /........./chromium_base basis/master@conan/stable: path: /........./basis flex_support_headers/master@conan/stable: path: /........./flex_support_headers flexlib/master@conan/stable: path: /........./flexlib flextool/master@conan/stable: path: /........./flextool flex_reflect_plugin/master@conan/stable: path: /........./flex_reflect_plugin squarets/master@conan/stable: path: /........./squarets flex_squarets_plugin/master@conan/stable: path: /........./flex_squarets_plugin flex_typeclass_plugin/master@conan/stable: path: /........./flex_typeclass_plugin flex_pimpl_plugin/master@conan/stable: path: /........./flex_pimpl_plugin flex_meta_plugin/master@conan/stable: path: /........./flex_meta_plugin flex_meta_demo/master@conan/stable: path: /........./flex_meta_demo layout: layout_flex workspace_generator: cmake root: - flex_reflect_plugin/master@conan/stable - squarets/master@conan/stable - flex_squarets_plugin/master@conan/stable - flex_typeclass_plugin/master@conan/stable - flex_pimpl_plugin/master@conan/stable - flex_meta_plugin/master@conan/stable - flex_meta_demo/master@conan/stable"><pre><span class="pl-ent">editables</span>: <span class="pl-ent">chromium_base/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./chromium_base</span> <span class="pl-ent">basis/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./basis</span> <span class="pl-ent">flex_support_headers/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flex_support_headers</span> <span class="pl-ent">flexlib/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flexlib</span> <span class="pl-ent">flextool/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flextool</span> <span class="pl-ent">flex_reflect_plugin/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flex_reflect_plugin</span> <span class="pl-ent">squarets/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./squarets</span> <span class="pl-ent">flex_squarets_plugin/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flex_squarets_plugin</span> <span class="pl-ent">flex_typeclass_plugin/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flex_typeclass_plugin</span> <span class="pl-ent">flex_pimpl_plugin/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flex_pimpl_plugin</span> <span class="pl-ent">flex_meta_plugin/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flex_meta_plugin</span> <span class="pl-ent">flex_meta_demo/master@conan/stable</span>: <span class="pl-ent">path</span>: <span class="pl-s">/........./flex_meta_demo</span> <span class="pl-ent">layout</span>: <span class="pl-s">layout_flex</span> <span class="pl-ent">workspace_generator</span>: <span class="pl-s">cmake</span> <span class="pl-ent">root</span>: - <span class="pl-s">flex_reflect_plugin/master@conan/stable</span> - <span class="pl-s">squarets/master@conan/stable</span> - <span class="pl-s">flex_squarets_plugin/master@conan/stable</span> - <span class="pl-s">flex_typeclass_plugin/master@conan/stable</span> - <span class="pl-s">flex_pimpl_plugin/master@conan/stable</span> - <span class="pl-s">flex_meta_plugin/master@conan/stable</span> - <span class="pl-s">flex_meta_demo/master@conan/stable</span></pre></div> <p dir="auto">Use <code>add_dependencies</code> in <code>CMakeLists.txt</code>:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="mkdir build_flex cd build_flex cat <<EOF > CMakeLists.txt cmake_minimum_required(VERSION 3.0) project(WorkspaceProject) include(\${CMAKE_BINARY_DIR}/conanworkspace.cmake) list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_chromium_base_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_basis_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flex_support_headers_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flexlib_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flex_reflect_plugin_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_squarets_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flex_squarets_plugin_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flex_typeclass_plugin_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flex_meta_plugin_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flex_meta_demo_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flex_pimpl_plugin_SRC}/cmake") list(PREPEND CMAKE_MODULE_PATH "\${PACKAGE_flextool_SRC}/cmake") conan_workspace_subdirectories() add_dependencies(basis chromium_base-static) add_dependencies(flexlib basis) add_dependencies(flextool flexlib basis flex_support_headers) add_dependencies(flex_reflect_plugin flextool) add_dependencies(flex_squarets_plugin squarets) add_dependencies(flex_squarets_plugin flextool) add_dependencies(flex_pimpl_plugin flextool) add_dependencies(flex_pimpl_plugin flex_reflect_plugin) add_dependencies(flex_pimpl_plugin flex_squarets_plugin) add_dependencies(flex_typeclass_plugin flextool) add_dependencies(flex_typeclass_plugin flex_squarets_plugin) add_dependencies(flex_meta_demo flex_meta_plugin) add_dependencies(flex_meta_demo flex_typeclass_plugin) add_dependencies(flex_meta_demo flex_pimpl_plugin) add_dependencies(flex_meta_demo flex_squarets_plugin) EOF"><pre>mkdir build_flex <span class="pl-c1">cd</span> build_flex cat <span class="pl-s"><span class="pl-k"><<</span><span class="pl-k">EOF</span> > CMakeLists.txt</span> <span class="pl-s">cmake_minimum_required(VERSION 3.0)</span> <span class="pl-s"></span> <span class="pl-s">project(WorkspaceProject)</span> <span class="pl-s"></span> <span class="pl-s">include(<span class="pl-cce">\$</span>{CMAKE_BINARY_DIR}/conanworkspace.cmake)</span> <span class="pl-s"></span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_chromium_base_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_basis_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flex_support_headers_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flexlib_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flex_reflect_plugin_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_squarets_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flex_squarets_plugin_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flex_typeclass_plugin_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flex_meta_plugin_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flex_meta_demo_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flex_pimpl_plugin_SRC}/cmake")</span> <span class="pl-s">list(PREPEND CMAKE_MODULE_PATH "<span class="pl-cce">\$</span>{PACKAGE_flextool_SRC}/cmake")</span> <span class="pl-s"></span> <span class="pl-s">conan_workspace_subdirectories()</span> <span class="pl-s"></span> <span class="pl-s">add_dependencies(basis chromium_base-static)</span> <span class="pl-s">add_dependencies(flexlib basis)</span> <span class="pl-s">add_dependencies(flextool flexlib basis flex_support_headers)</span> <span class="pl-s">add_dependencies(flex_reflect_plugin flextool)</span> <span class="pl-s">add_dependencies(flex_squarets_plugin squarets)</span> <span class="pl-s">add_dependencies(flex_squarets_plugin flextool)</span> <span class="pl-s">add_dependencies(flex_pimpl_plugin flextool)</span> <span class="pl-s">add_dependencies(flex_pimpl_plugin flex_reflect_plugin)</span> <span class="pl-s">add_dependencies(flex_pimpl_plugin flex_squarets_plugin)</span> <span class="pl-s">add_dependencies(flex_typeclass_plugin flextool)</span> <span class="pl-s">add_dependencies(flex_typeclass_plugin flex_squarets_plugin)</span> <span class="pl-s">add_dependencies(flex_meta_demo flex_meta_plugin)</span> <span class="pl-s">add_dependencies(flex_meta_demo flex_typeclass_plugin)</span> <span class="pl-s">add_dependencies(flex_meta_demo flex_pimpl_plugin)</span> <span class="pl-s">add_dependencies(flex_meta_demo flex_squarets_plugin)</span> <span class="pl-s"><span class="pl-k">EOF</span></span></pre></div> <p dir="auto">Add plugins options to <code>conan workspace install</code>:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# combines options from all projects conan workspace install \ ../conanws.yml \ --profile=clang \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ -e basis:enable_tests=True \ -o openssl:shared=True \ -o chromium_base:shared=True \ -o chromium_base:use_alloc_shim=True \ -o perfetto:is_hermetic_clang=False \ -o chromium_tcmalloc:use_alloc_shim=True \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True \ -o flexlib:shared=False \ -o flexlib:enable_clang_from_conan=False \ -e flexlib:enable_tests=True \ -o flex_reflect_plugin:shared=True \ -o flex_reflect_plugin:enable_clang_from_conan=False \ -e flex_reflect_plugin:enable_tests=True \ -o squarets:shared=False \ -o squarets:enable_clang_from_conan=False \ -e squarets:enable_tests=True \ -o flex_squarets_plugin:shared=False \ -o flex_squarets_plugin:enable_clang_from_conan=False \ -e flex_squarets_plugin:enable_tests=True \ -o flex_meta_plugin:shared=False \ -o flex_meta_plugin:enable_clang_from_conan=False \ -e flex_meta_plugin:enable_tests=True \ -o flex_typeclass_plugin:shared=False \ -o flex_typeclass_plugin:enable_clang_from_conan=False \ -e flex_typeclass_plugin:enable_tests=True \ -o flex_pimpl_plugin:shared=False \ -o flex_pimpl_plugin:enable_clang_from_conan=False \ -e flex_pimpl_plugin:enable_tests=True \ -o flex_meta_demo:enable_clang_from_conan=False \ -e flex_meta_demo:enable_tests=True"><pre><span class="pl-c"><span class="pl-c">#</span> combines options from all projects</span> conan workspace install \ ../conanws.yml \ --profile=clang \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ -e basis:enable_tests=True \ -o openssl:shared=True \ -o chromium_base:shared=True \ -o chromium_base:use_alloc_shim=True \ -o perfetto:is_hermetic_clang=False \ -o chromium_tcmalloc:use_alloc_shim=True \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True \ -o flexlib:shared=False \ -o flexlib:enable_clang_from_conan=False \ -e flexlib:enable_tests=True \ -o flex_reflect_plugin:shared=True \ -o flex_reflect_plugin:enable_clang_from_conan=False \ -e flex_reflect_plugin:enable_tests=True \ -o squarets:shared=False \ -o squarets:enable_clang_from_conan=False \ -e squarets:enable_tests=True \ -o flex_squarets_plugin:shared=False \ -o flex_squarets_plugin:enable_clang_from_conan=False \ -e flex_squarets_plugin:enable_tests=True \ -o flex_meta_plugin:shared=False \ -o flex_meta_plugin:enable_clang_from_conan=False \ -e flex_meta_plugin:enable_tests=True \ -o flex_typeclass_plugin:shared=False \ -o flex_typeclass_plugin:enable_clang_from_conan=False \ -e flex_typeclass_plugin:enable_tests=True \ -o flex_pimpl_plugin:shared=False \ -o flex_pimpl_plugin:enable_clang_from_conan=False \ -e flex_pimpl_plugin:enable_tests=True \ -o flex_meta_demo:enable_clang_from_conan=False \ -e flex_meta_demo:enable_tests=True</pre></div> <p dir="auto">Build and test workspace:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# NOTE: change `build_type=Debug` to `build_type=Release` in production export build_type=Debug # optional # remove old CMakeCache (rm CMakeCache.txt || true) # configure via cmake cmake -E time cmake . \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DENABLE_TESTS=TRUE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=ON \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=${build_type} # remove generated files # change paths to yours # rm ~/flex_typeclass_plugin/build/Debug/*generated* # build code cmake -E time cmake --build . \ --config ${build_type} \ -- -j8 # run unit tests for flexlib cmake -E time cmake --build . \ --config ${build_type} \ --target flexlib_run_all_tests # run unit tests for flextool cmake -E time cmake --build . \ --config ${build_type} \ --target flextool_run_all_tests # run unit tests for flex_reflect_plugin cmake -E time cmake --build . \ --config ${build_type} \ --target flex_reflect_plugin_run_all_tests # run unit tests for squarets cmake -E time cmake --build . \ --config ${build_type} \ --target squarets_run_all_tests # run unit tests for flex_squarets_plugin cmake -E time cmake --build . \ --config ${build_type} \ --target flex_squarets_plugin_run_all_tests # run unit tests for flex_squarets_plugin cmake -E time cmake --build . \ --config ${build_type} \ --target flex_meta_plugin_run_all_tests # run unit tests for flex_squarets_plugin cmake -E time cmake --build . \ --config ${build_type} \ --target flex_typeclass_plugin_run_all_tests # run unit tests for flex_squarets_plugin cmake -E time cmake --build . \ --config ${build_type} \ --target flex_pimpl_plugin_run_all_tests # run unit tests for flex_squarets_plugin cmake -E time cmake --build . \ --config ${build_type} \ --target flex_meta_demo_run_all_tests"><pre><span class="pl-c"><span class="pl-c">#</span> NOTE: change `build_type=Debug` to `build_type=Release` in production</span> <span class="pl-k">export</span> build_type=Debug <span class="pl-c"><span class="pl-c">#</span> optional</span> <span class="pl-c"><span class="pl-c">#</span> remove old CMakeCache</span> (rm CMakeCache.txt <span class="pl-k">||</span> true) <span class="pl-c"><span class="pl-c">#</span> configure via cmake</span> cmake -E <span class="pl-k">time</span> cmake <span class="pl-c1">.</span> \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DENABLE_TESTS=TRUE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=ON \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=<span class="pl-smi">${build_type}</span> <span class="pl-c"><span class="pl-c">#</span> remove generated files</span> <span class="pl-c"><span class="pl-c">#</span> change paths to yours</span> <span class="pl-c"><span class="pl-c">#</span> rm ~/flex_typeclass_plugin/build/Debug/*generated*</span> <span class="pl-c"><span class="pl-c">#</span> build code</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ -- -j8 <span class="pl-c"><span class="pl-c">#</span> run unit tests for flexlib</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flexlib_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for flextool</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flextool_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for flex_reflect_plugin</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flex_reflect_plugin_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for squarets</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target squarets_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for flex_squarets_plugin</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flex_squarets_plugin_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for flex_squarets_plugin</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flex_meta_plugin_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for flex_squarets_plugin</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flex_typeclass_plugin_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for flex_squarets_plugin</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flex_pimpl_plugin_run_all_tests <span class="pl-c"><span class="pl-c">#</span> run unit tests for flex_squarets_plugin</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --config <span class="pl-smi">${build_type}</span> \ --target flex_meta_demo_run_all_tests</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: cppcheck</h2><a id="user-content-for-contibutors-cppcheck" class="anchor" aria-label="Permalink: For contibutors: cppcheck" href="#for-contibutors-cppcheck"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Make sure you use <code>Debug</code> build with <code>-e flextool:enable_llvm_tools=True</code>.</p> <p dir="auto">Install cppcheck via conan:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cd /tmp git clone -b testing/1.90 https://github.com/bincrafters/conan-cppcheck_installer.git cd conan-cppcheck_installer export VERBOSE=1 export CONAN_REVISIONS_ENABLED=1 export CONAN_VERBOSE_TRACEBACK=1 export CONAN_PRINT_RUN_COMMANDS=1 export CONAN_LOGGING_LEVEL=10 # NOTE: change `build_type=Debug` to `build_type=Release` in production # NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package` cmake -E time \ conan create . conan/stable \ -s build_type=Release # clean build cache conan remove "*" --build --force"><pre><span class="pl-c1">cd</span> /tmp git clone -b testing/1.90 https://github.com/bincrafters/conan-cppcheck_installer.git <span class="pl-c1">cd</span> conan-cppcheck_installer <span class="pl-k">export</span> VERBOSE=1 <span class="pl-k">export</span> CONAN_REVISIONS_ENABLED=1 <span class="pl-k">export</span> CONAN_VERBOSE_TRACEBACK=1 <span class="pl-k">export</span> CONAN_PRINT_RUN_COMMANDS=1 <span class="pl-k">export</span> CONAN_LOGGING_LEVEL=10 <span class="pl-c"><span class="pl-c">#</span> NOTE: change `build_type=Debug` to `build_type=Release` in production</span> <span class="pl-c"><span class="pl-c">#</span> NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`</span> cmake -E <span class="pl-k">time</span> \ conan create <span class="pl-c1">.</span> conan/stable \ -s build_type=Release <span class="pl-c"><span class="pl-c">#</span> clean build cache</span> conan remove <span class="pl-s"><span class="pl-pds">"</span>*<span class="pl-pds">"</span></span> --build --force</pre></div> <p dir="auto">Usage (runs cmake with <code>-DENABLE_CPPCHECK=ON</code>):</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# creates local build in separate folder and runs cmake targets # NOTE: -DCLEAN_OLD="OFF" to keep generated html report cmake -DCPPCHECK="ON" -DCLEAN_OLD="OFF" -P tools/run_tool.cmake"><pre><span class="pl-c"><span class="pl-c">#</span> creates local build in separate folder and runs cmake targets</span> <span class="pl-c"><span class="pl-c">#</span> NOTE: -DCLEAN_OLD="OFF" to keep generated html report</span> cmake -DCPPCHECK=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -DCLEAN_OLD=<span class="pl-s"><span class="pl-pds">"</span>OFF<span class="pl-pds">"</span></span> -P tools/run_tool.cmake</pre></div> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# `index.html` must exist # find $PWD -name index.html"><pre><span class="pl-c"><span class="pl-c">#</span> `index.html` must exist</span> <span class="pl-c"><span class="pl-c">#</span> find $PWD -name index.html</span></pre></div> <p dir="auto">Open 'index.html' to see the results.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: vue ui</h2><a id="user-content-for-contibutors-vue-ui" class="anchor" aria-label="Permalink: For contibutors: vue ui" href="#for-contibutors-vue-ui"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Desktop application that provides a single context to manage and run multiple scripts.</p> <p dir="auto">Simplifies setup of local dev environment; this avoids opening a lot of shell terminals.</p> <p dir="auto">You can add custom commands in <code>package.json</code> or <code>plugin/vue-cli-plugin/ui.js</code>:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Before: Install Latest Node.js and NPM # see https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/ node --version npm --version"><pre><span class="pl-c"><span class="pl-c">#</span> Before: Install Latest Node.js and NPM</span> <span class="pl-c"><span class="pl-c">#</span> see https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/</span> node --version npm --version</pre></div> <p dir="auto">Build your project via npm:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="npm install"><pre>npm install</pre></div> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="sudo npm install -g @vue/cli sudo vue ui --dev --port 8061"><pre>sudo npm install -g @vue/cli sudo vue ui --dev --port 8061</pre></div> <p dir="auto">Open <code>http://localhost:8061/</code>.</p> <p dir="auto">Import project directory.</p> <p dir="auto">Select <code>Tasks</code>, like build/test...</p> <p dir="auto">Tasks may be changed in <code>package.json</code>.</p> <p dir="auto">NOTE: We use <code>package.json</code> only for tasks. Conan is controlled by a file called conanfile.txt.</p> <p dir="auto">Useful links:</p> <ul dir="auto"> <li><a href="https://cli.vuejs.org/dev-guide/ui-api.html#ui-files" rel="nofollow">https://cli.vuejs.org/dev-guide/ui-api.html#ui-files</a></li> <li><a href="https://github.com/Dewep/GCE">https://github.com/Dewep/GCE</a></li> <li><a href="https://github.com/supnate/command-pad">https://github.com/supnate/command-pad</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: gdbinit</h2><a id="user-content-for-contibutors-gdbinit" class="anchor" aria-label="Permalink: For contibutors: gdbinit" href="#for-contibutors-gdbinit"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">We use <code>.gdbinit</code> add 'add-auto-load-safe-path .'</p> <p dir="auto">For more details about <code>.gdbinit</code>, read: <a href="https://metricpanda.com/tips-for-productive-debugging-with-gdb" rel="nofollow">https://metricpanda.com/tips-for-productive-debugging-with-gdb</a></p> <p dir="auto">For more details about <code>gdb</code>, read: <a href="http://www.yolinux.com/TUTORIALS/GDB-Commands.html" rel="nofollow">http://www.yolinux.com/TUTORIALS/GDB-Commands.html</a></p> <p dir="auto">GDB debugging session can be automated like so:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# see https://gist.github.com/williballenthin/8bd6e29ad8504b9cb308039f675ee889 gdb \ -ex "run" \ -ex "set pagination off" \ -ex "bt" \ -ex "set confirm off" \ -ex "quit" \ --args \ ${APP_EXE} \ ${APP_CMD_ARGS}"><pre><span class="pl-c"><span class="pl-c">#</span> see https://gist.github.com/williballenthin/8bd6e29ad8504b9cb308039f675ee889</span> gdb \ -ex <span class="pl-s"><span class="pl-pds">"</span>run<span class="pl-pds">"</span></span> \ -ex <span class="pl-s"><span class="pl-pds">"</span>set pagination off<span class="pl-pds">"</span></span> \ -ex <span class="pl-s"><span class="pl-pds">"</span>bt<span class="pl-pds">"</span></span> \ -ex <span class="pl-s"><span class="pl-pds">"</span>set confirm off<span class="pl-pds">"</span></span> \ -ex <span class="pl-s"><span class="pl-pds">"</span>quit<span class="pl-pds">"</span></span> \ --args \ <span class="pl-smi">${APP_EXE}</span> \ <span class="pl-smi">${APP_CMD_ARGS}</span></pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: valgrind</h2><a id="user-content-for-contibutors-valgrind" class="anchor" aria-label="Permalink: For contibutors: valgrind" href="#for-contibutors-valgrind"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Make sure you use <code>Debug</code> build with <code>-e flextool:enable_llvm_tools=True</code>.</p> <p dir="auto">For details, see:</p> <ul dir="auto"> <li><a href="https://www.jetbrains.com/help/clion/memory-profiling-with-valgrind.html" rel="nofollow">https://www.jetbrains.com/help/clion/memory-profiling-with-valgrind.html</a></li> <li><a href="https://heeris.id.au/2016/valgrind-gdb/" rel="nofollow">https://heeris.id.au/2016/valgrind-gdb/</a></li> </ul> <p dir="auto">Install valgrind:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="sudo apt install valgrind # Ubuntu, Debian, etc. # OR sudo yum install valgrind # RHEL, CentOS, Fedora, etc."><pre>sudo apt install valgrind <span class="pl-c"><span class="pl-c">#</span> Ubuntu, Debian, etc.</span> <span class="pl-c"><span class="pl-c">#</span> OR</span> sudo yum install valgrind <span class="pl-c"><span class="pl-c">#</span> RHEL, CentOS, Fedora, etc.</span></pre></div> <p dir="auto">NOTE: make sure you set <code>use_alloc_shim=False</code> and <code>enable_valgrind=True</code> (see below).</p> <p dir="auto">Run valgrind via cmake:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export VERBOSE=1 export CONAN_REVISIONS_ENABLED=1 export CONAN_VERBOSE_TRACEBACK=1 export CONAN_PRINT_RUN_COMMANDS=1 export CONAN_LOGGING_LEVEL=10 # NOTE: set `use_alloc_shim=False` and `enable_valgrind=True` for valgrind support cmake -E time \ conan install . \ --install-folder local_build_valgrind \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --profile clang12_compiler \ -o flextool:enable_valgrind=True \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True \ -e abseil:enable_llvm_tools=True \ -o chromium_base:enable_valgrind=True \ -e chromium_base:enable_llvm_tools=True \ -o chromium_base:use_alloc_shim=False \ -o perfetto:is_hermetic_clang=False \ -o basis:enable_valgrind=True \ -e basis:enable_llvm_tools=True \ -o flexlib:enable_valgrind=True \ -e flexlib:enable_llvm_tools=True \ -o flexlib:enable_clang_from_conan=False \ -o chromium_tcmalloc:use_alloc_shim=False \ --build chromium_base \ --build chromium_tcmalloc \ --build basis \ --build flexlib cd ~/flextool # see section about `conan editable mode` cd local_build_valgrind # optional # remove old CMakeCache (rm CMakeCache.txt || true) # remove old build artifacts rm -rf flextool rm -rf bin find . -iname '*.o' -exec rm {} \; find . -iname '*.a' -exec rm {} \; find . -iname '*.dll' -exec rm {} \; find . -iname '*.lib' -exec rm {} \; # NOTE: -DENABLE_VALGRIND=ON cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DENABLE_VALGRIND=ON \ -DENABLE_TESTS=TRUE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=ON \ -DENABLE_VALGRIND_TESTS=TRUE \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=Debug # NOTE: to run some tests under valgrind # use `-DENABLE_VALGRIND_TESTS=TRUE` cmake -E time cmake --build . \ --target flextool-gmock_run_valgrind # Cmake will print valgrind command that was executed. # You can copy executed command and add custom command-line arguments: # --gtest_filter=ToolsSanityTest.DISABLED_ValgrindTest \ # --gtest_also_run_disabled_tests # search for valgrind log file find $PWD -name *valgrind*.log"><pre><span class="pl-k">export</span> VERBOSE=1 <span class="pl-k">export</span> CONAN_REVISIONS_ENABLED=1 <span class="pl-k">export</span> CONAN_VERBOSE_TRACEBACK=1 <span class="pl-k">export</span> CONAN_PRINT_RUN_COMMANDS=1 <span class="pl-k">export</span> CONAN_LOGGING_LEVEL=10 <span class="pl-c"><span class="pl-c">#</span> NOTE: set `use_alloc_shim=False` and `enable_valgrind=True` for valgrind support</span> cmake -E <span class="pl-k">time</span> \ conan install <span class="pl-c1">.</span> \ --install-folder local_build_valgrind \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --profile clang12_compiler \ -o flextool:enable_valgrind=True \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True \ -e abseil:enable_llvm_tools=True \ -o chromium_base:enable_valgrind=True \ -e chromium_base:enable_llvm_tools=True \ -o chromium_base:use_alloc_shim=False \ -o perfetto:is_hermetic_clang=False \ -o basis:enable_valgrind=True \ -e basis:enable_llvm_tools=True \ -o flexlib:enable_valgrind=True \ -e flexlib:enable_llvm_tools=True \ -o flexlib:enable_clang_from_conan=False \ -o chromium_tcmalloc:use_alloc_shim=False \ --build chromium_base \ --build chromium_tcmalloc \ --build basis \ --build flexlib <span class="pl-c1">cd</span> <span class="pl-k">~</span>/flextool <span class="pl-c"><span class="pl-c">#</span> see section about `conan editable mode`</span> <span class="pl-c1">cd</span> local_build_valgrind <span class="pl-c"><span class="pl-c">#</span> optional</span> <span class="pl-c"><span class="pl-c">#</span> remove old CMakeCache</span> (rm CMakeCache.txt <span class="pl-k">||</span> true) <span class="pl-c"><span class="pl-c">#</span> remove old build artifacts</span> rm -rf flextool rm -rf bin find <span class="pl-c1">.</span> -iname <span class="pl-s"><span class="pl-pds">'</span>*.o<span class="pl-pds">'</span></span> -exec rm {} <span class="pl-cce">\;</span> find <span class="pl-c1">.</span> -iname <span class="pl-s"><span class="pl-pds">'</span>*.a<span class="pl-pds">'</span></span> -exec rm {} <span class="pl-cce">\;</span> find <span class="pl-c1">.</span> -iname <span class="pl-s"><span class="pl-pds">'</span>*.dll<span class="pl-pds">'</span></span> -exec rm {} <span class="pl-cce">\;</span> find <span class="pl-c1">.</span> -iname <span class="pl-s"><span class="pl-pds">'</span>*.lib<span class="pl-pds">'</span></span> -exec rm {} <span class="pl-cce">\;</span> <span class="pl-c"><span class="pl-c">#</span> NOTE: -DENABLE_VALGRIND=ON</span> cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DENABLE_VALGRIND=ON \ -DENABLE_TESTS=TRUE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=ON \ -DENABLE_VALGRIND_TESTS=TRUE \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=Debug <span class="pl-c"><span class="pl-c">#</span> NOTE: to run some tests under valgrind</span> <span class="pl-c"><span class="pl-c">#</span> use `-DENABLE_VALGRIND_TESTS=TRUE`</span> cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --target flextool-gmock_run_valgrind <span class="pl-c"><span class="pl-c">#</span> Cmake will print valgrind command that was executed.</span> <span class="pl-c"><span class="pl-c">#</span> You can copy executed command and add custom command-line arguments:</span> <span class="pl-c"><span class="pl-c">#</span> --gtest_filter=ToolsSanityTest.DISABLED_ValgrindTest \</span> <span class="pl-c"><span class="pl-c">#</span> --gtest_also_run_disabled_tests</span> <span class="pl-c"><span class="pl-c">#</span> search for valgrind log file</span> find <span class="pl-smi">$PWD</span> -name <span class="pl-k">*</span>valgrind<span class="pl-k">*</span>.log</pre></div> <p dir="auto">To find leaks, you can seach for <code>definitely lost</code> in log file.</p> <p dir="auto">NOTE: you can add valgrind suppressions in <code>cmake/valgrind.cfg</code>.</p> <p dir="auto">NOTE: compile program with a debug flag to run under valgrind.</p> <p dir="auto">NOTE: use <code>valgrind --tool=helgrind</code> to detect potential deadlocks and data races.</p> <p dir="auto">NOTE: use <code>valgrind --tool=massif --massif-out-file=massif_file --stacks=true</code> to measure size of heap. See also: <a href="https://kde.org/applications/development/org.kde.massif-visualizer" rel="nofollow">https://kde.org/applications/development/org.kde.massif-visualizer</a></p> <p dir="auto">For details, see: <a href="https://stackoverflow.com/a/44989219" rel="nofollow">https://stackoverflow.com/a/44989219</a></p> <p dir="auto">TODO: try to build with valgrind and clang 10 <a href="https://stackoverflow.com/questions/40509986/valgrind-reporting-mismatched-free-delete-delete" rel="nofollow">https://stackoverflow.com/questions/40509986/valgrind-reporting-mismatched-free-delete-delete</a></p> <p dir="auto">TODO: valgrind may not support chromium base, FIXME. And remove GTEST_NO_SUITE</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: clang-tidy</h2><a id="user-content-for-contibutors-clang-tidy" class="anchor" aria-label="Permalink: For contibutors: clang-tidy" href="#for-contibutors-clang-tidy"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Make sure you use <code>Debug</code> build with <code>-e flextool:enable_llvm_tools=True</code></p> <p dir="auto">Install clang-tidy:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="sudo apt-get install clang-tidy # Ubuntu, Debian, etc. # OR sudo yum install clang-tidy # RHEL, CentOS, Fedora, etc."><pre>sudo apt-get install clang-tidy <span class="pl-c"><span class="pl-c">#</span> Ubuntu, Debian, etc.</span> <span class="pl-c"><span class="pl-c">#</span> OR</span> sudo yum install clang-tidy <span class="pl-c"><span class="pl-c">#</span> RHEL, CentOS, Fedora, etc.</span></pre></div> <p dir="auto">Usage (runs cmake with <code>-DENABLE_CLANG_TIDY=ON</code>):</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# creates local build in separate folder and runs cmake targets cmake -DCLANG_TIDY="ON" -DCLEAN_OLD="ON" -P tools/run_tool.cmake"><pre><span class="pl-c"><span class="pl-c">#</span> creates local build in separate folder and runs cmake targets</span> cmake -DCLANG_TIDY=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -DCLEAN_OLD=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -P tools/run_tool.cmake</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: scan-build</h2><a id="user-content-for-contibutors-scan-build" class="anchor" aria-label="Permalink: For contibutors: scan-build" href="#for-contibutors-scan-build"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Make sure you use <code>Debug</code> build with <code>-e flextool:enable_llvm_tools=True</code></p> <p dir="auto">For details, see: <a href="https://chromium.googlesource.com/chromium/src.git/+/master/docs/clang_static_analyzer.md" rel="nofollow">https://chromium.googlesource.com/chromium/src.git/+/master/docs/clang_static_analyzer.md</a> and <a href="https://clang-analyzer.llvm.org/scan-build.html" rel="nofollow">https://clang-analyzer.llvm.org/scan-build.html</a></p> <p dir="auto">The program ccc-analyzer acts like a fake compiler, forwarding its command line arguments over to the compiler to perform regular compilation and clang to perform static analysis.</p> <p dir="auto">Running configure typically generates makefiles that have hardwired paths to the compiler, and by running configure through scan-build that path is set to ccc-analyzer.</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# must exist ccc-analyzer -v # must exist c++-analyzer -v # must exist scan-build -v export VERBOSE=1 export CONAN_REVISIONS_ENABLED=1 export CONAN_VERBOSE_TRACEBACK=1 export CONAN_PRINT_RUN_COMMANDS=1 export CONAN_LOGGING_LEVEL=10 cmake -E time \ conan install . \ --install-folder local_build_scan_build \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --profile clang12_compiler \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True cmake -E time \ conan source . \ --source-folder local_build_scan_build \ --install-folder local_build_scan_build # see section about `conan editable mode` cd local_build_scan_build # NOTE: change `build_type=Debug` to `build_type=Release` in production export build_type=Debug # optional # remove old CMakeCache (rm CMakeCache.txt || true) # NOTE: changed CMAKE_C_COMPILER to ccc-analyzer (!!!) # configure via cmake scan-build \ --use-cc=clang-10 \ --use-c++=clang++-10 \ -o ./scanbuildout/ \ cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DCMAKE_C_COMPILER=ccc-analyzer \ -DCMAKE_CXX_COMPILER=c++-analyzer \ -DENABLE_TESTS=FALSE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=OFF \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=${build_type} # remove old build artifacts (make clean || true) rm -rf bin # NOTE: requires project configured in debug build # disable other static analyzers # run from build directory scan-build \ -maxloop 8 \ -enable-checker alpha.security.taint.TaintPropagation \ -enable-checker alpha.core.BoolAssignment \ -enable-checker alpha.core.CastSize \ -enable-checker alpha.core.DynamicTypeChecker \ -enable-checker alpha.core.FixedAddr \ -enable-checker alpha.core.IdenticalExpr \ -enable-checker alpha.core.PointerArithm \ -enable-checker alpha.core.PointerSub \ -enable-checker alpha.core.SizeofPtr \ -enable-checker alpha.core.TestAfterDivZero \ -enable-checker alpha.deadcode.UnreachableCode \ -enable-checker alpha.security.ArrayBoundV2 \ -enable-checker alpha.security.MallocOverflow \ -enable-checker alpha.security.ReturnPtrRange \ -enable-checker alpha.unix.PthreadLock \ -enable-checker alpha.unix.Stream \ -enable-checker alpha.unix.cstring.BufferOverlap \ -enable-checker alpha.unix.cstring.NotNullTerminated \ -enable-checker alpha.unix.cstring.OutOfBounds \ -enable-checker nullability.NullableDereferenced \ -enable-checker optin.performance.Padding \ -enable-checker security.insecureAPI.rand \ -enable-checker security.insecureAPI.strcpy \ --use-cc=clang-10 \ --use-c++=clang++-10 \ -o ./scanbuildout/ \ make \ -j8"><pre><span class="pl-c"><span class="pl-c">#</span> must exist</span> ccc-analyzer -v <span class="pl-c"><span class="pl-c">#</span> must exist</span> c++-analyzer -v <span class="pl-c"><span class="pl-c">#</span> must exist</span> scan-build -v <span class="pl-k">export</span> VERBOSE=1 <span class="pl-k">export</span> CONAN_REVISIONS_ENABLED=1 <span class="pl-k">export</span> CONAN_VERBOSE_TRACEBACK=1 <span class="pl-k">export</span> CONAN_PRINT_RUN_COMMANDS=1 <span class="pl-k">export</span> CONAN_LOGGING_LEVEL=10 cmake -E <span class="pl-k">time</span> \ conan install <span class="pl-c1">.</span> \ --install-folder local_build_scan_build \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --profile clang12_compiler \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True cmake -E <span class="pl-k">time</span> \ conan <span class="pl-c1">source</span> <span class="pl-c1">.</span> \ --source-folder local_build_scan_build \ --install-folder local_build_scan_build <span class="pl-c"><span class="pl-c">#</span> see section about `conan editable mode`</span> <span class="pl-c1">cd</span> local_build_scan_build <span class="pl-c"><span class="pl-c">#</span> NOTE: change `build_type=Debug` to `build_type=Release` in production</span> <span class="pl-k">export</span> build_type=Debug <span class="pl-c"><span class="pl-c">#</span> optional</span> <span class="pl-c"><span class="pl-c">#</span> remove old CMakeCache</span> (rm CMakeCache.txt <span class="pl-k">||</span> true) <span class="pl-c"><span class="pl-c">#</span> NOTE: changed CMAKE_C_COMPILER to ccc-analyzer (!!!)</span> <span class="pl-c"><span class="pl-c">#</span> configure via cmake</span> scan-build \ --use-cc=clang-10 \ --use-c++=clang++-10 \ -o ./scanbuildout/ \ cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DCMAKE_C_COMPILER=ccc-analyzer \ -DCMAKE_CXX_COMPILER=c++-analyzer \ -DENABLE_TESTS=FALSE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=OFF \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=<span class="pl-smi">${build_type}</span> <span class="pl-c"><span class="pl-c">#</span> remove old build artifacts</span> (make clean <span class="pl-k">||</span> true) rm -rf bin <span class="pl-c"><span class="pl-c">#</span> NOTE: requires project configured in debug build</span> <span class="pl-c"><span class="pl-c">#</span> disable other static analyzers</span> <span class="pl-c"><span class="pl-c">#</span> run from build directory</span> scan-build \ -maxloop 8 \ -enable-checker alpha.security.taint.TaintPropagation \ -enable-checker alpha.core.BoolAssignment \ -enable-checker alpha.core.CastSize \ -enable-checker alpha.core.DynamicTypeChecker \ -enable-checker alpha.core.FixedAddr \ -enable-checker alpha.core.IdenticalExpr \ -enable-checker alpha.core.PointerArithm \ -enable-checker alpha.core.PointerSub \ -enable-checker alpha.core.SizeofPtr \ -enable-checker alpha.core.TestAfterDivZero \ -enable-checker alpha.deadcode.UnreachableCode \ -enable-checker alpha.security.ArrayBoundV2 \ -enable-checker alpha.security.MallocOverflow \ -enable-checker alpha.security.ReturnPtrRange \ -enable-checker alpha.unix.PthreadLock \ -enable-checker alpha.unix.Stream \ -enable-checker alpha.unix.cstring.BufferOverlap \ -enable-checker alpha.unix.cstring.NotNullTerminated \ -enable-checker alpha.unix.cstring.OutOfBounds \ -enable-checker nullability.NullableDereferenced \ -enable-checker optin.performance.Padding \ -enable-checker security.insecureAPI.rand \ -enable-checker security.insecureAPI.strcpy \ --use-cc=clang-10 \ --use-c++=clang++-10 \ -o ./scanbuildout/ \ make \ -j8</pre></div> <p dir="auto">Open resulting <code>scanbuildout/...../index.html</code> file</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: cppclean</h2><a id="user-content-for-contibutors-cppclean" class="anchor" aria-label="Permalink: For contibutors: cppclean" href="#for-contibutors-cppclean"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Make sure you use <code>Debug</code> build with <code>-e flextool:enable_llvm_tools=True</code></p> <p dir="auto">For details, see: <a href="https://github.com/myint/cppclean">https://github.com/myint/cppclean</a></p> <p dir="auto">Installation:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="pip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade cppclean"><pre>pip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade cppclean</pre></div> <p dir="auto">Usage (runs cmake with <code>-DENABLE_CPPCLEAN=ON</code>):</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# creates local build in separate folder and runs cmake targets cmake -DCPPCLEAN="ON" -DCLEAN_OLD="ON" -P tools/run_tool.cmake"><pre><span class="pl-c"><span class="pl-c">#</span> creates local build in separate folder and runs cmake targets</span> cmake -DCPPCLEAN=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -DCLEAN_OLD=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -P tools/run_tool.cmake</pre></div> <p dir="auto">NOTE: cppclean requires file encoding to be: <code>UTF-8 without BOM</code> (ascii)</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: IWYU</h2><a id="user-content-for-contibutors-iwyu" class="anchor" aria-label="Permalink: For contibutors: IWYU" href="#for-contibutors-iwyu"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Make sure you use <code>Debug</code> build with <code>-e flextool:enable_llvm_tools=True</code></p> <p dir="auto">include-what-you-use (IWYU) is a project intended to optimise includes.</p> <p dir="auto">It will calculate the required headers and add / remove includes as appropriate.</p> <p dir="auto">For details, see: <a href="https://include-what-you-use.org/" rel="nofollow">https://include-what-you-use.org/</a></p> <p dir="auto">Usage (runs cmake with <code>-DENABLE_IWYU=ON</code>):</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# creates local build in separate folder and runs cmake targets cmake -DIWYU="ON" -DCLEAN_OLD="ON" -P tools/run_tool.cmake"><pre><span class="pl-c"><span class="pl-c">#</span> creates local build in separate folder and runs cmake targets</span> cmake -DIWYU=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -DCLEAN_OLD=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -P tools/run_tool.cmake</pre></div> <p dir="auto">CODESTYLE: use <code>// IWYU pragma: associated</code> in C++ source files.</p> <p dir="auto">NOTE: Read about IWYU Pragmas: <a href="https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUPragmas.md">https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUPragmas.md</a></p> <p dir="auto">NOTE: don't use "bits/" or "/details/*" includes, add them to mappings file (.imp)</p> <p dir="auto">For details, see:</p> <ul dir="auto"> <li><a href="https://llvm.org/devmtg/2010-11/Silverstein-IncludeWhatYouUse.pdf" rel="nofollow">https://llvm.org/devmtg/2010-11/Silverstein-IncludeWhatYouUse.pdf</a></li> <li><a href="https://github.com/include-what-you-use/include-what-you-use/tree/master/docs">https://github.com/include-what-you-use/include-what-you-use/tree/master/docs</a></li> <li><a href="https://github.com/hdclark/Ygor/blob/master/artifacts/20180225_include-what-you-use/iwyu_how-to.txt">https://github.com/hdclark/Ygor/blob/master/artifacts/20180225_include-what-you-use/iwyu_how-to.txt</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: ccache</h2><a id="user-content-for-contibutors-ccache" class="anchor" aria-label="Permalink: For contibutors: ccache" href="#for-contibutors-ccache"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Use <code>-DUSE_CCACHE=ON</code></p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="gcc -v export CC=gcc export CXX=g++ # NOTE: -DUSE_CCACHE=ON cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DUSE_CCACHE=ON \ -DENABLE_TESTS=FALSE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=OFF \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=Debug"><pre>gcc -v <span class="pl-k">export</span> CC=gcc <span class="pl-k">export</span> CXX=g++ <span class="pl-c"><span class="pl-c">#</span> NOTE: -DUSE_CCACHE=ON</span> cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DUSE_CCACHE=ON \ -DENABLE_TESTS=FALSE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=OFF \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=Debug</pre></div> <p dir="auto">For details, see: <a href="https://www.virag.si/2015/07/use-ccache-with-cmake-for-faster-compilation/" rel="nofollow">https://www.virag.si/2015/07/use-ccache-with-cmake-for-faster-compilation/</a></p> <p dir="auto">To get the most out of ccache, put something like this in: <code>~/.ccache/ccache.conf</code>:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="max_size = 50.0G # or whatever cache size you prefer; default is 5G; 0 means unlimited base_dir = /home/yourname # or wherever you keep your source files"><pre>max_size = 50.0G <span class="pl-c"><span class="pl-c">#</span> or whatever cache size you prefer; default is 5G; 0 means unlimited</span> base_dir = /home/yourname <span class="pl-c"><span class="pl-c">#</span> or wherever you keep your source files</span></pre></div> <p dir="auto">Note: <code>base_dir</code> is required for ccache to share cached compiles of the same file across different repositories / paths; it will only do this for paths under <code>base_dir</code>. So this option is required for effective use of ccache with git worktrees (described below).</p> <p dir="auto">You must not set <code>base_dir</code> to "/", or anywhere that contains system headers (according to the ccache docs).</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: GOLD linker</h2><a id="user-content-for-contibutors-gold-linker" class="anchor" aria-label="Permalink: For contibutors: GOLD linker" href="#for-contibutors-gold-linker"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Installation:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="sudo apt-get install ccache # On OS X use homebrew: # brew install ccache ccache --version"><pre>sudo apt-get install ccache <span class="pl-c"><span class="pl-c">#</span> On OS X use homebrew:</span> <span class="pl-c"><span class="pl-c">#</span> brew install ccache</span> ccache --version</pre></div> <p dir="auto">Use <code>-DUSE_LD_GOLD=ON</code></p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="gcc -v export CC=gcc export CXX=g++ # NOTE: -DUSE_LD_GOLD=ON cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DUSE_LD_GOLD=ON \ -DENABLE_TESTS=FALSE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=OFF \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=Debug"><pre>gcc -v <span class="pl-k">export</span> CC=gcc <span class="pl-k">export</span> CXX=g++ <span class="pl-c"><span class="pl-c">#</span> NOTE: -DUSE_LD_GOLD=ON</span> cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DUSE_LD_GOLD=ON \ -DENABLE_TESTS=FALSE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=OFF \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=Debug</pre></div> <p dir="auto">For details, see: <a href="https://cristianadam.eu/20170709/speeding-up-cmake/" rel="nofollow">https://cristianadam.eu/20170709/speeding-up-cmake/</a></p> <p dir="auto">NOTE: gold not threaded by default, configure with "--enable-threads"</p> <p dir="auto">NOTE: lld threaded by default, may be faster than gold</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: oclint</h2><a id="user-content-for-contibutors-oclint" class="anchor" aria-label="Permalink: For contibutors: oclint" href="#for-contibutors-oclint"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Make sure you use <code>Debug</code> build with <code>-e flextool:enable_llvm_tools=True</code></p> <p dir="auto">For details, see: <a href="https://oclint-docs.readthedocs.io/en/stable/devel/codingstandards.html" rel="nofollow">https://oclint-docs.readthedocs.io/en/stable/devel/codingstandards.html</a></p> <p dir="auto">Installation:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cd ~ wget --no-check-certificate https://github.com/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz # mirror 1: http://github.strcpy.cn/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz # mirror 2: http://archives.oclint.org/releases/0.8/oclint-0.8.1-x86_64-linux-3.13.0-35-generic.tar.gz tar -xzvf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz rm -rf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz export OCLINT_HOME=~/oclint-0.13.1 export PATH=$OCLINT_HOME/bin:$PATH oclint -version"><pre><span class="pl-c1">cd</span> <span class="pl-k">~</span> wget --no-check-certificate https://github.com/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz <span class="pl-c"><span class="pl-c">#</span> mirror 1: http://github.strcpy.cn/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz</span> <span class="pl-c"><span class="pl-c">#</span> mirror 2: http://archives.oclint.org/releases/0.8/oclint-0.8.1-x86_64-linux-3.13.0-35-generic.tar.gz</span> tar -xzvf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz rm -rf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz <span class="pl-k">export</span> OCLINT_HOME=<span class="pl-k">~</span>/oclint-0.13.1 <span class="pl-k">export</span> PATH=<span class="pl-smi">$OCLINT_HOME</span>/bin:<span class="pl-smi">$PATH</span> oclint -version</pre></div> <p dir="auto">Usage (runs cmake with <code>-DENABLE_OCLINT=ON</code>):</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# NOTE: -DCLEAN_OLD="OFF" to keep generated html report # creates local build in separate folder and runs cmake targets cmake -DOCLINT="ON" -DCLEAN_OLD="OFF" -P tools/run_tool.cmake"><pre><span class="pl-c"><span class="pl-c">#</span> NOTE: -DCLEAN_OLD="OFF" to keep generated html report</span> <span class="pl-c"><span class="pl-c">#</span> creates local build in separate folder and runs cmake targets</span> cmake -DOCLINT=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -DCLEAN_OLD=<span class="pl-s"><span class="pl-pds">"</span>OFF<span class="pl-pds">"</span></span> -P tools/run_tool.cmake</pre></div> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# `report.html` must exist # find $PWD -name report.html"><pre><span class="pl-c"><span class="pl-c">#</span> `report.html` must exist</span> <span class="pl-c"><span class="pl-c">#</span> find $PWD -name report.html</span></pre></div> <p dir="auto">Open report.html</p> <p dir="auto">See oclint tutorial: <a href="http://docs.oclint.org/en/stable/intro/tutorial.html" rel="nofollow">http://docs.oclint.org/en/stable/intro/tutorial.html</a></p> <p dir="auto">See list of oclint rules at: <a href="https://oclint-docs.readthedocs.io/en/stable/rules/" rel="nofollow">https://oclint-docs.readthedocs.io/en/stable/rules/</a></p> <p dir="auto">NOTE: you can suppress oclint warnings <a href="http://docs.oclint.org/en/stable/howto/suppress.html#oclint-comment" rel="nofollow">http://docs.oclint.org/en/stable/howto/suppress.html#oclint-comment</a></p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: clang-format</h2><a id="user-content-for-contibutors-clang-format" class="anchor" aria-label="Permalink: For contibutors: clang-format" href="#for-contibutors-clang-format"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">For details, see: <a href="https://clang.llvm.org/docs/ClangFormat.html" rel="nofollow">https://clang.llvm.org/docs/ClangFormat.html</a></p> <p dir="auto">Usage (runs cmake with <code>-DENABLE_CLANG_FORMAT=ON</code>):</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# creates local build in separate folder and runs cmake targets cmake -DCLANG_FORMAT="ON" -DCLEAN_OLD="ON" -P tools/run_tool.cmake"><pre><span class="pl-c"><span class="pl-c">#</span> creates local build in separate folder and runs cmake targets</span> cmake -DCLANG_FORMAT=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -DCLEAN_OLD=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -P tools/run_tool.cmake</pre></div> <p dir="auto">We use <code>.clang-format</code> file. For details, see: <a href="https://clang.llvm.org/docs/ClangFormatStyleOptions.html" rel="nofollow">https://clang.llvm.org/docs/ClangFormatStyleOptions.html</a></p> <p dir="auto">NOTE: we use <code>DisableFormat</code>, so clang-format will change only include order based on <code>SortIncludes</code>.</p> <p dir="auto">Unfortunately, <code>clang-format</code> is not configurable enough, so it can be used only to sort includes. See: <a href="https://stackoverflow.com/a/32191189" rel="nofollow">https://stackoverflow.com/a/32191189</a></p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: uncrustify</h2><a id="user-content-for-contibutors-uncrustify" class="anchor" aria-label="Permalink: For contibutors: uncrustify" href="#for-contibutors-uncrustify"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">We use uncrustify bacause clang-format and astyle <a href="https://dev.to/voins/does-anybody-know-a-good-working-c-formatting-tool-2lpi" rel="nofollow">do not support a lot of options</a>.</p> <p dir="auto">For details, see: <a href="https://patrickhenson.com/2018/06/07/uncrustify-configuration.html" rel="nofollow">https://patrickhenson.com/2018/06/07/uncrustify-configuration.html</a></p> <p dir="auto">Installation:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cd ~ git clone https://github.com/uncrustify/uncrustify.git cd uncrustify mkdir build cd build cmake -DCMAKE_BUILD_TYPE=Release .. cmake --build . export UNCRUSTIFY_HOME=~/uncrustify/build export PATH=$UNCRUSTIFY_HOME:$PATH # OR sudo make install uncrustify --version"><pre><span class="pl-c1">cd</span> <span class="pl-k">~</span> git clone https://github.com/uncrustify/uncrustify.git <span class="pl-c1">cd</span> uncrustify mkdir build <span class="pl-c1">cd</span> build cmake -DCMAKE_BUILD_TYPE=Release .. cmake --build <span class="pl-c1">.</span> <span class="pl-k">export</span> UNCRUSTIFY_HOME=<span class="pl-k">~</span>/uncrustify/build <span class="pl-k">export</span> PATH=<span class="pl-smi">$UNCRUSTIFY_HOME</span>:<span class="pl-smi">$PATH</span> <span class="pl-c"><span class="pl-c">#</span> OR sudo make install</span> uncrustify --version</pre></div> <p dir="auto">Usage (runs cmake with <code>-DENABLE_UNCRUSTIFY=ON</code>):</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# creates local build in separate folder and runs cmake targets cmake -DUNCRUSTIFY="ON" -DCLEAN_OLD="ON" -P tools/run_tool.cmake"><pre><span class="pl-c"><span class="pl-c">#</span> creates local build in separate folder and runs cmake targets</span> cmake -DUNCRUSTIFY=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -DCLEAN_OLD=<span class="pl-s"><span class="pl-pds">"</span>ON<span class="pl-pds">"</span></span> -P tools/run_tool.cmake</pre></div> <p dir="auto">We use <code>uncrustify.cfg</code> file. For details, see: <a href="https://patrickhenson.com/2018/06/07/uncrustify-configuration.html" rel="nofollow">https://patrickhenson.com/2018/06/07/uncrustify-configuration.html</a></p> <p dir="auto">To get a list of all available options use:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="uncrustify --show-config"><pre>uncrustify --show-config</pre></div> <p dir="auto">Uncrustify has a lot of configurable options. You'll probably need Universal Indent GUI (in Konstantin's reply) as well to configure it: <a href="http://universalindent.sourceforge.net/" rel="nofollow">http://universalindent.sourceforge.net/</a></p> <p dir="auto">Use comments containing <code>/* *INDENT-OFF* */</code> and <code>/* *INDENT-ON* */</code> to disable processing of parts of the source file.</p> <p dir="auto">See <code>disable_processing_cmt</code> from <code>uncrustify.cfg</code>:</p> <div class="highlight highlight-source-ini notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Specify the marker used in comments to disable processing of part of the # file. # The comment should be used alone in one line. # # Default: *INDENT-OFF* disable_processing_cmt = " *INDENT-OFF*" # string # Specify the marker used in comments to (re)enable processing in a file. # The comment should be used alone in one line. # # Default: *INDENT-ON* enable_processing_cmt = " *INDENT-ON*" # string"><pre><span class="pl-c"><span class="pl-c">#</span> Specify the marker used in comments to disable processing of part of the</span> <span class="pl-c"><span class="pl-c">#</span> file.</span> <span class="pl-c"><span class="pl-c">#</span> The comment should be used alone in one line.</span> <span class="pl-c"><span class="pl-c">#</span></span> <span class="pl-c"><span class="pl-c">#</span> Default: *INDENT-OFF*</span> <span class="pl-k">disable_processing_cmt</span> = <span class="pl-s"><span class="pl-pds">"</span> *INDENT-OFF*<span class="pl-pds">"</span></span> <span class="pl-c"><span class="pl-c">#</span> string</span> <span class="pl-c"><span class="pl-c">#</span> Specify the marker used in comments to (re)enable processing in a file.</span> <span class="pl-c"><span class="pl-c">#</span> The comment should be used alone in one line.</span> <span class="pl-c"><span class="pl-c">#</span></span> <span class="pl-c"><span class="pl-c">#</span> Default: *INDENT-ON*</span> <span class="pl-k">enable_processing_cmt</span> = <span class="pl-s"><span class="pl-pds">"</span> *INDENT-ON*<span class="pl-pds">"</span></span> <span class="pl-c"><span class="pl-c">#</span> string</span></pre></div> <p dir="auto">You can integrate <code>uncrustify</code> with IDE:</p> <ul dir="auto"> <li>QT Creator: <a href="https://doc.qt.io/qtcreator/creator-beautifier.html" rel="nofollow">https://doc.qt.io/qtcreator/creator-beautifier.html</a></li> <li>Visual Studio Code: <a href="https://marketplace.visualstudio.com/items?itemName=LaurentTreguier.uncrustify" rel="nofollow">https://marketplace.visualstudio.com/items?itemName=LaurentTreguier.uncrustify</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">HOW TO BUILD WITH SANITIZERS ENABLED</h2><a id="user-content-how-to-build-with-sanitizers-enabled" class="anchor" aria-label="Permalink: HOW TO BUILD WITH SANITIZERS ENABLED" href="#how-to-build-with-sanitizers-enabled"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">See <a href="https://github.com/blockspacer/llvm_9_installer#how-to-use-with-sanitizers">https://github.com/blockspacer/llvm_9_installer#how-to-use-with-sanitizers</a></p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: build using clang 10 from conan</h2><a id="user-content-for-contibutors-build-using-clang-10-from-conan" class="anchor" aria-label="Permalink: For contibutors: build using clang 10 from conan" href="#for-contibutors-build-using-clang-10-from-conan"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Requires <code>enable_llvm_tools=True</code>, <code>compile_with_llvm_tools=True</code>, and <code>llvm_tools:build_type=Release</code>:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="-s llvm_tools:build_type=Release \ -e flextool:enable_llvm_tools=True \ -e flextool:compile_with_llvm_tools=True \ -o llvm_tools:include_what_you_use=True \ ..."><pre>-s llvm_tools:build_type=Release \ -e flextool:enable_llvm_tools=True \ -e flextool:compile_with_llvm_tools=True \ -o llvm_tools:include_what_you_use=True \ ...</pre></div> <ul dir="auto"> <li><code>enable_llvm_tools</code> installs clang 10 from conan</li> <li><code>compile_with_llvm_tools</code> sets cmake variables required to use clang 10 from conan</li> </ul> <p dir="auto">Run <code>conan install</code> or <code>conan create</code> with:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# OR create conan profile https://docs.conan.io/en/latest/reference/profiles.html -s compiler=clang \ -s compiler.version=10 \ -s compiler.libcxx=libc++"><pre><span class="pl-c"><span class="pl-c">#</span> OR create conan profile https://docs.conan.io/en/latest/reference/profiles.html</span> -s compiler=clang \ -s compiler.version=10 \ -s compiler.libcxx=libc++</pre></div> <p dir="auto">NOTE: Change of compiler may require rebuild of all deps (<code>--build=missing</code>).</p> <p dir="auto">Example in case of local build:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="export CC=$(find ~/.conan/data/llvm_tools/master/conan/stable/package/ -path "*bin/clang" | head -n 1) export CXX=$(find ~/.conan/data/llvm_tools/master/conan/stable/package/ -path "*bin/clang++" | head -n 1) export VERBOSE=1 export CONAN_REVISIONS_ENABLED=1 export CONAN_VERBOSE_TRACEBACK=1 export CONAN_PRINT_RUN_COMMANDS=1 export CONAN_LOGGING_LEVEL=10 # NOTE: NO `--profile` argument cause we use `CXX` env. var # NOTE: you may want to re-build `cling_conan` with clang 10 cmake -E time \ conan install . \ --install-folder local_build_clang_10 \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --build missing \ --build cascade \ -s cling_conan:compiler=clang \ -s cling_conan:compiler.version=10 \ -s cling_conan:compiler.libcxx=libstdc++11 \ -o llvm_tools:include_what_you_use=True \ -s llvm_tools:compiler=clang \ -s llvm_tools:compiler.version=10 \ -s llvm_tools:compiler.libcxx=libstdc++11 \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True \ -e flextool:compile_with_llvm_tools=True \ -e boost:enable_llvm_tools=True \ -e boost:compile_with_llvm_tools=True \ -s compiler=clang \ -s compiler.version=10 \ -s compiler.libcxx=libc++ cmake -E time \ conan source . \ --source-folder local_build_clang_10 \ --install-folder local_build_clang_10 # remove old CMakeCache (rm local_build_clang_10/CMakeCache.txt || true) # see section about `conan editable mode` conan build . \ --build-folder local_build_clang_10 \ --source-folder local_build_clang_10 \ --install-folder local_build_clang_10"><pre><span class="pl-k">export</span> CC=<span class="pl-s"><span class="pl-pds">$(</span>find <span class="pl-k">~</span>/.conan/data/llvm_tools/master/conan/stable/package/ -path <span class="pl-s"><span class="pl-pds">"</span>*bin/clang<span class="pl-pds">"</span></span> <span class="pl-k">|</span> head -n 1<span class="pl-pds">)</span></span> <span class="pl-k">export</span> CXX=<span class="pl-s"><span class="pl-pds">$(</span>find <span class="pl-k">~</span>/.conan/data/llvm_tools/master/conan/stable/package/ -path <span class="pl-s"><span class="pl-pds">"</span>*bin/clang++<span class="pl-pds">"</span></span> <span class="pl-k">|</span> head -n 1<span class="pl-pds">)</span></span> <span class="pl-k">export</span> VERBOSE=1 <span class="pl-k">export</span> CONAN_REVISIONS_ENABLED=1 <span class="pl-k">export</span> CONAN_VERBOSE_TRACEBACK=1 <span class="pl-k">export</span> CONAN_PRINT_RUN_COMMANDS=1 <span class="pl-k">export</span> CONAN_LOGGING_LEVEL=10 <span class="pl-c"><span class="pl-c">#</span> NOTE: NO `--profile` argument cause we use `CXX` env. var</span> <span class="pl-c"><span class="pl-c">#</span> NOTE: you may want to re-build `cling_conan` with clang 10</span> cmake -E <span class="pl-k">time</span> \ conan install <span class="pl-c1">.</span> \ --install-folder local_build_clang_10 \ -s build_type=Debug \ -s cling_conan:build_type=Release \ -s llvm_tools:build_type=Release \ --build missing \ --build cascade \ -s cling_conan:compiler=clang \ -s cling_conan:compiler.version=10 \ -s cling_conan:compiler.libcxx=libstdc++11 \ -o llvm_tools:include_what_you_use=True \ -s llvm_tools:compiler=clang \ -s llvm_tools:compiler.version=10 \ -s llvm_tools:compiler.libcxx=libstdc++11 \ -e flextool:enable_tests=True \ -e flextool:enable_llvm_tools=True \ -e flextool:compile_with_llvm_tools=True \ -e boost:enable_llvm_tools=True \ -e boost:compile_with_llvm_tools=True \ -s compiler=clang \ -s compiler.version=10 \ -s compiler.libcxx=libc++ cmake -E <span class="pl-k">time</span> \ conan <span class="pl-c1">source</span> <span class="pl-c1">.</span> \ --source-folder local_build_clang_10 \ --install-folder local_build_clang_10 <span class="pl-c"><span class="pl-c">#</span> remove old CMakeCache</span> (rm local_build_clang_10/CMakeCache.txt <span class="pl-k">||</span> true) <span class="pl-c"><span class="pl-c">#</span> see section about `conan editable mode`</span> conan build <span class="pl-c1">.</span> \ --build-folder local_build_clang_10 \ --source-folder local_build_clang_10 \ --install-folder local_build_clang_10</pre></div> <p dir="auto">Perform checks:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# check that `libcpp` symbol exists nm -an EXECUTABLE_PATH | grep libcpp # list linked dynamic libs ldd EXECUTABLE_PATH"><pre><span class="pl-c"><span class="pl-c">#</span> check that `libcpp` symbol exists</span> nm -an EXECUTABLE_PATH <span class="pl-k">|</span> grep libcpp <span class="pl-c"><span class="pl-c">#</span> list linked dynamic libs</span> ldd EXECUTABLE_PATH</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: doxygen</h2><a id="user-content-for-contibutors-doxygen" class="anchor" aria-label="Permalink: For contibutors: doxygen" href="#for-contibutors-doxygen"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><code>MCSS_ROOT_DIR_FOR_DOCS</code> must point to <code>m.css</code> sources like below:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cd ~ git clone https://github.com/mosra/m.css.git pip3 install jinja2 Pygments sudo apt install \ texlive-base \ texlive-latex-extra \ texlive-fonts-extra \ texlive-fonts-recommended sudo apt-get install doxygen sudo apt install python3-pip # /usr/bin/python must point to python3 /usr/bin/python --version # NOTE: switch to python3 for doxygen or use -DPYTHON_EXECUTABLE=/usr/bin/python3 alias python='/usr/bin/python3' # You may need sudo here pip3 install jinja2 Pygments sudo apt install \ texlive-base \ texlive-latex-extra \ texlive-fonts-extra \ texlive-fonts-recommended"><pre><span class="pl-c1">cd</span> <span class="pl-k">~</span> git clone https://github.com/mosra/m.css.git pip3 install jinja2 Pygments sudo apt install \ texlive-base \ texlive-latex-extra \ texlive-fonts-extra \ texlive-fonts-recommended sudo apt-get install doxygen sudo apt install python3-pip <span class="pl-c"><span class="pl-c">#</span> /usr/bin/python must point to python3</span> /usr/bin/python --version <span class="pl-c"><span class="pl-c">#</span> NOTE: switch to python3 for doxygen or use -DPYTHON_EXECUTABLE=/usr/bin/python3</span> <span class="pl-c1">alias</span> python=<span class="pl-s"><span class="pl-pds">'</span>/usr/bin/python3<span class="pl-pds">'</span></span> <span class="pl-c"><span class="pl-c">#</span> You may need sudo here</span> pip3 install jinja2 Pygments sudo apt install \ texlive-base \ texlive-latex-extra \ texlive-fonts-extra \ texlive-fonts-recommended</pre></div> <p dir="auto">Use cmake build with '--target doxyDoc' and <code>-DBUILD_DOXY_DOC=ON</code></p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="cd ~/flextool # see section about `conan editable mode` cd local_build_clang_10 # optional # remove old CMakeCache (rm CMakeCache.txt || true) # remove old build artifacts rm -rf flextool rm -rf bin find . -iname '*.o' -exec rm {} \; find . -iname '*.a' -exec rm {} \; find . -iname '*.dll' -exec rm {} \; find . -iname '*.lib' -exec rm {} \; # remove old build docs rm -rf doc-mcss rm -rf docs cmake -E make_directory "doc-mcss" # NOTE: you can change python version like so: -DPYTHON_EXECUTABLE=/usr/bin/python3 cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DMCSS_ROOT_DIR_FOR_DOCS=$HOME/m.css \ -DPYTHON_EXECUTABLE=/usr/bin/python3 \ -DENABLE_TESTS=TRUE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=ON \ -DBUILD_DOXY_DOC=ON \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=Debug \ -DDOXY_ROOT_DIR=$PWD/doc-mcss \ -DDOXY_DOC_COMMON_IMG_PATH=$PWD/.. \ -DPROJECT_SOURCES_DIR_FOR_DOCS=$PWD/../src cmake -E time cmake --build . \ --target doxyDoc_notheme cmake -E time cmake --build . \ --target doxyDoc # Use to find index.html find $PWD -name *.html"><pre><span class="pl-c1">cd</span> <span class="pl-k">~</span>/flextool <span class="pl-c"><span class="pl-c">#</span> see section about `conan editable mode`</span> <span class="pl-c1">cd</span> local_build_clang_10 <span class="pl-c"><span class="pl-c">#</span> optional</span> <span class="pl-c"><span class="pl-c">#</span> remove old CMakeCache</span> (rm CMakeCache.txt <span class="pl-k">||</span> true) <span class="pl-c"><span class="pl-c">#</span> remove old build artifacts</span> rm -rf flextool rm -rf bin find <span class="pl-c1">.</span> -iname <span class="pl-s"><span class="pl-pds">'</span>*.o<span class="pl-pds">'</span></span> -exec rm {} <span class="pl-cce">\;</span> find <span class="pl-c1">.</span> -iname <span class="pl-s"><span class="pl-pds">'</span>*.a<span class="pl-pds">'</span></span> -exec rm {} <span class="pl-cce">\;</span> find <span class="pl-c1">.</span> -iname <span class="pl-s"><span class="pl-pds">'</span>*.dll<span class="pl-pds">'</span></span> -exec rm {} <span class="pl-cce">\;</span> find <span class="pl-c1">.</span> -iname <span class="pl-s"><span class="pl-pds">'</span>*.lib<span class="pl-pds">'</span></span> -exec rm {} <span class="pl-cce">\;</span> <span class="pl-c"><span class="pl-c">#</span> remove old build docs</span> rm -rf doc-mcss rm -rf docs cmake -E make_directory <span class="pl-s"><span class="pl-pds">"</span>doc-mcss<span class="pl-pds">"</span></span> <span class="pl-c"><span class="pl-c">#</span> NOTE: you can change python version like so: -DPYTHON_EXECUTABLE=/usr/bin/python3</span> cmake .. \ -DCMAKE_VERBOSE_MAKEFILE=TRUE \ -DMCSS_ROOT_DIR_FOR_DOCS=<span class="pl-smi">$HOME</span>/m.css \ -DPYTHON_EXECUTABLE=/usr/bin/python3 \ -DENABLE_TESTS=TRUE \ -DBASE_NEED_GEN_BUILD_DATE=FALSE \ -DENABLE_DOCTEST=ON \ -DBUILD_DOXY_DOC=ON \ -DBUILD_SHARED_LIBS=FALSE \ -DCONAN_AUTO_INSTALL=OFF \ -DCMAKE_BUILD_TYPE=Debug \ -DDOXY_ROOT_DIR=<span class="pl-smi">$PWD</span>/doc-mcss \ -DDOXY_DOC_COMMON_IMG_PATH=<span class="pl-smi">$PWD</span>/.. \ -DPROJECT_SOURCES_DIR_FOR_DOCS=<span class="pl-smi">$PWD</span>/../src cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --target doxyDoc_notheme cmake -E <span class="pl-k">time</span> cmake --build <span class="pl-c1">.</span> \ --target doxyDoc <span class="pl-c"><span class="pl-c">#</span> Use to find index.html</span> find <span class="pl-smi">$PWD</span> -name <span class="pl-k">*</span>.html</pre></div> <p dir="auto">Open doxyDoc/html/index.html</p> <p dir="auto">NOTE: Document namespaces in docs/namespaces.dox</p> <p dir="auto">NOTE: <a href="https://mcss.mosra.cz/doxygen/#troubleshooting" rel="nofollow">Files, directories and symbols with no documentation are not present in the output at all</a></p> <p dir="auto">Used <a href="https://mcss.mosra.cz/doxygen/" rel="nofollow">comments style</a>:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="/** * @brief Path utils * * Example usage: * * @code{.cpp} * const ::fs::path workdir = storage::getThisBinaryDirectoryPath(); * @endcode **/"><pre>/<span class="pl-k">**</span> <span class="pl-k">*</span> @brief Path utils <span class="pl-k">*</span> <span class="pl-k">*</span> Example usage: <span class="pl-k">*</span> <span class="pl-k">*</span> @code{.cpp} <span class="pl-k">*</span> const ::fs::path workdir = <span class="pl-en">storage::getThisBinaryDirectoryPath</span>(); <span class="pl-k">*</span> @endcode <span class="pl-k">**</span>/</pre></div> <p dir="auto">See:</p> <ul dir="auto"> <li><a href="http://www.agapow.net/programming/tools/doxygen-cheatsheet/" rel="nofollow">doxygen cheatsheet</a></li> <li><a href="https://doc.magnum.graphics/magnum/coding-style.html#coding-style-documentation" rel="nofollow">doxygen coding style</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: Fuzzing with AFL</h2><a id="user-content-for-contibutors-fuzzing-with-afl" class="anchor" aria-label="Permalink: For contibutors: Fuzzing with AFL" href="#for-contibutors-fuzzing-with-afl"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">For details, see: <a href="https://afl-1.readthedocs.io/en/latest/index.html" rel="nofollow">https://afl-1.readthedocs.io/en/latest/index.html</a></p> <p dir="auto">NOTE: prefer github.com/google/AFL or aflplus.plus to not updated AFL from <code>lcamtuf.coredump.cx/afl</code></p> <p dir="auto">Fuzzing is a Black Box software testing technique.</p> <p dir="auto">Fuzzing consists in finding implementation bugs using malformed/semi-malformed data injection in an automated fashion.</p> <p dir="auto">Fuzzer tries to modify the input so that it can reach as much lines of the program code as possible.</p> <p dir="auto">Therefore, fuzzing allows the discovery of vulnerabilities lying in code paths that are hard to reach by normal usage.</p> <p dir="auto">Install + compile the source code using following commands:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# optional # sudo apt-get update # optional # sudo apt-get -y install autoconf automake bison build-essential \ ca-certificates llvm-dev libtool libtool-bin \ libglib2.0-dev make nasm wget # Tested with clang 10 and gcc 7 sudo apt-get -y install clang-10 g++-7 gcc-7 export CXX=g++-7 export CC=gcc-7 export PATH=/usr/bin/:$PATH $CC -v # llvm-config binary that coresponds to the same clang you are using to compile export LLVM_CONFIG=/usr/bin/llvm-config-10 $LLVM_CONFIG --cxxflags cd ~ git clone -b v2.56b https://github.com/google/AFL.git --recursive # NOTE: original AFL not updated since November 2017, # so prefer `google/AFL.git` to `lcamtuf.coredump.cx/afl` # wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz # tar -xf afl-latest.tgz # rm afl-latest.tgz # cd afl* cd AFL make # build llvm using the sample compiler as afl code uses # see https://groups.google.com/forum/#!topic/afl-users/1WqZpGXvYY0 make \ -C llvm_mode \ LLVM_CONFIG=$LLVM_CONFIG \ CC=clang-10 \ CXX=clang++-10 # # optional # cd qemu_mode # ./build_qemu_support.sh # cd .. # make \ -C libdislocator make \ -C libtokencap sudo make install # OR add to PATH via export PATH=$PATH:... # do not forget to reset CC and LLVM_CONFIG unset CXX unset CC unset LLVM_CONFIG"><pre><span class="pl-c"><span class="pl-c">#</span> optional</span> <span class="pl-c"><span class="pl-c">#</span> sudo apt-get update</span> <span class="pl-c"><span class="pl-c">#</span> optional</span> <span class="pl-c"><span class="pl-c">#</span> sudo apt-get -y install autoconf automake bison build-essential \</span> ca-certificates llvm-dev libtool libtool-bin \ libglib2.0-dev make nasm wget <span class="pl-c"><span class="pl-c">#</span> Tested with clang 10 and gcc 7</span> sudo apt-get -y install clang-10 g++-7 gcc-7 <span class="pl-k">export</span> CXX=g++-7 <span class="pl-k">export</span> CC=gcc-7 <span class="pl-k">export</span> PATH=/usr/bin/:<span class="pl-smi">$PATH</span> <span class="pl-smi">$CC</span> -v <span class="pl-c"><span class="pl-c">#</span> llvm-config binary that coresponds to the same clang you are using to compile</span> <span class="pl-k">export</span> LLVM_CONFIG=/usr/bin/llvm-config-10 <span class="pl-smi">$LLVM_CONFIG</span> --cxxflags <span class="pl-c1">cd</span> <span class="pl-k">~</span> git clone -b v2.56b https://github.com/google/AFL.git --recursive <span class="pl-c"><span class="pl-c">#</span> NOTE: original AFL not updated since November 2017,</span> <span class="pl-c"><span class="pl-c">#</span> so prefer `google/AFL.git` to `lcamtuf.coredump.cx/afl`</span> <span class="pl-c"><span class="pl-c">#</span> wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz</span> <span class="pl-c"><span class="pl-c">#</span> tar -xf afl-latest.tgz</span> <span class="pl-c"><span class="pl-c">#</span> rm afl-latest.tgz</span> <span class="pl-c"><span class="pl-c">#</span> cd afl*</span> <span class="pl-c1">cd</span> AFL make <span class="pl-c"><span class="pl-c">#</span> build llvm using the sample compiler as afl code uses</span> <span class="pl-c"><span class="pl-c">#</span> see https://groups.google.com/forum/#!topic/afl-users/1WqZpGXvYY0</span> make \ -C llvm_mode \ LLVM_CONFIG=<span class="pl-smi">$LLVM_CONFIG</span> \ CC=clang-10 \ CXX=clang++-10 <span class="pl-c"><span class="pl-c">#</span></span> <span class="pl-c"><span class="pl-c">#</span> optional</span> <span class="pl-c"><span class="pl-c">#</span> cd qemu_mode</span> <span class="pl-c"><span class="pl-c">#</span> ./build_qemu_support.sh</span> <span class="pl-c"><span class="pl-c">#</span> cd ..</span> <span class="pl-c"><span class="pl-c">#</span></span> make \ -C libdislocator make \ -C libtokencap sudo make install <span class="pl-c"><span class="pl-c">#</span> OR add to PATH via export PATH=$PATH:...</span> <span class="pl-c"><span class="pl-c">#</span> do not forget to reset CC and LLVM_CONFIG</span> <span class="pl-c1">unset</span> CXX <span class="pl-c1">unset</span> CC <span class="pl-c1">unset</span> LLVM_CONFIG</pre></div> <p dir="auto">We compile code using the AFL compiler: <code>-DCMAKE_C_COMPILER=afl-clang-fast</code>, <code>-DCMAKE_CXX_COMPILER=afl-clang-fast++</code>, and <code>-DCMAKE_LINKER=afl-clang-fast</code>.</p> <p dir="auto">To verify if binary uses the AFL compiler: <code>nm BINARY_PATH | grep afl</code></p> <p dir="auto">To build application with some sanitizers and debug information enabled: (<code>-DENABLE_ASAN=ON</code> etc.):</p> <p dir="auto">NOTE: There are some things to consider when using Address Sanitizer. Even if ASan finds a memory access violation, it doesn't automatically crash the application. This is a problem when using automated fuzzing tools because they usually try to detect segfaults by checking the return code. We can, however, force ASan to crash software when an error happens with the environment variable ASAN_OPTIONS before fuzzing: <code>export ASAN_OPTIONS='abort_on_error=1'</code></p> <p dir="auto">NOTE: Disable custom memory allocation functions. This can hide memory access bugs and prevent the detection of memory access errors.</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# see https://afl-1.readthedocs.io/en/latest/instrumenting.html # Setting AFL_HARDEN automatically adds code hardening options # when invoking the downstream compiler. # This includes -D_FORTIFY_SOURCE=2 and -fstack-protector-all. # NOTE: _FORTIFY_SOURCE not compatible with ASAN # export AFL_HARDEN=1 # see https://aflplus.plus/docs/env_variables/ export AFL_EXIT_WHEN_DONE=1 # By default, the wrapper appends -O3 to optimize builds. export AFL_DONT_OPTIMIZE=1 # or AFL_USE_MSAN, etc. # READ https://aflplus.plus/docs/notes_for_asan/ NOTE: if you run several slaves only one should run the # target compiled with ASAN (and UBSAN, CFISAN), # the others should run the target with no sanitizers compiled in. export AFL_USE_UBSAN=1 export AFL_USE_ASAN=1 # AFL_PRELOAD causes AFL to set LD_PRELOAD for the target binary # without disrupting the afl-fuzz process itself. # This is useful, among other things, for bootstrapping libdislocator.so. # see __AFL_LOOP # export AFL_PERSISTENT=1 # make sure you compile app with `-fsanitize=address` or `-fsanitize=memory` etc."><pre><span class="pl-c"><span class="pl-c">#</span> see https://afl-1.readthedocs.io/en/latest/instrumenting.html</span> <span class="pl-c"><span class="pl-c">#</span> Setting AFL_HARDEN automatically adds code hardening options</span> <span class="pl-c"><span class="pl-c">#</span> when invoking the downstream compiler.</span> <span class="pl-c"><span class="pl-c">#</span> This includes -D_FORTIFY_SOURCE=2 and -fstack-protector-all.</span> <span class="pl-c"><span class="pl-c">#</span> NOTE: _FORTIFY_SOURCE not compatible with ASAN</span> <span class="pl-c"><span class="pl-c">#</span> export AFL_HARDEN=1</span> <span class="pl-c"><span class="pl-c">#</span> see https://aflplus.plus/docs/env_variables/</span> <span class="pl-k">export</span> AFL_EXIT_WHEN_DONE=1 <span class="pl-c"><span class="pl-c">#</span> By default, the wrapper appends -O3 to optimize builds.</span> <span class="pl-k">export</span> AFL_DONT_OPTIMIZE=1 <span class="pl-c"><span class="pl-c">#</span> or AFL_USE_MSAN, etc.</span> <span class="pl-c"><span class="pl-c">#</span> READ https://aflplus.plus/docs/notes_for_asan/</span> NOTE: <span class="pl-k">if</span> you run several slaves only one should run the <span class="pl-c"><span class="pl-c">#</span> target compiled with ASAN (and UBSAN, CFISAN),</span> <span class="pl-c"><span class="pl-c">#</span> the others should run the target with no sanitizers compiled in.</span> <span class="pl-k">export</span> AFL_USE_UBSAN=1 <span class="pl-k">export</span> AFL_USE_ASAN=1 <span class="pl-c"><span class="pl-c">#</span> AFL_PRELOAD causes AFL to set LD_PRELOAD for the target binary</span> <span class="pl-c"><span class="pl-c">#</span> without disrupting the afl-fuzz process itself.</span> <span class="pl-c"><span class="pl-c">#</span> This is useful, among other things, for bootstrapping libdislocator.so.</span> <span class="pl-c"><span class="pl-c">#</span> see __AFL_LOOP</span> <span class="pl-c"><span class="pl-c">#</span> export AFL_PERSISTENT=1</span> <span class="pl-c"><span class="pl-c">#</span> make sure you compile app with `-fsanitize=address` or `-fsanitize=memory` etc.</span></pre></div> <p dir="auto">NOTE: Use <code>AFL_DONT_OPTIMIZE=1</code>; read: <a href="http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html" rel="nofollow">http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html</a></p> <p dir="auto">For details, see: <a href="https://afl-1.readthedocs.io/en/latest/notes_for_asan.html" rel="nofollow">Using ASAN with AFL</a></p> <p dir="auto">Before fuzzing the program, we may require switching to root user to arrange the core_pattern. Login as root and type the following command:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# see https://afl-1.readthedocs.io/en/latest/tips.html#check-os-configuration sudo su # disable core dumps and CPU frequency scaling on your system (AFL will warn you if you should do this) echo core >/proc/sys/kernel/core_pattern # afl-fuzz will usually complain that you should change your `CPUFREQ` settings to performance because the automatic frequency scaling by the Linux kernel doesn't work well with afl. echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor exit"><pre><span class="pl-c"><span class="pl-c">#</span> see https://afl-1.readthedocs.io/en/latest/tips.html#check-os-configuration</span> sudo su <span class="pl-c"><span class="pl-c">#</span> disable core dumps and CPU frequency scaling on your system (AFL will warn you if you should do this)</span> <span class="pl-c1">echo</span> core <span class="pl-k">></span>/proc/sys/kernel/core_pattern <span class="pl-c"><span class="pl-c">#</span> afl-fuzz will usually complain that you should change your `CPUFREQ` settings to performance because the automatic frequency scaling by the Linux kernel doesn't work well with afl.</span> <span class="pl-c1">echo</span> performance <span class="pl-k">|</span> tee /sys/devices/system/cpu/cpu<span class="pl-k">*</span>/cpufreq/scaling_governor <span class="pl-c1">exit</span></pre></div> <p dir="auto">NOTE: Do not run the fuzzer with root access</p> <p dir="auto">NOTE: Get a solid environment for the fuzzer; never run the fuzzer on low configured hypervisors.</p> <p dir="auto"><code>afl-fuzz</code> is used to run AFL. The actual syntax is as follows:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# see https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries # -i is a directory of files to use as fuzz input "seeds" # -o is a directory to write the results (including inputs that provoke crashes or hangs) # -m is the memory allowed to use. Example: -m500 # You can use -m none to disable memory limit # -t is the maximum time that a run is allowed to take before being declared a "hang" # Timeout of 10 seconds: -t 10000 # @@ is fuzzer input file name # if you skip @@ it will pass the fuzzed file on the standard input AFL_PERSISTENT=1 afl-fuzz -i [TESTCASE DIR] -o [RESULT_DIR] [TARGET_BINARY] [BINARY_PARAMS] @@ # Example 1: runs `tar` with arguments `xfJ @@ -C fuzz-garbage/ --force-local` # where @@ is fuzzer input file name ./afl-1.56b/afl-fuzz -i fuzz-input/ -o fuzz-state/ -t 10000 ~/tar-1.28/src/tar xfJ @@ -C fuzz-garbage/ --force-local # Example 2: server is dual core, so we can run one AFL instance per core AFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -M master ./fuzz_capstone # In another terminal AFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -S slave1 ./fuzz_capstone"><pre><span class="pl-c"><span class="pl-c">#</span> see https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries</span> <span class="pl-c"><span class="pl-c">#</span> -i is a directory of files to use as fuzz input "seeds"</span> <span class="pl-c"><span class="pl-c">#</span> -o is a directory to write the results (including inputs that provoke crashes or hangs)</span> <span class="pl-c"><span class="pl-c">#</span> -m is the memory allowed to use. Example: -m500</span> <span class="pl-c"><span class="pl-c">#</span> You can use -m none to disable memory limit</span> <span class="pl-c"><span class="pl-c">#</span> -t is the maximum time that a run is allowed to take before being declared a "hang"</span> <span class="pl-c"><span class="pl-c">#</span> Timeout of 10 seconds: -t 10000</span> <span class="pl-c"><span class="pl-c">#</span> @@ is fuzzer input file name</span> <span class="pl-c"><span class="pl-c">#</span> if you skip @@ it will pass the fuzzed file on the standard input</span> AFL_PERSISTENT=1 afl-fuzz -i [TESTCASE DIR] -o [RESULT_DIR] [TARGET_BINARY] [BINARY_PARAMS] @@ <span class="pl-c"><span class="pl-c">#</span> Example 1: runs `tar` with arguments `xfJ @@ -C fuzz-garbage/ --force-local`</span> <span class="pl-c"><span class="pl-c">#</span> where @@ is fuzzer input file name</span> ./afl-1.56b/afl-fuzz -i fuzz-input/ -o fuzz-state/ -t 10000 <span class="pl-k">~</span>/tar-1.28/src/tar xfJ @@ -C fuzz-garbage/ --force-local <span class="pl-c"><span class="pl-c">#</span> Example 2: server is dual core, so we can run one AFL instance per core</span> AFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -M master ./fuzz_capstone <span class="pl-c"><span class="pl-c">#</span> In another terminal</span> AFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -S slave1 ./fuzz_capstone</pre></div> <p dir="auto">To understand AFL status screen, read: <a href="https://afl-1.readthedocs.io/en/latest/user_guide.html#status-screen" rel="nofollow">https://afl-1.readthedocs.io/en/latest/user_guide.html#status-screen</a></p> <p dir="auto">NOTE: If <code>total paths</code> stays at 1 you probably have set up something wrong.</p> <p dir="auto">NOTE: Prefer <code>-m none</code>. We use AddressSanitizer; this maps a lot of pages for the shadow memory, so we have to remove the memory limit to have it up and running.</p> <p dir="auto">NOTE: With <code>-m none</code>, your fuzzed software may actually try to really allocate and use a lot of memory due to your fuzzed samples. This may lead to random crashes in your system. You shouldn't do any important work while doing so.</p> <p dir="auto">NOTE: you can try <code>ASAN_OPTIONS=hard_rss_limit_mb=2000</code> to avoid <code>-m none</code>. See: <a href="https://countuponsecurity.com/category/fuzzing/" rel="nofollow">https://countuponsecurity.com/category/fuzzing/</a></p> <p dir="auto">You can write custom binary that will run using <code>afl-fuzz</code>. It may wrap function that you want to test like so:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// harness is simply a C program that makes use of certain methods from // a library, allowing you to indirectly fuzz it #include <cstdio> #include <cstdlib> #include <string> #include <iostream> #include <ifstream> int main(int argc, char *argv[]) { { // init resources here if (argc > 1) { std::ifstream fin; fin.open(argv[1]); parse(fin); // custom logic } else { /// \note requires AFL_PERSISTENT=1 // __AFL_LOOP is the way that we have to tell AFL // that we want persistent mode. // Each fuzzing iteration, // instead of to fork and re-execute the target with a different input, // is just an execution of this loop. // Force AFL to run 1000 times, // with 1000 different inputs fed to the library. // After that, the process is restarted by AFL. // This ensures we regularly replace the process to avoid memory leaks. // see https://toastedcornflakes.github.io/articles/fuzzing_capstone_with_afl.html while (__AFL_LOOP(1000)) { parse(std::cin); // custom logic } } // free resources here return 0; }"><pre><span class="pl-c"><span class="pl-c">//</span> harness is simply a C program that makes use of certain methods from</span> <span class="pl-c"><span class="pl-c">//</span> a library, allowing you to indirectly fuzz it</span> #<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>cstdio<span class="pl-pds">></span></span> #<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>cstdlib<span class="pl-pds">></span></span> #<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>string<span class="pl-pds">></span></span> #<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>iostream<span class="pl-pds">></span></span> #<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>ifstream<span class="pl-pds">></span></span> <span class="pl-k">int</span> <span class="pl-en">main</span>(<span class="pl-k">int</span> argc, <span class="pl-k">char</span> *argv[]) { { <span class="pl-c"><span class="pl-c">//</span> init resources here</span> <span class="pl-k">if</span> (argc > <span class="pl-c1">1</span>) { std::ifstream fin; fin.<span class="pl-c1">open</span>(argv[<span class="pl-c1">1</span>]); <span class="pl-c1">parse</span>(fin); <span class="pl-c"><span class="pl-c">//</span> custom logic</span> } <span class="pl-k">else</span> { <span class="pl-c"><span class="pl-c">//</span>/ \note requires AFL_PERSISTENT=1</span> <span class="pl-c"><span class="pl-c">//</span> __AFL_LOOP is the way that we have to tell AFL</span> <span class="pl-c"><span class="pl-c">//</span> that we want persistent mode.</span> <span class="pl-c"><span class="pl-c">//</span> Each fuzzing iteration,</span> <span class="pl-c"><span class="pl-c">//</span> instead of to fork and re-execute the target with a different input,</span> <span class="pl-c"><span class="pl-c">//</span> is just an execution of this loop.</span> <span class="pl-c"><span class="pl-c">//</span> Force AFL to run 1000 times,</span> <span class="pl-c"><span class="pl-c">//</span> with 1000 different inputs fed to the library.</span> <span class="pl-c"><span class="pl-c">//</span> After that, the process is restarted by AFL.</span> <span class="pl-c"><span class="pl-c">//</span> This ensures we regularly replace the process to avoid memory leaks.</span> <span class="pl-c"><span class="pl-c">//</span> see https://toastedcornflakes.github.io/articles/fuzzing_capstone_with_afl.html</span> <span class="pl-k">while</span> (<span class="pl-c1">__AFL_LOOP</span>(<span class="pl-c1">1000</span>)) { <span class="pl-c1">parse</span>(std::cin); <span class="pl-c"><span class="pl-c">//</span> custom logic</span> } } <span class="pl-c"><span class="pl-c">//</span> free resources here</span> <span class="pl-k">return</span> <span class="pl-c1">0</span>; }</pre></div> <p dir="auto">NOTE: __AFL_LOOP() allows AFL to perform the fuzzing of the binary in process through some memory wizardry, as opposed to starting up a new process for every new testcase we want to test. Requires <code>AFL_PERSISTENT=1</code>.</p> <p dir="auto">By default, AFL forks a process every time it tests a different input. We can control AFL to run multiple fuzz cases in a single instance of the program, rather than reverting the program state back for every test sample. This will reduce the time spent in the kernel space and improve the fuzzing speed. This is called AFL_PERSISTENT mode. We can do that by including the __AFL_LOOP(1000) macro within our test harness.</p> <p dir="auto">NOTE: you may be interested in __AFL_INIT; see for details: <a href="https://robertheaton.com/2019/07/08/how-to-write-an-afl-wrapper-for-any-language/" rel="nofollow">https://robertheaton.com/2019/07/08/how-to-write-an-afl-wrapper-for-any-language/</a></p> <p dir="auto">Let the fuzzer run for few hours or days as it generates maximum code execution paths based on the test cases provided.</p> <p dir="auto">Stop fuzzing issuing <code>ctrl+c’ observing </code>total paths<code>and</code>uniq crashes<code>in the section</code>overall results` of AFL statistics screen.</p> <p dir="auto">Create dictionary that takes all of the constants and strings found in the program binary and adds them to the dictionary. See for script code:<a href="http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html" rel="nofollow">http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html</a></p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="#!/bin/bash # see http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html objdump -d "${1}" | grep -Eo '\$0x[0-9a-f]+' | cut -c 2- | sort -u | while read const; do echo $const | python -c 'import sys, struct; sys.stdout.write("".join(struct.pack("<I" if len(l) <= 11 else "<Q", int(l,0)) for l in sys.stdin.readlines()))' > testcases/$const; done i=0; strings "${1}"| while read line; do echo -n "$line" > testcases/string_${i} ; i=$[ $i + 1 ] ; done"><pre><span class="pl-c"><span class="pl-c">#!</span>/bin/bash</span> <span class="pl-c"><span class="pl-c">#</span> see http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html</span> objdump -d <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">${1}</span><span class="pl-pds">"</span></span> <span class="pl-k">|</span> grep -Eo <span class="pl-s"><span class="pl-pds">'</span>\$0x[0-9a-f]+<span class="pl-pds">'</span></span> <span class="pl-k">|</span> cut -c 2- <span class="pl-k">|</span> sort -u <span class="pl-k">|</span> <span class="pl-k">while</span> <span class="pl-c1">read</span> const<span class="pl-k">;</span> <span class="pl-k">do</span> <span class="pl-c1">echo</span> <span class="pl-smi">$const</span> <span class="pl-k">|</span> python -c <span class="pl-s"><span class="pl-pds">'</span>import sys, struct; sys.stdout.write("".join(struct.pack("<I" if len(l) <= 11 else "<Q", int(l,0)) for l in sys.stdin.readlines()))<span class="pl-pds">'</span></span> <span class="pl-k">></span> testcases/<span class="pl-smi">$const</span><span class="pl-k">;</span> <span class="pl-k">done</span> i=0<span class="pl-k">;</span> strings <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">${1}</span><span class="pl-pds">"</span></span><span class="pl-k">|</span> <span class="pl-k">while</span> <span class="pl-c1">read</span> line<span class="pl-k">;</span> <span class="pl-k">do</span> <span class="pl-c1">echo</span> -n <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$line</span><span class="pl-pds">"</span></span> <span class="pl-k">></span> testcases/string_<span class="pl-smi">${i}</span> <span class="pl-k">;</span> i=$[ <span class="pl-smi">$i</span> + 1 ] <span class="pl-k">;</span> <span class="pl-k">done</span></pre></div> <p dir="auto">You need to create a dictionary in one of the two formats discussed in dictionaries/README.dictionaries and then point the fuzzer to it via the -x option in the command line. Read: <a href="https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries" rel="nofollow">https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries</a> and <a href="https://github.com/mirrorer/afl/blob/master/dictionaries/README.dictionaries">https://github.com/mirrorer/afl/blob/master/dictionaries/README.dictionaries</a></p> <p dir="auto">You can also use <code>libtokencap</code> to create a dictionary; see: <a href="https://github.com/mirrorer/afl/blob/master/libtokencap/README.tokencap">https://github.com/mirrorer/afl/blob/master/libtokencap/README.tokencap</a></p> <p dir="auto">We can find the test cases which cause the crash in the <code>results</code> folder which we have created. On navigating to the folder <code>results</code>, we observe few folders get generated.</p> <p dir="auto">NOTE: Keep the input data files small; under 1 kB is ideal.</p> <p dir="auto">Use <code>afl-cmin</code> to minimize number of input data files.</p> <p dir="auto">Use <code>afl-tmin</code> to minimize each input data file (removes any bytes that do not affect the code paths taken).</p> <p dir="auto">Use <code>afl-ptmin</code> to run <code>afl-tmin</code> in parallel. For details, see: <a href="https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/" rel="nofollow">https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/</a></p> <p dir="auto">To reproduce found crash you can use <code>crashwalk</code> (it is gdb plugin), see: <a href="https://ritcsec.wordpress.com/2018/05/10/vulnerability-discovery-by-fuzzing/" rel="nofollow">https://ritcsec.wordpress.com/2018/05/10/vulnerability-discovery-by-fuzzing/</a></p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="apt-get install gdb golang mkdir src cd src git clone https://github.com/jfoote/exploitable.git cd && mkdir go export GOPATH=~/go # crashwalk installed in $GOPATH/bin/ go get -u github.com/bnagy/crashwalk/cmd/... # USAGE ~/go/bin/cwtriage -root syncdir/fuzzer1/crashes/ -match id -- ~/parse @@"><pre>apt-get install gdb golang mkdir src <span class="pl-c1">cd</span> src git clone https://github.com/jfoote/exploitable.git <span class="pl-c1">cd</span> <span class="pl-k">&&</span> mkdir go <span class="pl-k">export</span> GOPATH=<span class="pl-k">~</span>/go <span class="pl-c"><span class="pl-c">#</span> crashwalk installed in $GOPATH/bin/</span> go get -u github.com/bnagy/crashwalk/cmd/... <span class="pl-c"><span class="pl-c">#</span> USAGE</span> <span class="pl-k">~</span>/go/bin/cwtriage -root syncdir/fuzzer1/crashes/ -match id -- <span class="pl-k">~</span>/parse @@</pre></div> <p dir="auto">When you can not reproduce a crash found by afl-fuzz, the most likely cause is that you are not setting the same memory limit as used by the tool. Read: <a href="https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries" rel="nofollow">https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries</a></p> <p dir="auto">NOTE: You can use <code>afl-cov</code> to quantify how well you are exercising the available code paths in the binary. For details, see: <a href="https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/" rel="nofollow">https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/</a></p> <p dir="auto">NOTE: putting the AFL working directory on a RAM disk, you can potentially gain some additional speed and avoid wearing out the disks at the same time. For details, see: <a href="https://bananamafia.dev/post/gb-fuzz/" rel="nofollow">https://bananamafia.dev/post/gb-fuzz/</a></p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# Fuzzing involves billions of reads and writes to the filesystem (!!!) # Use RAMdisks for input since, we don't want to destroy harddrives # Make a 1GB ramdisk file from which AFL can read input sudo mkdir -p /mnt/inputfiles sudo chown -R $USER:$(id -gn $USER) /mnt/inputfiles sudo mount -t tmpfs -o size=1024M tmpfs /mnt/inputfiles/"><pre><span class="pl-c"><span class="pl-c">#</span> Fuzzing involves billions of reads and writes to the filesystem (!!!)</span> <span class="pl-c"><span class="pl-c">#</span> Use RAMdisks for input since, we don't want to destroy harddrives</span> <span class="pl-c"><span class="pl-c">#</span> Make a 1GB ramdisk file from which AFL can read input</span> sudo mkdir -p /mnt/inputfiles sudo chown -R <span class="pl-smi">$USER</span>:<span class="pl-s"><span class="pl-pds">$(</span>id -gn <span class="pl-smi">$USER</span><span class="pl-pds">)</span></span> /mnt/inputfiles sudo mount -t tmpfs -o size=1024M tmpfs /mnt/inputfiles/</pre></div> <p dir="auto">NOTE: <code>-fvisibility-inlines-hidden</code> flag MAY BREAK AFL INSTRUMENTATION</p> <p dir="auto">AFL provides a crash exploration script in <code>experimental/crash_triage/triage_crashes.sh</code></p> <p dir="auto">When run, the triage script will cycle through each crash file in the <code>/out/crashes</code> directory and print the resulting crash data to the screen.</p> <p dir="auto"><code>triage_crashes</code> usage: <code>./triage_crashes.sh ~/targets/out/ ~/targets/target-app/target-app_binary</code> For details, see: <a href="https://research.aurainfosec.io/hunting-for-bugs-101/" rel="nofollow">https://research.aurainfosec.io/hunting-for-bugs-101/</a></p> <p dir="auto">NOTE: Instrument with AFL just the libraries you actually want to stress-test right now, one at a time. Let the program use system-wide, non-instrumented libraries for any functionality you don’t actually want to fuzz.</p> <p dir="auto">NOTE: you can enable <code>crash exploration mode</code> via <code>-C</code>; see: <a href="https://lcamtuf.blogspot.com/2014/11/afl-fuzz-crash-exploration-mode.html" rel="nofollow">https://lcamtuf.blogspot.com/2014/11/afl-fuzz-crash-exploration-mode.html</a></p> <p dir="auto">NOTE: AFL detects faults by checking for the first spawned process dying due to a signal (SIGSEGV, SIGABRT, etc). Programs that install custom handlers for these signals may need to have the relevant code commented out.</p> <p dir="auto">For details, see:</p> <ul dir="auto"> <li><a href="https://github.com/mykter/afl-training">https://github.com/mykter/afl-training</a></li> <li><a href="https://www.loginsoft.com/blog/2018/02/02/discovering-vulnerabilities-with-afl-fuzzer/" rel="nofollow">https://www.loginsoft.com/blog/2018/02/02/discovering-vulnerabilities-with-afl-fuzzer/</a></li> <li><a href="https://www.youtube.com/watch?v=vzfhHjnycnE" rel="nofollow">https://www.youtube.com/watch?v=vzfhHjnycnE</a></li> <li><a href="https://gamozolabs.github.io/fuzzing/2018/09/16/scaling_afl.html" rel="nofollow">https://gamozolabs.github.io/fuzzing/2018/09/16/scaling_afl.html</a></li> <li><a href="https://ritcsec.wordpress.com/2018/05/10/vulnerability-discovery-by-fuzzing/" rel="nofollow">https://ritcsec.wordpress.com/2018/05/10/vulnerability-discovery-by-fuzzing/</a></li> <li><a href="https://github.com/Dor1s/libfuzzer-workshop/blob/master/lessons/01/Modern_Fuzzing_of_C_C%2B%2B_projects_slides_1-23.pdf">https://github.com/Dor1s/libfuzzer-workshop/blob/master/lessons/01/Modern_Fuzzing_of_C_C%2B%2B_projects_slides_1-23.pdf</a></li> <li><a href="https://github.com/hbowden/nextgen/blob/master/CMakeLists.txt#L92">https://github.com/hbowden/nextgen/blob/master/CMakeLists.txt#L92</a></li> <li><a href="https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/" rel="nofollow">https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/</a></li> <li><a href="https://cs.anu.edu.au/courses/csprojects/19S1/reports/u6759601_report.pdf" rel="nofollow">https://cs.anu.edu.au/courses/csprojects/19S1/reports/u6759601_report.pdf</a></li> <li><a href="https://www.fastly.com/blog/how-fuzz-server-american-fuzzy-lop" rel="nofollow">https://www.fastly.com/blog/how-fuzz-server-american-fuzzy-lop</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: Fuzzing with libFuzzer</h2><a id="user-content-for-contibutors-fuzzing-with-libfuzzer" class="anchor" aria-label="Permalink: For contibutors: Fuzzing with libFuzzer" href="#for-contibutors-fuzzing-with-libfuzzer"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">libFuzzer is part of the LLVM compiler infrastructure project and comes built-in with the clang compiler.</p> <p dir="auto">Then libFuzzer can be linked to the desired driver by passing in <code>-fsanitize=fuzzer</code> during the linking stage.</p> <p dir="auto">NOTE: <code>-fsanitize=fuzzer</code> links in the libFuzzer’s main() symbol.</p> <p dir="auto">NOTE: In most cases you may want to combine libFuzzer with AddressSanitizer (ASAN), UndefinedBehaviorSanitizer (UBSAN), or both. You can also build with MemorySanitizer (MSAN), but support is experimental: <code>-fsanitize=undefined,address,fuzzer</code>.</p> <p dir="auto">Executable repeatedly calls the following function:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { // DoStuffWithYourAPI(Data, Size); return 0; }"><pre><span class="pl-k">extern</span> <span class="pl-s"><span class="pl-pds">"</span>C<span class="pl-pds">"</span></span> <span class="pl-k">int</span> <span class="pl-en">LLVMFuzzerTestOneInput</span>(<span class="pl-k">const</span> <span class="pl-c1">uint8_t</span> *Data, <span class="pl-c1">size_t</span> <span class="pl-c1">Size</span>) { <span class="pl-c"><span class="pl-c">//</span> DoStuffWithYourAPI(Data, Size);</span> <span class="pl-k">return</span> <span class="pl-c1">0</span>; }</pre></div> <p dir="auto">Use <code>-fsanitize=address,fuzzer</code>. Note that you can change sanitizer (address, memory, thread, etc.).</p> <p dir="auto">NOTE: if you suspect memory leaks in your target you should run libFuzzer with <code>-runs=N</code> or <code>-max_total_time=N</code>. If your target has massive leaks you will eventually run out of RAM. To protect your machine from OOM death you may use: <code>ASAN_OPTIONS=hard_rss_limit_mb=2000</code> (with AddressSanitizer).</p> <p dir="auto">libFuzzer requires seed corpus. For details, see: <a href="https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md">https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md</a></p> <p dir="auto">For details, see:</p> <ul dir="auto"> <li><a href="https://llvm.org/docs/LibFuzzer.html" rel="nofollow">https://llvm.org/docs/LibFuzzer.html</a></li> <li><a href="https://medium.com/@levwalkin/compile-llvm-clang-libfuzzer-b61e82718430" rel="nofollow">https://medium.com/@levwalkin/compile-llvm-clang-libfuzzer-b61e82718430</a></li> <li><a href="https://github.com/Dor1s/libfuzzer-workshop">https://github.com/Dor1s/libfuzzer-workshop</a></li> <li><a href="https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md">https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md</a></li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">For contibutors: Prefer Clang To GCC</h2><a id="user-content-for-contibutors-prefer-clang-to-gcc" class="anchor" aria-label="Permalink: For contibutors: Prefer Clang To GCC" href="#for-contibutors-prefer-clang-to-gcc"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto">Clang supports thread safety annotations (GUARDED_BY)</p> <ol dir="auto"> <li>Enable <code>-Wthread-safety-analysis</code></li> <li>Use <code>base/thread_annotations.h</code> <a href="https://github.com/chromium/chromium/blob/master/base/thread_annotations.h">https://github.com/chromium/chromium/blob/master/base/thread_annotations.h</a> For details, see:</li> </ol> <ul dir="auto"> <li><a href="http://clang.llvm.org/docs/ThreadSafetyAnalysis.html" rel="nofollow">http://clang.llvm.org/docs/ThreadSafetyAnalysis.html</a></li> <li>see <a href="https://github.com/isocpp/CppCoreGuidelines/blob/master/docs/Lifetime.pdf">https://github.com/isocpp/CppCoreGuidelines/blob/master/docs/Lifetime.pdf</a></li> <li><a href="https://insights.sei.cmu.edu/sei_blog/2014/10/thread-safety-analysis-in-c-and-c.html" rel="nofollow">https://insights.sei.cmu.edu/sei_blog/2014/10/thread-safety-analysis-in-c-and-c.html</a></li> </ul> </li> <li> <p dir="auto">Clang fas first-class support for sanitizers. See details about MSAN, ASAN, TSAN, etc. in docs.</p> </li> <li> <p dir="auto">Clang can be build with lifetime profile:</p> <ol dir="auto"> <li>Build special branch of Clang <a href="https://github.com/mgehre/llvm-project">https://github.com/mgehre/llvm-project</a></li> <li>Enable <code>-Wlifetime</code> For details, see:</li> </ol> <ul dir="auto"> <li><a href="https://pspdfkit.com/blog/2020/the-cpp-lifetime-profile/" rel="nofollow">https://pspdfkit.com/blog/2020/the-cpp-lifetime-profile/</a></li> <li><a href="https://herbsutter.com/2018/09/20/lifetime-profile-v1-0-posted/" rel="nofollow">https://herbsutter.com/2018/09/20/lifetime-profile-v1-0-posted/</a></li> </ul> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">LICENSE for open source components</h2><a id="user-content-license-for-open-source-components" class="anchor" aria-label="Permalink: LICENSE for open source components" href="#license-for-open-source-components"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">All the open source components are used under their associated open source licences.</p> <p dir="auto">Used open source components:</p> <ul dir="auto"> <li>icu</li> <li>ced</li> <li>boost</li> <li>harfbuzz</li> <li>boost.outcome</li> <li>chromium (base)</li> <li>libevent</li> <li>modp_b64</li> <li>tcmalloc</li> <li>xdg_mime</li> <li>xdg_user_dirs</li> <li>dynamic_annotations</li> <li>(Facebook) Folly</li> <li>(Microsoft) GSL</li> </ul> <p dir="auto">See LICENSE files</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">LICENSE</h2><a id="user-content-license" class="anchor" aria-label="Permalink: LICENSE" href="#license"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">the MIT license</p> <p dir="auto">See LICENSE for the full content of the licenses.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Disclaimer</h2><a id="user-content-disclaimer" class="anchor" aria-label="Permalink: Disclaimer" href="#disclaimer"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">That open source project based on the Google Chromium project.</p> <p dir="auto">This is not official Google product.</p> <p dir="auto">Portions Copyright (c) Google Inc.</p> <p dir="auto">See LICENSE files.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Contributors List: Example Profile</h3><a id="user-content-contributors-list-example-profile" class="anchor" aria-label="Permalink: Contributors List: Example Profile" href="#contributors-list-example-profile"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>I'm an example that you can copy, if you want :)</li> <li>I work on many things like...</li> <li>My hobbies include...</li> </ul> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Contributors List</h3><a id="user-content-contributors-list" class="anchor" aria-label="Permalink: Contributors List" href="#contributors-list"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">A</h4><a id="user-content-a" class="anchor" aria-label="Permalink: A" href="#a"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Anindita Basu</h5><a id="user-content-anindita-basu" class="anchor" aria-label="Permalink: Anindita Basu" href="#anindita-basu"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Technical writer</li> <li><a href="https://twitter.com/anindita_basu" rel="nofollow">twitter</a> <a href="https://github.com/AninditaBasu">github</a></li> </ul> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Anna Hayhurst</h5><a id="user-content-anna-hayhurst" class="anchor" aria-label="Permalink: Anna Hayhurst" href="#anna-hayhurst"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Junior Developer</li> <li><a href="https://github.com/annahayhurst">github</a></li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">C</h4><a id="user-content-c" class="anchor" aria-label="Permalink: C" href="#c"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Cassio Espindola</h5><a id="user-content-cassio-espindola" class="anchor" aria-label="Permalink: Cassio Espindola" href="#cassio-espindola"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Analyst Developer</li> <li><a href="https://github.com/cassioesp">github</a></li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">D</h4><a id="user-content-d" class="anchor" aria-label="Permalink: D" href="#d"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Denis Trofimov</h5><a id="user-content-denis-trofimov" class="anchor" aria-label="Permalink: Denis Trofimov" href="#denis-trofimov"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>C++ Developer</li> <li><a href="https://github.com/blockspacer">github</a></li> <li><a href="https://github.com/derofim">github</a></li> <li><a href="https://www.linkedin.com/in/denis-trofimov-4335bb13b/" rel="nofollow">linkedin</a></li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">M</h4><a id="user-content-m" class="anchor" aria-label="Permalink: M" href="#m"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Mohib Qureshi</h5><a id="user-content-mohib-qureshi" class="anchor" aria-label="Permalink: Mohib Qureshi" href="#mohib-qureshi"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Software Development Enthusiast</li> <li><a href="https://github.com/mohibqureshi">github</a></li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Y</h4><a id="user-content-y" class="anchor" aria-label="Permalink: Y" href="#y"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Yousif Alebyary</h5><a id="user-content-yousif-alebyary" class="anchor" aria-label="Permalink: Yousif Alebyary" href="#yousif-alebyary"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Web/Mobile Developer.</li> <li><a href="https://github.com/yousifm">github</a></li> </ul> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">Yves Mancera</h5><a id="user-content-yves-mancera" class="anchor" aria-label="Permalink: Yves Mancera" href="#yves-mancera"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>Software Engineer</li> <li><a href="https://github.com/yvesmh">github</a></li> </ul> </article></div></div></div></div></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-partial> <input type="hidden" data-csrf="true" value="wctNompEZAoeoDfI3jz2hxxeWqtzPI/n/4NViHiS4/VHNWvWDOw2tAJ6uiRWncNmeGpNP0tc2LzwDDKkU7gvQw==" /> </div> <div data-view-component="true" class="Layout-sidebar"> <div class="BorderGrid about-margin" data-pjax> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <div class="hide-sm hide-md"> <h2 class="mb-3 h4">About</h2> <p class="f4 my-3"> C++ compile-time programming (serialization, reflection, code modification, enum to string, better enum, enum to json, extend or parse language, etc.) </p> <div class="my-3 d-flex flex-items-center"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link flex-shrink-0 mr-2"> <path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path> </svg> <span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit"> <a title="https://blockspacer.github.io/flex_docs/" role="link" target="_blank" rel="noopener noreferrer nofollow" class="text-bold" href="https://blockspacer.github.io/flex_docs/">blockspacer.github.io/flex_docs/</a> </span> </div> <h3 class="sr-only">Topics</h3> <div class="my-3"> <div class="f6"> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:refactoring" href="/topics/refactoring" title="Topic: refactoring" data-view-component="true" class="topic-tag topic-tag-link"> refactoring </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:serialization" href="/topics/serialization" title="Topic: serialization" data-view-component="true" class="topic-tag topic-tag-link"> serialization </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:reflection" href="/topics/reflection" title="Topic: reflection" data-view-component="true" class="topic-tag topic-tag-link"> reflection </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:cplusplus" href="/topics/cplusplus" title="Topic: cplusplus" data-view-component="true" class="topic-tag topic-tag-link"> cplusplus </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:cpp" href="/topics/cpp" title="Topic: cpp" data-view-component="true" class="topic-tag topic-tag-link"> cpp </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:llvm" href="/topics/llvm" title="Topic: llvm" data-view-component="true" class="topic-tag topic-tag-link"> llvm </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:static-analysis" href="/topics/static-analysis" title="Topic: static-analysis" data-view-component="true" class="topic-tag topic-tag-link"> static-analysis </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:cpp14" href="/topics/cpp14" title="Topic: cpp14" data-view-component="true" class="topic-tag topic-tag-link"> cpp14 </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:preprocessor" href="/topics/preprocessor" title="Topic: preprocessor" data-view-component="true" class="topic-tag topic-tag-link"> preprocessor </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:clang" href="/topics/clang" title="Topic: clang" data-view-component="true" class="topic-tag topic-tag-link"> clang </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:cpp11" href="/topics/cpp11" title="Topic: cpp11" data-view-component="true" class="topic-tag topic-tag-link"> cpp11 </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:introspection" href="/topics/introspection" title="Topic: introspection" data-view-component="true" class="topic-tag topic-tag-link"> introspection </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:source-to-source" href="/topics/source-to-source" title="Topic: source-to-source" data-view-component="true" class="topic-tag topic-tag-link"> source-to-source </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:codestyle" href="/topics/codestyle" title="Topic: codestyle" data-view-component="true" class="topic-tag topic-tag-link"> codestyle </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:libtooling" href="/topics/libtooling" title="Topic: libtooling" data-view-component="true" class="topic-tag topic-tag-link"> libtooling </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:metaclass" href="/topics/metaclass" title="Topic: metaclass" data-view-component="true" class="topic-tag topic-tag-link"> metaclass </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:transpiling" href="/topics/transpiling" title="Topic: transpiling" data-view-component="true" class="topic-tag topic-tag-link"> transpiling </a> <a data-ga-click="Topic, repository page" data-octo-click="topic_click" data-octo-dimensions="topic:cling" href="/topics/cling" title="Topic: cling" data-view-component="true" class="topic-tag topic-tag-link"> cling </a> </div> </div> <h3 class="sr-only">Resources</h3> <div class="mt-2"> <a class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:readme"}" href="#readme-ov-file"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book mr-2"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> Readme </a> </div> <h3 class="sr-only">License</h3> <div class="mt-2"> <a href="#MIT-1-ov-file" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <include-fragment src="/blockspacer/flextool/hovercards/citation/sidebar_partial?tree_name=master"> </include-fragment> <div class="mt-2"> <a href="/blockspacer/flextool/activity" data-view-component="true" class="Link Link--muted"> <svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-2"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span class="color-fg-muted">Activity</span> </a> </div> <h3 class="sr-only">Stars</h3> <div class="mt-2"> <a href="/blockspacer/flextool/stargazers" data-view-component="true" class="Link Link--muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <strong>41</strong> stars </a> </div> <h3 class="sr-only">Watchers</h3> <div class="mt-2"> <a href="/blockspacer/flextool/watchers" data-view-component="true" class="Link Link--muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-eye mr-2"> <path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path> </svg> <strong>5</strong> watching </a> </div> <h3 class="sr-only">Forks</h3> <div class="mt-2"> <a href="/blockspacer/flextool/forks" data-view-component="true" class="Link Link--muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <strong>4</strong> forks </a> </div> <div class="mt-2"> <a class="Link--muted" href="/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2Fblockspacer%2Fflextool&report=blockspacer+%28user%29"> Report repository </a> </div> </div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame"> <a href="/blockspacer/flextool/releases" data-view-component="true" class="Link--primary no-underline Link"> Releases </a></h2> <div class="text-small color-fg-muted">No releases published</div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/users/blockspacer/packages?repo_name=flextool" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center"> Packages <span title="0" hidden="hidden" data-view-component="true" class="Counter ml-1">0</span> </a></h2> <div class="text-small color-fg-muted" > No packages published <br> </div> </div> </div> <div class="BorderGrid-row" hidden> <div class="BorderGrid-cell"> <include-fragment src="/blockspacer/flextool/used_by_list" accept="text/fragment+html"> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/blockspacer/flextool/graphs/contributors" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center"> Contributors <span title="2" data-view-component="true" class="Counter ml-1">2</span> </a></h2> <include-fragment src="/blockspacer/flextool/contributors_list?count=2&current_repository=flextool&items_to_show=2" aria-busy="true" aria-label="Loading contributors"> <ul class="list-style-none "> <li class="mb-2 d-flex"> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> <div class="Skeleton Skeleton--text flex-1 flex-self-center f4"> </div> </li> <li class="mb-2 d-flex"> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> <div class="Skeleton Skeleton--text flex-1 flex-self-center f4"> </div> </li> </ul> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Languages</h2> <div class="mb-2"> <span data-view-component="true" class="Progress"> <span style="background-color:#DA3434 !important;;width: 41.9%;" itemprop="keywords" aria-label="CMake 41.9" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#3572A5 !important;;width: 36.6%;" itemprop="keywords" aria-label="Python 36.6" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#f34b7d !important;;width: 20.7%;" itemprop="keywords" aria-label="C++ 20.7" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#f1e05a !important;;width: 0.8%;" itemprop="keywords" aria-label="JavaScript 0.8" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> </span></div> <ul class="list-style-none"> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/blockspacer/flextool/search?l=cmake" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#DA3434;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">CMake</span> <span>41.9%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/blockspacer/flextool/search?l=python" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#3572A5;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Python</span> <span>36.6%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/blockspacer/flextool/search?l=c%2B%2B" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#f34b7d;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">C++</span> <span>20.7%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/blockspacer/flextool/search?l=javascript" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#f1e05a;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">JavaScript</span> <span>0.8%</span> </a> </li> </ul> </div> </div> </div> </div> </div></div> </div> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path> </svg> </a> <span> © 2024 GitHub, Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>