Files
i2p.plugins.firefox/docs/BUILD.md

170 KiB
Raw Blame History

<html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system"> <head>
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-e357a4095c32.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-db31090e8b9a.css" />
<link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-10b88735c5e0.css" />
<meta name="optimizely-datafile" content="{&quot;groups&quot;: [], &quot;environmentKey&quot;: &quot;production&quot;, &quot;rollouts&quot;: [], &quot;typedAudiences&quot;: [], &quot;projectId&quot;: &quot;16737760170&quot;, &quot;variables&quot;: [], &quot;featureFlags&quot;: [], &quot;experiments&quot;: [], &quot;version&quot;: &quot;4&quot;, &quot;audiences&quot;: [{&quot;conditions&quot;: &quot;[\&quot;or\&quot;, {\&quot;match\&quot;: \&quot;exact\&quot;, \&quot;name\&quot;: \&quot;$opt_dummy_attribute\&quot;, \&quot;type\&quot;: \&quot;custom_attribute\&quot;, \&quot;value\&quot;: \&quot;$opt_dummy_value\&quot;}]&quot;, &quot;id&quot;: &quot;$opt_dummy_audience&quot;, &quot;name&quot;: &quot;Optimizely-Generated Audience for Backwards Compatibility&quot;}], &quot;anonymizeIP&quot;: true, &quot;sdkKey&quot;: &quot;WTc6awnGuYDdG98CYRban&quot;, &quot;attributes&quot;: [{&quot;id&quot;: &quot;16822470375&quot;, &quot;key&quot;: &quot;user_id&quot;}, {&quot;id&quot;: &quot;17143601254&quot;, &quot;key&quot;: &quot;spammy&quot;}, {&quot;id&quot;: &quot;18175660309&quot;, &quot;key&quot;: &quot;organization_plan&quot;}, {&quot;id&quot;: &quot;18813001570&quot;, &quot;key&quot;: &quot;is_logged_in&quot;}, {&quot;id&quot;: &quot;19073851829&quot;, &quot;key&quot;: &quot;geo&quot;}, {&quot;id&quot;: &quot;20175462351&quot;, &quot;key&quot;: &quot;requestedCurrency&quot;}, {&quot;id&quot;: &quot;20785470195&quot;, &quot;key&quot;: &quot;country_code&quot;}, {&quot;id&quot;: &quot;21656311196&quot;, &quot;key&quot;: &quot;opened_downgrade_dialog&quot;}], &quot;botFiltering&quot;: false, &quot;accountId&quot;: &quot;16737760170&quot;, &quot;events&quot;: [{&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;17911811441&quot;, &quot;key&quot;: &quot;hydro_click.dashboard.teacher_toolbox_cta&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18124116703&quot;, &quot;key&quot;: &quot;submit.organizations.complete_sign_up&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18145892387&quot;, &quot;key&quot;: &quot;no_metric.tracked_outside_of_optimizely&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18178755568&quot;, &quot;key&quot;: &quot;click.org_onboarding_checklist.add_repo&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18180553241&quot;, &quot;key&quot;: &quot;submit.repository_imports.create&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18186103728&quot;, &quot;key&quot;: &quot;click.help.learn_more_about_repository_creation&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18188530140&quot;, &quot;key&quot;: &quot;test_event&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18191963644&quot;, &quot;key&quot;: &quot;click.empty_org_repo_cta.transfer_repository&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18195612788&quot;, &quot;key&quot;: &quot;click.empty_org_repo_cta.import_repository&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18210945499&quot;, &quot;key&quot;: &quot;click.org_onboarding_checklist.invite_members&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18211063248&quot;, &quot;key&quot;: &quot;click.empty_org_repo_cta.create_repository&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18215721889&quot;, &quot;key&quot;: &quot;click.org_onboarding_checklist.update_profile&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18224360785&quot;, &quot;key&quot;: &quot;click.org_onboarding_checklist.dismiss&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18234832286&quot;, &quot;key&quot;: &quot;submit.organization_activation.complete&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18252392383&quot;, &quot;key&quot;: &quot;submit.org_repository.create&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18257551537&quot;, &quot;key&quot;: &quot;submit.org_member_invitation.create&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18259522260&quot;, &quot;key&quot;: &quot;submit.organization_profile.update&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18564603625&quot;, &quot;key&quot;: &quot;view.classroom_select_organization&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18568612016&quot;, &quot;key&quot;: &quot;click.classroom_sign_in_click&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18572592540&quot;, &quot;key&quot;: &quot;view.classroom_name&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18574203855&quot;, &quot;key&quot;: &quot;click.classroom_create_organization&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18582053415&quot;, &quot;key&quot;: &quot;click.classroom_select_organization&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18589463420&quot;, &quot;key&quot;: &quot;click.classroom_create_classroom&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18591323364&quot;, &quot;key&quot;: &quot;click.classroom_create_first_classroom&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18591652321&quot;, &quot;key&quot;: &quot;click.classroom_grant_access&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18607131425&quot;, &quot;key&quot;: &quot;view.classroom_creation&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;18831680583&quot;, &quot;key&quot;: &quot;upgrade_account_plan&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19064064515&quot;, &quot;key&quot;: &quot;click.signup&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19075373687&quot;, &quot;key&quot;: &quot;click.view_account_billing_page&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19077355841&quot;, &quot;key&quot;: &quot;click.dismiss_signup_prompt&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19079713938&quot;, &quot;key&quot;: &quot;click.contact_sales&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19120963070&quot;, &quot;key&quot;: &quot;click.compare_account_plans&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19151690317&quot;, &quot;key&quot;: &quot;click.upgrade_account_cta&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19424193129&quot;, &quot;key&quot;: &quot;click.open_account_switcher&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19520330825&quot;, &quot;key&quot;: &quot;click.visit_account_profile&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19540970635&quot;, &quot;key&quot;: &quot;click.switch_account_context&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19730198868&quot;, &quot;key&quot;: &quot;submit.homepage_signup&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19820830627&quot;, &quot;key&quot;: &quot;click.homepage_signup&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;19988571001&quot;, &quot;key&quot;: &quot;click.create_enterprise_trial&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20036538294&quot;, &quot;key&quot;: &quot;click.create_organization_team&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20040653299&quot;, &quot;key&quot;: &quot;click.input_enterprise_trial_form&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20062030003&quot;, &quot;key&quot;: &quot;click.continue_with_team&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20068947153&quot;, &quot;key&quot;: &quot;click.create_organization_free&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20086636658&quot;, &quot;key&quot;: &quot;click.signup_continue.username&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20091648988&quot;, &quot;key&quot;: &quot;click.signup_continue.create_account&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20103637615&quot;, &quot;key&quot;: &quot;click.signup_continue.email&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20111574253&quot;, &quot;key&quot;: &quot;click.signup_continue.password&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20120044111&quot;, &quot;key&quot;: &quot;view.pricing_page&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20152062109&quot;, &quot;key&quot;: &quot;submit.create_account&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20165800992&quot;, &quot;key&quot;: &quot;submit.upgrade_payment_form&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20171520319&quot;, &quot;key&quot;: &quot;submit.create_organization&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20222645674&quot;, &quot;key&quot;: &quot;click.recommended_plan_in_signup.discuss_your_needs&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20227443657&quot;, &quot;key&quot;: &quot;submit.verify_primary_user_email&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20234607160&quot;, &quot;key&quot;: &quot;click.recommended_plan_in_signup.try_enterprise&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20238175784&quot;, &quot;key&quot;: &quot;click.recommended_plan_in_signup.team&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20239847212&quot;, &quot;key&quot;: &quot;click.recommended_plan_in_signup.continue_free&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20251097193&quot;, &quot;key&quot;: &quot;recommended_plan&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20438619534&quot;, &quot;key&quot;: &quot;click.pricing_calculator.1_member&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20456699683&quot;, &quot;key&quot;: &quot;click.pricing_calculator.15_members&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20467868331&quot;, &quot;key&quot;: &quot;click.pricing_calculator.10_members&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20476267432&quot;, &quot;key&quot;: &quot;click.trial_days_remaining&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20476357660&quot;, &quot;key&quot;: &quot;click.discover_feature&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20479287901&quot;, &quot;key&quot;: &quot;click.pricing_calculator.custom_members&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20481107083&quot;, &quot;key&quot;: &quot;click.recommended_plan_in_signup.apply_teacher_benefits&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20483089392&quot;, &quot;key&quot;: &quot;click.pricing_calculator.5_members&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20484283944&quot;, &quot;key&quot;: &quot;click.onboarding_task&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20484996281&quot;, &quot;key&quot;: &quot;click.recommended_plan_in_signup.apply_student_benefits&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20486713726&quot;, &quot;key&quot;: &quot;click.onboarding_task_breadcrumb&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20490791319&quot;, &quot;key&quot;: &quot;click.upgrade_to_enterprise&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20491786766&quot;, &quot;key&quot;: &quot;click.talk_to_us&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20494144087&quot;, &quot;key&quot;: &quot;click.dismiss_enterprise_trial&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20499722759&quot;, &quot;key&quot;: &quot;completed_all_tasks&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20500710104&quot;, &quot;key&quot;: &quot;completed_onboarding_tasks&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20513160672&quot;, &quot;key&quot;: &quot;click.read_doc&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20516196762&quot;, &quot;key&quot;: &quot;actions_enabled&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20518980986&quot;, &quot;key&quot;: &quot;click.dismiss_trial_banner&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20535446721&quot;, &quot;key&quot;: &quot;click.issue_actions_prompt.dismiss_prompt&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20557002247&quot;, &quot;key&quot;: &quot;click.issue_actions_prompt.setup_workflow&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20595070227&quot;, &quot;key&quot;: &quot;click.pull_request_setup_workflow&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20626600314&quot;, &quot;key&quot;: &quot;click.seats_input&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20642310305&quot;, &quot;key&quot;: &quot;click.decrease_seats_number&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20662990045&quot;, &quot;key&quot;: &quot;click.increase_seats_number&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20679620969&quot;, &quot;key&quot;: &quot;click.public_product_roadmap&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20761240940&quot;, &quot;key&quot;: &quot;click.dismiss_survey_banner&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20767210721&quot;, &quot;key&quot;: &quot;click.take_survey&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20795281201&quot;, &quot;key&quot;: &quot;click.archive_list&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20966790249&quot;, &quot;key&quot;: &quot;contact_sales.submit&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20996500333&quot;, &quot;key&quot;: &quot;contact_sales.existing_customer&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;20996890162&quot;, &quot;key&quot;: &quot;contact_sales.blank_message_field&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21000470317&quot;, &quot;key&quot;: &quot;contact_sales.personal_email&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21002790172&quot;, &quot;key&quot;: &quot;contact_sales.blank_phone_field&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21354412592&quot;, &quot;key&quot;: &quot;click.dismiss_create_readme&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21366102546&quot;, &quot;key&quot;: &quot;click.dismiss_zero_user_content&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21370252505&quot;, &quot;key&quot;: &quot;account_did_downgrade&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21370840408&quot;, &quot;key&quot;: &quot;click.cta_create_readme&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21375451068&quot;, &quot;key&quot;: &quot;click.cta_create_new_repository&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21385390948&quot;, &quot;key&quot;: &quot;click.zero_user_content&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21467712175&quot;, &quot;key&quot;: &quot;click.downgrade_keep&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21484112202&quot;, &quot;key&quot;: &quot;click.downgrade&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21495292213&quot;, &quot;key&quot;: &quot;click.downgrade_survey_exit&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21508241468&quot;, &quot;key&quot;: &quot;click.downgrade_survey_submit&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21512030356&quot;, &quot;key&quot;: &quot;click.downgrade_support&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21539090022&quot;, &quot;key&quot;: &quot;click.downgrade_exit&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21543640644&quot;, &quot;key&quot;: &quot;click_fetch_upstream&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21646510300&quot;, &quot;key&quot;: &quot;click.move_your_work&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21656151116&quot;, &quot;key&quot;: &quot;click.add_branch_protection_rule&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21663860599&quot;, &quot;key&quot;: &quot;click.downgrade_dialog_open&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21687860483&quot;, &quot;key&quot;: &quot;click.learn_about_protected_branches&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21689050333&quot;, &quot;key&quot;: &quot;click.dismiss_protect_this_branch&quot;}, {&quot;experimentIds&quot;: [], &quot;id&quot;: &quot;21864370109&quot;, &quot;key&quot;: &quot;click.sign_in&quot;}], &quot;revision&quot;: &quot;1367&quot;}" />
<script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-848a312f5d2d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_smoothscroll-polyfill_dist_smoothscroll_js-node_modules_stacktrace-parse-297da6-aaa32681a0b3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-28efc4e97933.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_selector-observer_dist_index_esm_js-650337916dbd.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_details-dialog-elemen-63debe-4a2f37f7419e.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_-6afc16-fa4f01d20b81.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_markdown-toolbar-element_dist_index_js-10a449882d1a.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-d1569f-cac1c97bc6a5.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_text-ex-3415a8-daf4603c6e6b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_view-components_app_components_primer_primer_js-node_modules_gith-3af896-288086fb1606.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-bc11a138f4ef.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-82a99a4d0f68.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-e954e8c01c93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_manuelpuyol_turbo_dist_turbo_es2017-esm_js-ac3bd901e26b.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_alive-client_dist-bf5aa2-cb53b34c4b84.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_scroll-anchoring_dist_scro-be072a-ef15727bc587.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_dimensions_js-node_modules_github_hydro-analyt-f69502-cfbd999d8263.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_paste-markdown_dist_index_esm_js-node_modules_github_quote-select-f57862-d5fdfac7e5dd.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_updatable-content_ts-62df1309213c.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-b8e2a48d22a4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_keyboard-shortcuts-helper_ts-app_assets_modules_github_be-d820ce-34bbb0afda60.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_user-content_ts-app_assets_modules_github_blob-anchor_ts--e218a0-0bedfe2b2bc5.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-cb56bba555dc.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-23311f089a78.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-06ff532-0eddb8f4d122.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-35a509648d46.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_optimizely_optimizely-sdk_dist_optimizely_browser_es_min_js-node_modules-77839b-550a5f909f1b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/optimizely-b5e5c69aa424.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_memoize_dist_esm_index_-ced8cc-ffd5e4d6ee17.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_mini-throt-a33094-4a3b4e63b420.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_mini-th-85225b-d5c5eb0b8bb2.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_ref-selector_ts-eb4fbb464325.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repositories-447897543025.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_clipboard-copy-element_dist_index_esm_js-node_modules_github_remo-8e6bec-4a54aa10cc28.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_scroll-anchoring_di-e71893-c446bed4261b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_diffs_blob-lines_ts-app_assets_modules_github_diffs_linkable-line-n-dca161-bf0171cec2b2.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/diffs-4edb932eb78e.js"></script>
<meta name="hovercard-subject-tag" content="repository:522351978" data-turbo-transient>
<meta name="google-site-verification" content="c1kuD-K2HIVF635lypcsWPoD4kilo5-jA_wBFyT4uMY">
<meta name="user-login" content="">



<meta name="viewport" content="width=device-width">

  <meta name="description" content="I2P Focused Browser Profile Manager written in Java. - i2p.plugins.firefox/BUILD.md at 951edeab92868ce1e33722b12a8c68347196c9a5 · eyedeekay/i2p.plugins.firefox">
  <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" />
  <meta name="twitter:image:src" content="https://opengraph.githubassets.com/3600c70aa28126c6a4f4a36be8f0df505b3ffe03c2c3f2f8ce62a87c05edb4d3/eyedeekay/i2p.plugins.firefox" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="i2p.plugins.firefox/BUILD.md at 951edeab92868ce1e33722b12a8c68347196c9a5 · eyedeekay/i2p.plugins.firefox" /><meta name="twitter:description" content="I2P Focused Browser Profile Manager written in Java. - i2p.plugins.firefox/BUILD.md at 951edeab92868ce1e33722b12a8c68347196c9a5 · eyedeekay/i2p.plugins.firefox" />
  <meta property="og:image" content="https://opengraph.githubassets.com/3600c70aa28126c6a4f4a36be8f0df505b3ffe03c2c3f2f8ce62a87c05edb4d3/eyedeekay/i2p.plugins.firefox" /><meta property="og:image:alt" content="I2P Focused Browser Profile Manager written in Java. - i2p.plugins.firefox/BUILD.md at 951edeab92868ce1e33722b12a8c68347196c9a5 · eyedeekay/i2p.plugins.firefox" /><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="i2p.plugins.firefox/BUILD.md at 951edeab92868ce1e33722b12a8c68347196c9a5 · eyedeekay/i2p.plugins.firefox" /><meta property="og:url" content="https://github.com/eyedeekay/i2p.plugins.firefox" /><meta property="og:description" content="I2P Focused Browser Profile Manager written in Java. - i2p.plugins.firefox/BUILD.md at 951edeab92868ce1e33722b12a8c68347196c9a5 · eyedeekay/i2p.plugins.firefox" />
  
<link rel="assets" href="https://github.githubassets.com/">


    <meta name="hostname" content="github.com">



    <meta name="expected-hostname" content="github.com">

<meta name="enabled-features" content="TURBO_EXPERIMENT_RISKY,IMAGE_METRIC_TRACKING,GEOJSON_AZURE_MAPS">
    <meta data-hydrostats="publish">
<link rel="canonical" href="https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md" data-turbo-transient>
</head>
<div class="position-relative js-header-wrapper ">
  <a href="#start-of-content" 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>
        <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-4c80b5ecc7fc.js"></script>
<script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-ef3a905b759f.js"></script> <header class="Header-old header-logged-out js-details-container Details position-relative f4 py-3" role="banner"> Toggle navigation
    <div class="flex-1">
      <a href="/signup?ref_cta=Sign+up&amp;ref_loc=header+logged+out&amp;ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fblob%2Fshow&amp;source=header-repo"
        class="d-inline-block d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit"
        data-hydro-click="{&quot;event_type&quot;:&quot;authentication.click&quot;,&quot;payload&quot;:{&quot;location_in_page&quot;:&quot;site header&quot;,&quot;repository_id&quot;:null,&quot;auth_type&quot;:&quot;SIGN_UP&quot;,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="7ac5343bfdcf060a06371cea2315b90b68ed0a05138acf276eecb9d1cb6782d4"
      >
        Sign&nbsp;up
      </a>
    </div>

  <div class="flex-1 flex-order-2 text-right">
      <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target 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>
<div class="HeaderMenu--logged-out p-responsive height-fit position-lg-relative d-lg-flex flex-column flex-auto pt-7 pb-4 top-0">
  <div class="header-menu-wrapper d-flex flex-column flex-self-end flex-lg-row flex-justify-between flex-auto p-3 p-lg-0 rounded rounded-lg-0 mt-3 mt-lg-0">
      <nav class="mt-0 px-3 px-lg-0 mb-3 mb-lg-0" 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-3 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 fill-rule="evenodd" d="M12.78 6.22a.75.75 0 010 1.06l-4.25 4.25a.75.75 0 01-1.06 0L3.22 7.28a.75.75 0 011.06-1.06L8 9.94l3.72-3.72a.75.75 0 011.06 0z"></path>
  </div>

    <div id="responsive-meta-container" data-turbo-replace>
      <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">

Permalink

951edeab92
<header class="SelectMenu-header"> Switch branches/tags </header>
<input-demux data-action="tab-container-change:input-demux#storeInput tab-container-changed:input-demux#updateInput">
  <tab-container class="d-flex flex-column js-branches-tags-tabs" style="min-height: 0;">
    <div class="SelectMenu-filter">
      <input data-target="input-demux.source"
             id="context-commitish-filter-field"
             class="SelectMenu-input form-control"
             aria-owns="ref-list-branches"
             data-controls-ref-menu-id="ref-list-branches"
             autofocus
             autocomplete="off"
             aria-label="Filter branches/tags"
             placeholder="Filter branches/tags"
             type="text"
      >
    </div>

    <div class="SelectMenu-tabs" role="tablist" data-target="input-demux.control" >
      <button class="SelectMenu-tab" type="button" role="tab" aria-selected="true">Branches</button>
      <button class="SelectMenu-tab" type="button" role="tab">Tags</button>
    </div>

    <div role="tabpanel" id="ref-list-branches" data-filter-placeholder="Filter branches/tags" tabindex="" class="d-flex flex-column flex-auto overflow-auto">
      <ref-selector
        type="branch"
        data-targets="input-demux.sinks"
        data-action="
          input-entered:ref-selector#inputEntered
          tab-selected:ref-selector#tabSelected
          focus-list:ref-selector#focusFirstListMember
        "
        query-endpoint="/eyedeekay/i2p.plugins.firefox/refs"
        
        cache-key="v0:1669180551.131469"
        current-committish="OTUxZWRlYWI5Mjg2OGNlMWUzMzcyMmIxMmE4YzY4MzQ3MTk2YzlhNQ=="
        default-branch="bWFpbg=="
        name-with-owner="ZXllZGVla2F5L2kycC5wbHVnaW5zLmZpcmVmb3g="
        prefetch-on-mouseover
      >

        <template data-target="ref-selector.fetchFailedTemplate">
          <div class="SelectMenu-message" data-index="{{ index }}">Could not load branches</div>
        </template>

          <template data-target="ref-selector.noMatchTemplate">
<div class="SelectMenu-message">Nothing to show</div>
        <div data-target="ref-selector.listContainer" role="menu" class="SelectMenu-list " data-turbo-frame="repo-content-turbo-frame">
          <div class="SelectMenu-loading pt-3 pb-0 overflow-hidden" aria-label="Menu is loading">
            <svg style="box-sizing: content-box; color: var(--color-icon-primary);" width="32" height="32" viewBox="0 0 16 16" fill="none" data-view-component="true" class="anim-rotate">
{{ refName }} default
          <footer class="SelectMenu-footer"><a href="/eyedeekay/i2p.plugins.firefox/branches">View all branches</a></footer>
      </ref-selector>

    </div>

    <div role="tabpanel" id="tags-menu" data-filter-placeholder="Find a tag" tabindex="" hidden class="d-flex flex-column flex-auto overflow-auto">
      <ref-selector
        type="tag"
        data-action="
          input-entered:ref-selector#inputEntered
          tab-selected:ref-selector#tabSelected
          focus-list:ref-selector#focusFirstListMember
        "
        data-targets="input-demux.sinks"
        query-endpoint="/eyedeekay/i2p.plugins.firefox/refs"
        cache-key="v0:1669180551.131469"
        current-committish="OTUxZWRlYWI5Mjg2OGNlMWUzMzcyMmIxMmE4YzY4MzQ3MTk2YzlhNQ=="
        default-branch="bWFpbg=="
        name-with-owner="ZXllZGVla2F5L2kycC5wbHVnaW5zLmZpcmVmb3g="
      >

        <template data-target="ref-selector.fetchFailedTemplate">
          <div class="SelectMenu-message" data-index="{{ index }}">Could not load tags</div>
        </template>

        <template data-target="ref-selector.noMatchTemplate">
          <div class="SelectMenu-message" data-index="{{ index }}">Nothing to show</div>
        </template>
{{ refName }} default
        <div data-target="ref-selector.listContainer" role="menu" class="SelectMenu-list" data-turbo-frame="repo-content-turbo-frame">
          <div class="SelectMenu-loading pt-3 pb-0 overflow-hidden" aria-label="Menu is loading">
            <svg style="box-sizing: content-box; color: var(--color-icon-primary);" width="32" height="32" viewBox="0 0 16 16" fill="none" data-view-component="true" class="anim-rotate">
View all tags
<header class="Overlay-header Overlay-header--large Overlay-header--divided">

Name already in use

</header>
      <div data-view-component="true">      A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
</div>
  <footer class="Overlay-footer Overlay-footer--alignEnd">
        <button data-close-dialog-id="warn-tag-match-create-branch-dialog" type="button" data-view-component="true" class="btn">    Cancel
Create

i2p.plugins.firefox/docs/BUILD.md

Go to file
  • Go to file
  • Go to line
  •         Copy path
    

  •         <span class="d-flex flex-items-baseline">
              <span class="flex-auto">Copy permalink</span>
            </span>
    

<div id="spoof-warning" class="mt-0 pb-3" hidden aria-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 float-left mt-1">
<path fill-rule="evenodd" d="M8.22 1.754a.25.25 0 00-.44 0L1.698 13.132a.25.25 0 00.22.368h12.164a.25.25 0 00.22-.368L8.22 1.754zm-1.763-.707c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0114.082 15H1.918a1.75 1.75 0 01-1.543-2.575L6.457 1.047zM9 11a1 1 0 11-2 0 1 1 0 012 0zm-.25-5.25a.75.75 0 00-1.5 0v2.5a.75.75 0 001.5 0v-2.5z"></path>
  <div class="overflow-hidden">This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.</div>
<include-fragment src="/eyedeekay/i2p.plugins.firefox/spoofed_commit_check/951edeab92868ce1e33722b12a8c68347196c9a5" data-test-selector="spoofed-commit-check"></include-fragment>

<div class="Box d-flex flex-column flex-shrink-0 mb-3">
 
<div class="Box-body d-flex flex-items-center" >
  <div class="Skeleton Skeleton--text col-1">&nbsp;</div>
  <span class="color-fg-danger h6 loader-error">Cannot retrieve contributors at this time</span>
</div>

<readme-toc>

<div data-target="readme-toc.content" class="Box mt-3 position-relative">
  <details

data-target="readme-toc.trigger" data-menu-hydro-click="{"event_type":"repository_toc_menu.click","payload":{"target":"trigger","repository_id":522351978,"originating_url":"951edeab92/docs/BUILD.md","user_id":null}}" data-menu-hydro-click-hmac="697adaf456a30d0434dab58decfa2ed05c93cdb00acb3735c694c92c43a02d16" class="dropdown details-reset details-overlay"

    <div class="SelectMenu-filter">
      <input
        class="SelectMenu-input form-control js-filterable-field"
        id="toc-filter-field"
        type="text"
        autocomplete="off"
        spellcheck="false"
        autofocus
        placeholder="Filter headings"
        aria-label="Filter headings">
    </div>

  <div class="SelectMenu-list SelectMenu-list--borderless p-2" style="overscroll-behavior: contain;" data-filterable-for="toc-filter-field" data-filterable-type="substring">
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 text-emphasized" style="-webkit-box-orient: vertical; padding-left: 12px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#building">Building</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 24px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#build-dependencies">Build Dependencies</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 24px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#building-1">Building</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 24px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#browser-discovery-methods">Browser Discovery Methods</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 24px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#usability-vs-strict">Usability vs Strict</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 36px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#usability-mode">Usability Mode</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 48px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#usability-extension-set">Usability Extension Set</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 36px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#usability-userjs-characteristics">Usability user.js characteristics</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 36px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#strict-mode">Strict Mode</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 48px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#strict-extension-set">Strict Extension Set</a>
      <a role="menuitem" class="filter-item SelectMenu-item ws-normal wb-break-word line-clamp-2 py-1 " style="-webkit-box-orient: vertical; padding-left: 48px;" data-action="click:readme-toc#blur" data-targets="readme-toc.entries" data-hydro-click="{&quot;event_type&quot;:&quot;repository_toc_menu.click&quot;,&quot;payload&quot;:{&quot;target&quot;:&quot;entry&quot;,&quot;repository_id&quot;:522351978,&quot;originating_url&quot;:&quot;https://github.com/eyedeekay/i2p.plugins.firefox/blob/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md&quot;,&quot;user_id&quot;:null}}" data-hydro-click-hmac="cd7950cb9247da6b1a29546d60ce864e6335f1cf9a09ca5a3ad50e631556ce11" href="#strict-userjs-characteristics">Strict user.js characteristics</a>
  </div>
</div>
  <span class="file-mode" title="File mode">executable file</span>
  <span class="file-info-divider"></span>
  228 lines (169 sloc)
  <span class="file-info-divider"></span>
7.59 KB
<div class="BtnGroup">
    <a href="/eyedeekay/i2p.plugins.firefox/raw/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md" id="raw-url" data-view-component="true" class="btn-sm btn BtnGroup-item">    Raw

Blame

<div class="d-flex">
Edit this file
E
          <button aria-label="You must be on a branch to open this file in GitHub Desktop" data-platforms="windows,mac" data-test-selector="github-desktop-disabled-button" disabled="disabled" type="submit" data-view-component="true" class="SelectMenu-item no-wrap js-remove-unless-platform btn-invisible btn text-normal">    Open in GitHub Desktop

      <button class="btn-octicon btn-octicon-danger disabled tooltipped tooltipped-nw" disabled
        aria-label="You must be signed in to make or propose changes" type="button">
        <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 fill-rule="evenodd" d="M6.5 1.75a.25.25 0 01.25-.25h2.5a.25.25 0 01.25.25V3h-3V1.75zm4.5 0V3h2.25a.75.75 0 010 1.5H2.75a.75.75 0 010-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75zM4.496 6.675a.75.75 0 10-1.492.15l.66 6.6A1.75 1.75 0 005.405 15h5.19c.9 0 1.652-.681 1.741-1.576l.66-6.6a.75.75 0 00-1.492-.149l-.66 6.6a.25.25 0 01-.249.225h-5.19a.25.25 0 01-.249-.225l-.66-6.6z"></path>
<div class="d-flex hide-lg hide-xl flex-order-2 flex-grow-0">
  <details class="dropdown details-reset details-overlay d-inline-block">
    <summary
      class="js-blob-dropdown-click btn-octicon p-2"
      aria-haspopup="true"
      aria-label="possible actions"
      data-test-selector="small-screen-more-options"
      data-dropdown-tracking="{&quot;type&quot;:&quot;blob_edit_dropdown.more_options_click&quot;,&quot;context&quot;:{&quot;repository_id&quot;:522351978,&quot;actor_id&quot;:null,&quot;github_dev_enabled&quot;:false,&quot;edit_enabled&quot;:false,&quot;small_screen&quot;:true}}"
    >
      <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">
<path d="M8 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM1.5 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm13 0a1.5 1.5 0 100-3 1.5 1.5 0 000 3z"></path>
    <ul class="dropdown-menu dropdown-menu-sw" style="width: 175px">
        <li>
        </li>
      <li>
        <a class="dropdown-item" href="/eyedeekay/i2p.plugins.firefox/raw/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md">
          View raw
        </a>
      </li>
        <li>
                      </li>
        <li>
          <a class="dropdown-item" href="/eyedeekay/i2p.plugins.firefox/blame/951edeab92868ce1e33722b12a8c68347196c9a5/docs/BUILD.md">
            View blame
          </a>
        </li>

    </ul>
  </details>
</div>
    <div id="readme" class="Box-body readme blob js-code-block-container p-5 p-xl-6 gist-border-0">
<article class="markdown-body entry-content container-lg" itemprop="text"><h1 dir="auto"><a id="user-content-building" class="anchor" aria-hidden="true" href="#building"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a>Building</h1>

Build Dependencies

You will need ant and java java and for building the jar. You will need jpackage for many of the potential build targets. I've been using Java 18 on Debian mostly, on Debian and Ubuntu, install the dependencies with:

sudo apt-get install openjdk-18* ant

Some of the targets use scripts written in Go to help generate resources. If you want to update the profiles, you will need them. To install Go on Debian and Ubuntu:

sudo apt-get install golang-go

Add $HOME/go/bin to your $PATH so ant can find Go applications.

export PATH=$PATH:$HOME/go/bin

Then use Go to download the applications you need and add them to $HOME/go/bin.

If you want to build the Chromium profiles you will need a Go application called crx3 which is used to interact with the Chrome app store to download and update extensions.

go install github.com/mediabuyerbot/go-crx3/crx3@latest

Another Go application, called amo-version, is used to fetch extensions from addons.mozilla.org. Like the Chrome profiles, generating the Firefox profiles requires this application. If you don't want to update the profiles, you don't need it.

go install github.com/eyedeekay/amo-version@latest

One last Go application, called dzip is used to generate zip files deterministically for redistribution.

go install github.com/delicb/dzip@latest

If you don't want to use it, you can work around it by creating a file called dzip in /usr/local/bin/dzip and adding the contents:

#! /usr/bin/env sh
zip -r $@

This will break deterministic builds, but for testing it will continue to work. More elaborate scripts or other deterministic zip utilities can be easily substituted in by placing them in the $PATH under the name dzip.

For Fedora, use Yum, for Arch use pacman or something else but make sure to tell everyone about it. Once you have that installed, when building, make sure to add $GOPATH/bin/ to your $PATH.

export PATH=$PATH:$HOME/go/bin

Will almost always work.

Building

This is not actually a plugin yet, but it will be soon. The important bit is the jar. To generate that, you can either generate the full plugin, which will not work but produces the jar as a by-product, or you can:

ant jar

To build just the jar. You'll know it worked if you can:

java -cp ./src/build/i2pfirefox.jar net.i2p.i2pfirefox.I2PFirefox

and a new Firefox instance comes up with a fresh profile, ready-to-use for I2P browsing.

The cooler thing you can do with it is add it to an I2P distribution and somewhere in it, add a UI element that triggers something along the lines of this:

// Firefox Example
if (i2pIsRunning()) {
    logger.warning("I2P is already running");
    System.out.println("I2PFirefox");
    I2PFirefox i2pFirefox = new I2PFirefox();
    i2pFirefox.launch();
}
// Chromium Example
if (i2pIsRunning()) {
    logger.warning("I2P is already running");
    System.out.println("I2PChromium");
    I2PChromium i2pChromium = new I2PChromium();
    i2pChromium.launch();
}
// Auto-Select Example, chooses Firefox first, then Chromium
if (i2pIsRunning()) {
    logger.warning("I2P is already running");
    System.out.println("I2PBrowser");
    I2PBrowser i2pBrowser = new I2PBrowser();
    /*
     * toggle chromium to the top of the order by doing:
    I2PBrowser.chromiumFirst = true;
     * 
    */
    i2pBrowser.launch(privateBrowsing);
}

to add a browser management tool to it.

Browser Discovery Methods

This tool looks for browsers on the host system, creates a workspace to use for I2P purposes, and launches the browser inside of that workspace. The details of the workspace vary from browser to browser but roughly corresponds to a browser profile. In order to be successful this tool uses 3 main types of browser discovery methods, in this order:

  1. "Local" discovery, where a browser is in a subdirectory of the directory where you ran the launcher. This will only happen if the user unpacked a portable browser into the same directory where they ran the launcher.
  2. "Path-Based" discovery, where it scans common browser installation directories until it finds one which it can use. On Unix, it simply scans the directories on the PATH for a browser it knows about. On Windows, default paths to browser install directories are hard-coded and included in the binary. This is what usually happens.
  3. "System-Based" discovery, where it defers to the host system to make a choice about the browser and counts on browser vendors to honor the system proxy environment variables. This is a catch-all solution which works with most browsers, but does not apply any customizations.

There is a little subtlety here though.

  • The path to Edgium on Windows will always resolve during path-based discovery, resulting in a positive test for Chromium when launching the browser in auto-select mode. So Windows will never reach stage 3 unless expressly forced to. If Firefox or a variant is installed, it will be chosen before Edgium unless directed otherwise.
  • Even though it will launch you into Edgium if it has no other choice, I recommend you do not use it. Edgium will in a constant, incessant way try to induce you to share your behavior with Microsoft. If you try to resist this, it negatively affects the performance of the browser. Google also does this with Chrome, ant this negatively affects Chrome performance too, but less than with Edgium. TL:DR Edgium sucks and is pointless and terrible. Literally any other browser would be better.
  • Linux is unaware of a Tor Browser path because Tor Browser is rarely, if ever, installed on-path. What is on path is virtually always a wrapper for Tor Browser which is installed either as the main user or it's own user. Linux will only use Tor Browser if it's discovered in "Local" mode. To set this up automatically, you can cd to the I2P directory where you unpacked the .tar.gz file, and run the ./lib/torbrowser.sh script from there.
  • I really only test Phase 3 with Dillo and Edgium. YMMV.

Usability vs Strict

This is basically a profile-management tool geared toward minimizing the differences between browser users which are passively discernible while they are browsing I2P. It assumes that they are part of a highly fragmented browsing environment where they are already unique, and therefore consolidation on configuration is a goal. However, this goal sometimes also conflicts with usability. To allow users a safe set of choices, we offer "Coarse" configuration in 2 modes. We recommend that you do not deviate from these configurations if you have browser application fingerprinting as a concern.

Usability Mode

TODO: description

Pros: Allows a restricted subset of Javascript Pros: Less likely to try and reach the clearnet

Cons: Looks very different from Tor Browser Cons: Plugin updates can create temporary uniqueness

Usability Extension Set

  • I2P In Private Browsing
  • uMatrix
  • jsRestrictor
  • LocalCDN
  • Onion in Container Tabs
  • HTTPS EveryWhere in some configurations

Usability user.js characteristics

TODO: Summarize differences

Strict Mode

TODO: description

Pros: Does not allow Javascript by default Pros: Looks a lot like Tor Browser especially if you're using Tor Browser

Cons: More work to use Cons: Temporary uniqueness can be created by enabling Javascript for specific sites Cons: More likely to try and reach the clearnet

Strict Extension Set

  • NoScript
  • I2P In Private Browsing
  • HTTPS EveryWhere in some configurations

Strict user.js characteristics

TODO: Summarize differences

</div>
Go
</main>
      <footer class="footer width-full container-xl p-responsive">

Footer

© 2022 GitHub, Inc.
<nav aria-label='footer' class="col-12 col-lg-8">
  <h3 class='sr-only' id='sr-footer-heading'>Footer navigation</h3>
  <ul class="list-style-none d-flex flex-wrap col-12 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0" aria-labelledby='sr-footer-heading'>
      <li class="mr-3 mr-lg-0"><a href="https://docs.github.com/en/github/site-policy/github-terms-of-service" data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to terms&quot;,&quot;label&quot;:&quot;text:terms&quot;}">Terms</a></li>
      <li class="mr-3 mr-lg-0"><a href="https://docs.github.com/en/github/site-policy/github-privacy-statement" data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to privacy&quot;,&quot;label&quot;:&quot;text:privacy&quot;}">Privacy</a></li>
      <li class="mr-3 mr-lg-0"><a data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to security&quot;,&quot;label&quot;:&quot;text:security&quot;}" href="https://github.com/security">Security</a></li>
      <li class="mr-3 mr-lg-0"><a href="https://www.githubstatus.com/" data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to status&quot;,&quot;label&quot;:&quot;text:status&quot;}">Status</a></li>
      <li class="mr-3 mr-lg-0"><a data-ga-click="Footer, go to help, text:Docs" href="https://docs.github.com">Docs</a></li>
      <li class="mr-3 mr-lg-0"><a href="https://support.github.com?tags=dotcom-footer" data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to contact&quot;,&quot;label&quot;:&quot;text:contact&quot;}">Contact GitHub</a></li>
      <li class="mr-3 mr-lg-0"><a href="https://github.com/pricing" data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to Pricing&quot;,&quot;label&quot;:&quot;text:Pricing&quot;}">Pricing</a></li>
    <li class="mr-3 mr-lg-0"><a href="https://docs.github.com" data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to api&quot;,&quot;label&quot;:&quot;text:api&quot;}">API</a></li>
    <li class="mr-3 mr-lg-0"><a href="https://services.github.com" data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to training&quot;,&quot;label&quot;:&quot;text:training&quot;}">Training</a></li>
      <li class="mr-3 mr-lg-0"><a href="https://github.blog" data-analytics-event="{&quot;category&quot;:&quot;Footer&quot;,&quot;action&quot;:&quot;go to blog&quot;,&quot;label&quot;:&quot;text:blog&quot;}">Blog</a></li>
      <li><a data-ga-click="Footer, go to about, text:about" href="https://github.com/about">About</a></li>
  </ul>
</nav>
You cant perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
<div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;" tabindex="0">
<template id="snippet-clipboard-copy-button">
</div>

<div id="js-global-screen-reader-notice" class="sr-only" aria-live="polite" ></div>
</html>