gitextract_it3wvh4t/ ├── .drone.yml ├── .git-crypt/ │ ├── .gitattributes │ └── keys/ │ └── default/ │ └── 0/ │ ├── 3A1172187EF7406FCBCECFA60E68C4F85D04D8FC.gpg │ ├── A08EA82ED095FCD8575AB3742DC613553716A878.gpg │ ├── E6711893CE02FDEEA5B1F79FF3D83146E5111526.gpg │ └── EA440246DFB690B5B1FB4032CE011C4615DB040A.gpg ├── .gitattributes ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── devtools/ │ ├── ES_queries/ │ │ └── Recipient_suggest.json │ ├── Vagrantfile │ ├── api-mock/ │ │ ├── README.md │ │ ├── all.fixture.js │ │ ├── authentications/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── bin/ │ │ │ └── start │ │ ├── collection-middleware/ │ │ │ └── index.js │ │ ├── contacts/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── devices/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── discussions/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── local_identities/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── me/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── messages/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── notifications/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── oauth-mock/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── package.json │ │ ├── participants/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── providers/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── remote_identities/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── search/ │ │ │ ├── data.json │ │ │ └── index.js │ │ ├── settings/ │ │ │ ├── data.json │ │ │ └── index.js │ │ └── tags/ │ │ ├── data.json │ │ └── index.js │ ├── clean-dev-storage.sh │ ├── conf/ │ │ └── proxy-api.conf │ ├── docker-compose.staging.yml │ ├── docker-compose.yml │ ├── drone/ │ │ ├── build_images.sh │ │ ├── files_changed.sh │ │ ├── get_go_dependencies.sh │ │ ├── get_py_dependencies.sh │ │ ├── test_front.sh │ │ ├── test_go.sh │ │ └── test_py.sh │ ├── extract/ │ │ └── email_graph.py │ ├── fixtures/ │ │ ├── mbox/ │ │ │ ├── dev@caliopen.local/ │ │ │ │ ├── 1460463561.5266_1.argentina:2, │ │ │ │ ├── 1460463561.5266_11.argentina:2, │ │ │ │ ├── 1460463561.5266_13.argentina:2, │ │ │ │ ├── 1460463561.5266_15.argentina:2, │ │ │ │ ├── 1460463561.5266_17.argentina:2, │ │ │ │ ├── 1460463561.5266_19.argentina:2, │ │ │ │ ├── 1460463561.5266_21.argentina:2, │ │ │ │ ├── 1460463561.5266_23.argentina:2, │ │ │ │ ├── 1460463561.5266_25.argentina:2, │ │ │ │ ├── 1460463561.5266_27.argentina:2, │ │ │ │ ├── 1460463561.5266_29.argentina:2, │ │ │ │ ├── 1460463561.5266_3.argentina:2, │ │ │ │ ├── 1460463561.5266_31.argentina:2, │ │ │ │ ├── 1460463561.5266_33.argentina:2, │ │ │ │ ├── 1460463561.5266_35.argentina:2, │ │ │ │ ├── 1460463561.5266_37.argentina:2, │ │ │ │ ├── 1460463561.5266_39.argentina:2, │ │ │ │ ├── 1460463561.5266_41.argentina:2, │ │ │ │ ├── 1460463561.5266_43.argentina:2, │ │ │ │ ├── 1460463561.5266_45.argentina:2, │ │ │ │ ├── 1460463561.5266_47.argentina:2, │ │ │ │ ├── 1460463561.5266_49.argentina:2, │ │ │ │ ├── 1460463561.5266_5.argentina:2, │ │ │ │ ├── 1460463561.5266_51.argentina:2, │ │ │ │ ├── 1460463561.5266_53.argentina:2, │ │ │ │ ├── 1460463561.5266_55.argentina:2, │ │ │ │ ├── 1460463561.5266_57.argentina:2, │ │ │ │ ├── 1460463561.5266_59.argentina:2, │ │ │ │ ├── 1460463561.5266_61.argentina:2, │ │ │ │ ├── 1460463561.5266_63.argentina:2, │ │ │ │ ├── 1460463561.5266_7.argentina:2, │ │ │ │ ├── 1460463561.5266_9.argentina:2, │ │ │ │ ├── 1460463562.5266_101.argentina:2, │ │ │ │ ├── 1460463562.5266_103.argentina:2, │ │ │ │ ├── 1460463562.5266_105.argentina:2, │ │ │ │ ├── 1460463562.5266_107.argentina:2, │ │ │ │ ├── 1460463562.5266_109.argentina:2, │ │ │ │ ├── 1460463562.5266_111.argentina:2, │ │ │ │ ├── 1460463562.5266_113.argentina:2, │ │ │ │ ├── 1460463562.5266_115.argentina:2, │ │ │ │ ├── 1460463562.5266_117.argentina:2, │ │ │ │ ├── 1460463562.5266_119.argentina:2, │ │ │ │ ├── 1460463562.5266_121.argentina:2, │ │ │ │ ├── 1460463562.5266_123.argentina:2, │ │ │ │ ├── 1460463562.5266_125.argentina:2, │ │ │ │ ├── 1460463562.5266_127.argentina:2, │ │ │ │ ├── 1460463562.5266_129.argentina:2, │ │ │ │ ├── 1460463562.5266_131.argentina:2, │ │ │ │ ├── 1460463562.5266_133.argentina:2, │ │ │ │ ├── 1460463562.5266_135.argentina:2, │ │ │ │ ├── 1460463562.5266_137.argentina:2, │ │ │ │ ├── 1460463562.5266_139.argentina:2, │ │ │ │ ├── 1460463562.5266_141.argentina:2, │ │ │ │ ├── 1460463562.5266_143.argentina:2, │ │ │ │ ├── 1460463562.5266_145.argentina:2, │ │ │ │ ├── 1460463562.5266_147.argentina:2, │ │ │ │ ├── 1460463562.5266_149.argentina:2, │ │ │ │ ├── 1460463562.5266_151.argentina:2, │ │ │ │ ├── 1460463562.5266_153.argentina:2, │ │ │ │ ├── 1460463562.5266_65.argentina:2, │ │ │ │ ├── 1460463562.5266_67.argentina:2, │ │ │ │ ├── 1460463562.5266_69.argentina:2, │ │ │ │ ├── 1460463562.5266_71.argentina:2, │ │ │ │ ├── 1460463562.5266_73.argentina:2, │ │ │ │ ├── 1460463562.5266_75.argentina:2, │ │ │ │ ├── 1460463562.5266_77.argentina:2, │ │ │ │ ├── 1460463562.5266_79.argentina:2, │ │ │ │ ├── 1460463562.5266_81.argentina:2, │ │ │ │ ├── 1460463562.5266_83.argentina:2, │ │ │ │ ├── 1460463562.5266_85.argentina:2, │ │ │ │ ├── 1460463562.5266_87.argentina:2, │ │ │ │ ├── 1460463562.5266_89.argentina:2, │ │ │ │ ├── 1460463562.5266_91.argentina:2, │ │ │ │ ├── 1460463562.5266_93.argentina:2, │ │ │ │ ├── 1460463562.5266_95.argentina:2, │ │ │ │ ├── 1460463562.5266_97.argentina:2, │ │ │ │ ├── 1460463562.5266_99.argentina:2, │ │ │ │ ├── 1460463563.5266_155.argentina:2, │ │ │ │ ├── 1460463563.5266_157.argentina:2, │ │ │ │ ├── 1460463563.5266_159.argentina:2, │ │ │ │ ├── 1460463563.5266_161.argentina:2, │ │ │ │ ├── 1460463563.5266_163.argentina:2, │ │ │ │ ├── 1460463563.5266_165.argentina:2, │ │ │ │ ├── 1460463563.5266_167.argentina:2, │ │ │ │ ├── 1460463563.5266_169.argentina:2, │ │ │ │ ├── 1460463563.5266_171.argentina:2, │ │ │ │ ├── 1460463563.5266_173.argentina:2, │ │ │ │ ├── 1460463563.5266_175.argentina:2, │ │ │ │ ├── 1460463563.5266_177.argentina:2, │ │ │ │ ├── 1460463563.5266_179.argentina:2, │ │ │ │ ├── 1460463563.5266_181.argentina:2, │ │ │ │ ├── 1460463563.5266_183.argentina:2, │ │ │ │ ├── 1460463563.5266_185.argentina:2, │ │ │ │ ├── 1460463563.5266_187.argentina:2, │ │ │ │ ├── 1460463563.5266_189.argentina:2, │ │ │ │ ├── 1460463563.5266_193.argentina:2, │ │ │ │ ├── 1460463563.5266_195.argentina:2, │ │ │ │ ├── 1460463563.5266_197.argentina:2, │ │ │ │ ├── 1460463563.5266_199.argentina:2, │ │ │ │ ├── 1460463563.5266_201.argentina:2, │ │ │ │ ├── 1460463563.5266_205.argentina:2, │ │ │ │ ├── 1460463563.5266_207.argentina:2, │ │ │ │ ├── 1460463563.5266_209.argentina:2, │ │ │ │ ├── 1460463563.5266_211.argentina:2, │ │ │ │ ├── 1460463563.5266_213.argentina:2, │ │ │ │ ├── 1460463563.5266_215.argentina:2, │ │ │ │ ├── 1460463563.5266_217.argentina:2, │ │ │ │ ├── 1460463563.5266_219.argentina:2, │ │ │ │ ├── 1460463563.5266_221.argentina:2, │ │ │ │ ├── 1460463563.5266_223.argentina:2, │ │ │ │ ├── 1460463563.5266_225.argentina:2, │ │ │ │ ├── 1460463563.5266_227.argentina:2, │ │ │ │ ├── 1460463563.5266_229.argentina:2, │ │ │ │ ├── 1460463563.5266_231.argentina:2, │ │ │ │ ├── 1460463563.5266_233.argentina:2, │ │ │ │ ├── 1460463563.5266_235.argentina:2, │ │ │ │ ├── 1460463563.5266_237.argentina:2, │ │ │ │ ├── 1460463563.5266_239.argentina:2, │ │ │ │ ├── 1460463563.5266_241.argentina:2, │ │ │ │ ├── 1460463563.5266_243.argentina:2, │ │ │ │ ├── 1460463564.5266_245.argentina:2, │ │ │ │ ├── 1460463564.5266_247.argentina:2, │ │ │ │ ├── 1460463564.5266_249.argentina:2, │ │ │ │ ├── 1460463564.5266_253.argentina:2, │ │ │ │ ├── 1460463564.5266_255.argentina:2, │ │ │ │ ├── 1460463564.5266_257.argentina:2, │ │ │ │ ├── 1460463564.5266_259.argentina:2, │ │ │ │ ├── 1460463564.5266_261.argentina:2, │ │ │ │ ├── 1460463564.5266_263.argentina:2, │ │ │ │ ├── 1460463564.5266_265.argentina:2, │ │ │ │ ├── 1460463564.5266_267.argentina:2, │ │ │ │ ├── 1460463564.5266_269.argentina:2, │ │ │ │ ├── 1460463564.5266_271.argentina:2, │ │ │ │ ├── 1460463564.5266_273.argentina:2, │ │ │ │ ├── 1460463564.5266_275.argentina:2, │ │ │ │ ├── 1460463564.5266_277.argentina:2, │ │ │ │ ├── 1460463564.5266_279.argentina:2, │ │ │ │ ├── 1460463564.5266_281.argentina:2, │ │ │ │ ├── 1460463564.5266_283.argentina:2, │ │ │ │ ├── 1460463564.5266_285.argentina:2, │ │ │ │ ├── 1460463564.5266_287.argentina:2, │ │ │ │ ├── 1460463564.5266_289.argentina:2, │ │ │ │ ├── 1460463564.5266_291.argentina:2, │ │ │ │ ├── 1460463564.5266_293.argentina:2, │ │ │ │ ├── 1460463564.5266_295.argentina:2, │ │ │ │ ├── 1460463564.5266_297.argentina:2, │ │ │ │ ├── 1460463564.5266_299.argentina:2, │ │ │ │ ├── 1460463564.5266_301.argentina:2, │ │ │ │ ├── 1460463564.5266_303.argentina:2, │ │ │ │ ├── 1460463564.5266_305.argentina:2, │ │ │ │ ├── 1460463564.5266_307.argentina:2, │ │ │ │ ├── 1460463564.5266_309.argentina:2, │ │ │ │ ├── 1460463564.5266_311.argentina:2, │ │ │ │ ├── 1460463564.5266_313.argentina:2, │ │ │ │ ├── 1460463564.5266_315.argentina:2, │ │ │ │ ├── 1460463564.5266_317.argentina:2, │ │ │ │ ├── 1460463564.5266_319.argentina:2, │ │ │ │ ├── 1460463564.5266_321.argentina:2, │ │ │ │ ├── 1460463564.5266_323.argentina:2, │ │ │ │ ├── 1460463564.5266_325.argentina:2, │ │ │ │ ├── 1460463564.5266_327.argentina:2, │ │ │ │ ├── 1460463564.5266_329.argentina:2, │ │ │ │ ├── 1460463564.5266_331.argentina:2, │ │ │ │ ├── 1460463564.5266_333.argentina:2, │ │ │ │ ├── 1460463564.5266_335.argentina:2, │ │ │ │ ├── 1460463564.5266_337.argentina:2, │ │ │ │ ├── 1460463564.5266_339.argentina:2, │ │ │ │ ├── 1460463564.5266_341.argentina:2, │ │ │ │ ├── 1460463564.5266_343.argentina:2, │ │ │ │ ├── 1460463565.5266_345.argentina:2, │ │ │ │ ├── 1460463565.5266_347.argentina:2, │ │ │ │ ├── 1460463565.5266_349.argentina:2, │ │ │ │ ├── 1460463565.5266_351.argentina:2, │ │ │ │ ├── 1460463565.5266_353.argentina:2, │ │ │ │ ├── 1460463565.5266_355.argentina:2, │ │ │ │ ├── 1460463565.5266_357.argentina:2, │ │ │ │ ├── 1460463565.5266_359.argentina:2, │ │ │ │ ├── 1460463565.5266_361.argentina:2, │ │ │ │ ├── 1460463565.5266_363.argentina:2, │ │ │ │ ├── 1460463565.5266_365.argentina:2, │ │ │ │ ├── 1460463565.5266_367.argentina:2, │ │ │ │ ├── 1460463565.5266_369.argentina:2, │ │ │ │ ├── 1460463565.5266_371.argentina:2, │ │ │ │ ├── 1460463565.5266_373.argentina:2, │ │ │ │ ├── 1460463565.5266_375.argentina:2, │ │ │ │ ├── 1460463565.5266_377.argentina:2, │ │ │ │ ├── 1460463565.5266_379.argentina:2, │ │ │ │ ├── 1460463565.5266_381.argentina:2, │ │ │ │ ├── 1460463565.5266_383.argentina:2, │ │ │ │ ├── 1460463565.5266_385.argentina:2, │ │ │ │ ├── 1460463565.5266_387.argentina:2, │ │ │ │ ├── 1460463565.5266_389.argentina:2, │ │ │ │ ├── 1460463565.5266_391.argentina:2, │ │ │ │ ├── 1460463565.5266_393.argentina:2, │ │ │ │ ├── 1460463565.5266_395.argentina:2, │ │ │ │ ├── 1460463565.5266_397.argentina:2, │ │ │ │ ├── 1460463565.5266_399.argentina:2, │ │ │ │ ├── 1460463565.5266_401.argentina:2, │ │ │ │ ├── 1460463565.5266_403.argentina:2, │ │ │ │ ├── 1460463565.5266_405.argentina:2, │ │ │ │ ├── 1460463565.5266_407.argentina:2, │ │ │ │ ├── 1460463565.5266_409.argentina:2, │ │ │ │ ├── 1460463565.5266_411.argentina:2, │ │ │ │ ├── 1460463565.5266_413.argentina:2, │ │ │ │ ├── 1460463565.5266_415.argentina:2, │ │ │ │ ├── 1460463565.5266_417.argentina:2, │ │ │ │ ├── 1460463565.5266_419.argentina:2, │ │ │ │ ├── 1460463565.5266_421.argentina:2, │ │ │ │ ├── 1460463565.5266_423.argentina:2, │ │ │ │ ├── 1460463565.5266_425.argentina:2, │ │ │ │ ├── 1460463565.5266_427.argentina:2, │ │ │ │ ├── 1460463565.5266_429.argentina:2, │ │ │ │ ├── 1460463565.5266_431.argentina:2, │ │ │ │ ├── 1460463565.5266_433.argentina:2, │ │ │ │ ├── 1460463565.5266_435.argentina:2, │ │ │ │ ├── 1460463566.5266_437.argentina:2, │ │ │ │ ├── 1460463566.5266_439.argentina:2, │ │ │ │ ├── 1460463566.5266_441.argentina:2, │ │ │ │ ├── 1460463566.5266_443.argentina:2, │ │ │ │ ├── 1460463566.5266_445.argentina:2, │ │ │ │ ├── 1460463566.5266_447.argentina:2, │ │ │ │ ├── 1460463566.5266_449.argentina:2, │ │ │ │ ├── 1460463566.5266_451.argentina:2, │ │ │ │ ├── 1460463566.5266_453.argentina:2, │ │ │ │ ├── 1460463566.5266_455.argentina:2, │ │ │ │ ├── 1460463566.5266_457.argentina:2, │ │ │ │ ├── 1460463566.5266_459.argentina:2, │ │ │ │ ├── 1460463566.5266_461.argentina:2, │ │ │ │ ├── 1460463566.5266_463.argentina:2, │ │ │ │ ├── 1460463566.5266_465.argentina:2, │ │ │ │ ├── 1460463566.5266_467.argentina:2, │ │ │ │ ├── 1460463566.5266_469.argentina:2, │ │ │ │ ├── 1460463566.5266_471.argentina:2, │ │ │ │ ├── 1460463566.5266_473.argentina:2, │ │ │ │ ├── 1460463566.5266_475.argentina:2, │ │ │ │ ├── 1460463567.5266_477.argentina:2, │ │ │ │ ├── 1460463567.5266_483.argentina:2, │ │ │ │ ├── 1460463567.5266_485.argentina:2, │ │ │ │ ├── 1460463567.5266_487.argentina:2, │ │ │ │ ├── 1460463567.5266_489.argentina:2, │ │ │ │ ├── 1460463567.5266_491.argentina:2, │ │ │ │ ├── 1460463567.5266_493.argentina:2, │ │ │ │ ├── 1460463567.5266_495.argentina:2, │ │ │ │ ├── 1460463567.5266_497.argentina:2, │ │ │ │ ├── 1460463567.5266_499.argentina:2, │ │ │ │ ├── 1460463567.5266_503.argentina:2, │ │ │ │ ├── 1460463567.5266_505.argentina:2, │ │ │ │ ├── 1460463567.5266_507.argentina:2, │ │ │ │ ├── 1460463567.5266_509.argentina:2, │ │ │ │ ├── 1460463567.5266_511.argentina:2, │ │ │ │ ├── 1460463567.5266_513.argentina:2, │ │ │ │ ├── 1460463567.5266_515.argentina:2, │ │ │ │ ├── 1460463567.5266_517.argentina:2, │ │ │ │ ├── 1460463567.5266_519.argentina:2, │ │ │ │ ├── 1460463567.5266_521.argentina:2, │ │ │ │ ├── 1460463567.5266_525.argentina:2, │ │ │ │ ├── 1460463567.5266_527.argentina:2, │ │ │ │ ├── 1460463567.5266_529.argentina:2, │ │ │ │ ├── 1460463567.5266_531.argentina:2, │ │ │ │ ├── 1460463568.5266_533.argentina:2, │ │ │ │ ├── 1460463568.5266_535.argentina:2, │ │ │ │ ├── 1460463568.5266_537.argentina:2, │ │ │ │ ├── 1460463568.5266_539.argentina:2, │ │ │ │ ├── 1460463568.5266_541.argentina:2, │ │ │ │ ├── 1460463568.5266_543.argentina:2, │ │ │ │ ├── 1460463568.5266_545.argentina:2, │ │ │ │ ├── 1460463568.5266_547.argentina:2, │ │ │ │ ├── 1460463568.5266_549.argentina:2, │ │ │ │ ├── 1460463568.5266_551.argentina:2, │ │ │ │ ├── 1460463568.5266_553.argentina:2, │ │ │ │ ├── 1460463568.5266_555.argentina:2, │ │ │ │ ├── 1460463568.5266_557.argentina:2, │ │ │ │ ├── 1460463568.5266_559.argentina:2, │ │ │ │ ├── 1460463568.5266_561.argentina:2, │ │ │ │ ├── 1460463568.5266_563.argentina:2, │ │ │ │ ├── 1460463568.5266_565.argentina:2, │ │ │ │ ├── 1460463568.5266_567.argentina:2, │ │ │ │ ├── 1460463568.5266_569.argentina:2, │ │ │ │ ├── 1460463568.5266_571.argentina:2, │ │ │ │ ├── 1460463568.5266_573.argentina:2, │ │ │ │ ├── 1460463568.5266_575.argentina:2, │ │ │ │ ├── 1460463568.5266_577.argentina:2, │ │ │ │ ├── 1460463568.5266_579.argentina:2, │ │ │ │ ├── 1460463568.5266_581.argentina:2, │ │ │ │ ├── 1460463568.5266_583.argentina:2, │ │ │ │ ├── 1460463568.5266_585.argentina:2, │ │ │ │ ├── 1460463568.5266_587.argentina:2, │ │ │ │ ├── 1460463568.5266_589.argentina:2, │ │ │ │ ├── 1460463568.5266_591.argentina:2, │ │ │ │ ├── 1460463568.5266_593.argentina:2, │ │ │ │ ├── 1460463568.5266_595.argentina:2, │ │ │ │ ├── 1460463568.5266_597.argentina:2, │ │ │ │ ├── 1460463568.5266_599.argentina:2, │ │ │ │ ├── 1460463568.5266_601.argentina:2, │ │ │ │ ├── 1460463568.5266_603.argentina:2, │ │ │ │ ├── 1460463568.5266_605.argentina:2, │ │ │ │ ├── 1460463568.5266_607.argentina:2, │ │ │ │ ├── 1460463568.5266_609.argentina:2, │ │ │ │ ├── 1460463568.5266_611.argentina:2, │ │ │ │ ├── 1460463568.5266_613.argentina:2, │ │ │ │ ├── 1460463568.5266_615.argentina:2, │ │ │ │ ├── 1460463568.5266_617.argentina:2, │ │ │ │ ├── 1460463569.5266_619.argentina:2, │ │ │ │ ├── 1460463569.5266_621.argentina:2, │ │ │ │ ├── 1460463569.5266_623.argentina:2, │ │ │ │ ├── 1460463569.5266_625.argentina:2, │ │ │ │ ├── 1460463569.5266_627.argentina:2, │ │ │ │ ├── 1460463569.5266_629.argentina:2, │ │ │ │ ├── 1460463569.5266_631.argentina:2, │ │ │ │ ├── 1460463569.5266_633.argentina:2, │ │ │ │ ├── 1460463569.5266_635.argentina:2, │ │ │ │ ├── 1460463569.5266_637.argentina:2, │ │ │ │ ├── 1460463569.5266_639.argentina:2, │ │ │ │ ├── 1460463569.5266_641.argentina:2, │ │ │ │ ├── 1460463569.5266_643.argentina:2, │ │ │ │ ├── 1460463569.5266_645.argentina:2, │ │ │ │ ├── 1460463569.5266_647.argentina:2, │ │ │ │ ├── 1460463569.5266_649.argentina:2, │ │ │ │ ├── 1460463569.5266_651.argentina:2, │ │ │ │ ├── 1460463569.5266_653.argentina:2, │ │ │ │ ├── 1460463569.5266_655.argentina:2, │ │ │ │ ├── 1460463569.5266_657.argentina:2, │ │ │ │ ├── 1460463569.5266_659.argentina:2, │ │ │ │ ├── 1460463569.5266_661.argentina:2, │ │ │ │ ├── 1460463569.5266_663.argentina:2, │ │ │ │ ├── 1460463569.5266_665.argentina:2, │ │ │ │ ├── 1460463569.5266_667.argentina:2, │ │ │ │ ├── 1460463569.5266_669.argentina:2, │ │ │ │ ├── 1460463569.5266_671.argentina:2, │ │ │ │ ├── 1460463569.5266_673.argentina:2, │ │ │ │ ├── 1460463569.5266_675.argentina:2, │ │ │ │ ├── 1460463569.5266_677.argentina:2, │ │ │ │ ├── 1460463569.5266_679.argentina:2, │ │ │ │ ├── 1460463569.5266_681.argentina:2, │ │ │ │ ├── 1460463569.5266_683.argentina:2, │ │ │ │ ├── 1460463569.5266_685.argentina:2, │ │ │ │ ├── 1460463569.5266_687.argentina:2, │ │ │ │ ├── 1460463569.5266_689.argentina:2, │ │ │ │ ├── 1460463569.5266_691.argentina:2, │ │ │ │ ├── 1460463569.5266_693.argentina:2, │ │ │ │ ├── 1460463569.5266_695.argentina:2, │ │ │ │ ├── 1460463569.5266_697.argentina:2, │ │ │ │ ├── 1460463569.5266_699.argentina:2, │ │ │ │ ├── 1460463569.5266_701.argentina:2, │ │ │ │ ├── 1460463569.5266_703.argentina:2, │ │ │ │ ├── 1460463569.5266_705.argentina:2, │ │ │ │ ├── 1460463570.5266_707.argentina:2, │ │ │ │ ├── 1460463570.5266_709.argentina:2, │ │ │ │ ├── 1460463570.5266_711.argentina:2, │ │ │ │ ├── 1460463570.5266_713.argentina:2, │ │ │ │ ├── 1460463570.5266_715.argentina:2, │ │ │ │ ├── 1460463570.5266_717.argentina:2, │ │ │ │ ├── 1460463570.5266_719.argentina:2, │ │ │ │ ├── 1460463570.5266_721.argentina:2, │ │ │ │ ├── 1460463570.5266_723.argentina:2, │ │ │ │ ├── 1460463570.5266_725.argentina:2, │ │ │ │ ├── 1460463570.5266_727.argentina:2, │ │ │ │ ├── 1460463570.5266_729.argentina:2, │ │ │ │ ├── 1460463570.5266_731.argentina:2, │ │ │ │ ├── 1460463570.5266_733.argentina:2, │ │ │ │ ├── 1460463570.5266_735.argentina:2, │ │ │ │ ├── 1460463570.5266_737.argentina:2, │ │ │ │ ├── 1460463570.5266_739.argentina:2, │ │ │ │ ├── 1460463570.5266_741.argentina:2, │ │ │ │ ├── 1460463570.5266_743.argentina:2, │ │ │ │ ├── 1460463570.5266_745.argentina:2, │ │ │ │ ├── 1460463570.5266_747.argentina:2, │ │ │ │ ├── 1460463570.5266_749.argentina:2, │ │ │ │ ├── 1460463570.5266_751.argentina:2, │ │ │ │ ├── 1460463570.5266_753.argentina:2, │ │ │ │ ├── 1460463570.5266_755.argentina:2, │ │ │ │ ├── 1460463570.5266_757.argentina:2, │ │ │ │ ├── 1460463570.5266_759.argentina:2, │ │ │ │ ├── 1460463570.5266_761.argentina:2, │ │ │ │ ├── 1460463570.5266_763.argentina:2, │ │ │ │ ├── 1460463570.5266_765.argentina:2, │ │ │ │ ├── 1460463570.5266_767.argentina:2, │ │ │ │ ├── 1460463570.5266_769.argentina:2, │ │ │ │ ├── 1460463570.5266_771.argentina:2, │ │ │ │ ├── 1460463570.5266_773.argentina:2, │ │ │ │ ├── 1460463570.5266_775.argentina:2, │ │ │ │ ├── 1460463570.5266_777.argentina:2, │ │ │ │ ├── 1460463570.5266_779.argentina:2, │ │ │ │ ├── 1460463570.5266_781.argentina:2, │ │ │ │ ├── 1460463571.5266_783.argentina:2, │ │ │ │ ├── 1460463571.5266_785.argentina:2, │ │ │ │ ├── 1460463571.5266_787.argentina:2, │ │ │ │ ├── 1460463571.5266_789.argentina:2, │ │ │ │ ├── 1460463571.5266_791.argentina:2, │ │ │ │ ├── 1460463571.5266_793.argentina:2, │ │ │ │ ├── 1460463571.5266_795.argentina:2, │ │ │ │ ├── 1460463571.5266_797.argentina:2, │ │ │ │ ├── 1460463571.5266_799.argentina:2, │ │ │ │ ├── 1460463571.5266_801.argentina:2, │ │ │ │ ├── Re: [Caliopdev] CR réunion du 12_12_2014 - David Epely - 2014-12-13 1352.eml │ │ │ │ ├── Re: [Caliopdev] Compte rendu reunion 21 Novembre - Laurent Chemla - 2014-11-22 1046.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Aymeric Barantal - 2014-11-26 1605.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Laurent Chemla - 2014-11-26 2346.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - julien muetton - 2014-11-28 1701.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Alban Crommer - 2014-11-27 1007.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Alban Crommer - 2014-11-28 1625.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Alexis - 2014-11-28 1518.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Alexis - 2014-11-28 1748.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Aymeric Barantal - 2014-11-28 1112.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Aymeric Barantal - 2014-11-28 1724.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Kajan Sivaramalingam - 2014-11-27 0132.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - Vincent MINEAUD - 2014-11-28 1600.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - joseph@cozycloud.cc - 2014-11-27 1120.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - joseph@cozycloud.cc - 2014-11-27 1228.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - julien muetton - 2014-11-27 1211.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - julien muetton - 2014-11-27 2140.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - julien muetton - 2014-11-28 1222.eml │ │ │ │ ├── Re: [Caliopdev] Fwd: Re: matrice de choix framework JS - julien muetton - 2014-11-28 1609.eml │ │ │ │ ├── Re: [Caliopdev] Nouveau screencast (brut) - Laurent Chemla - 2014-11-30 1724.eml │ │ │ │ ├── Re: [Caliopdev] Nouveau screencast (brut) - Laurent Chemla - 2014-12-01 1214.eml │ │ │ │ ├── Re: [Caliopdev] Nouveau screencast (brut) - Thomas Laurent - 2014-12-01 1149.eml │ │ │ │ ├── Re: [Caliopdev] Prochaine réunion - Aymeric Barantal - 2014-12-02 1510.eml │ │ │ │ ├── Re: [Caliopdev] Prochaine réunion - David Epely - 2014-12-02 1056.eml │ │ │ │ ├── Re: [Caliopdev] Prochaine réunion - Kajan Sivaramalingam - 2014-12-01 2345.eml │ │ │ │ ├── Re: [Caliopdev] Prochaine réunion - Kajan Sivaramalingam - 2014-12-02 2319.eml │ │ │ │ ├── Re: [Caliopdev] Prochaine réunion - Kajan Sivaramalingam - 2014-12-02 2322.eml │ │ │ │ ├── Re: [Caliopdev] Prochaine réunion - Laurent Chemla - 2014-12-02 0610.eml │ │ │ │ ├── Re: [Caliopdev] Prochaine réunion - Laurent Chemla - 2014-12-02 1158.eml │ │ │ │ ├── Re: [Caliopdev] Prochaine réunion - julien muetton - 2014-12-02 1031.eml │ │ │ │ ├── Re: [Caliopdev] Prochaines réunions. - Alban Crommer - 2014-12-29 1917.eml │ │ │ │ ├── Re: [Caliopdev] Prochaines étapes ? - Laurent Chemla - 2014-12-06 2135.eml │ │ │ │ ├── Re: [Caliopdev] [svetlana.meyer@ensc.fr: Bravo!] - Alexis - 2014-11-26 1446.eml │ │ │ │ ├── Re: [Caliopdev] framework js - David Epely - 2014-11-21 0920.eml │ │ │ │ ├── Re: [Caliopdev] framework js - Kajan Sivaramalingam - 2014-11-21 0059.eml │ │ │ │ ├── [Caliopdev] CR réunion du 12_12_2014 - Thomas Laurent - 2014-12-12 1701.eml │ │ │ │ ├── [Caliopdev] Compte rendu reunion 21 Novembre - Aymeric Barantal - 2014-11-21 1221.eml │ │ │ │ ├── [Caliopdev] Fwd: Re: matrice de choix framework JS - Aymeric Barantal - 2014-11-25 1119.eml │ │ │ │ ├── [Caliopdev] Nouveau screencast (brut) - Aymeric Barantal - 2014-11-28 1718.eml │ │ │ │ ├── [Caliopdev] Prochaine réunion - Laurent Chemla - 2014-12-01 2142.eml │ │ │ │ ├── [Caliopdev] Prochaines réunions. - Laurent Chemla - 2014-12-29 1807.eml │ │ │ │ ├── [Caliopdev] Prochaines étapes ? - Kajan Sivaramalingam - 2014-12-06 2108.eml │ │ │ │ ├── [Caliopdev] [Coin-coin@canapin.com: Petites fautes dans la FAQ] - Laurent Chemla - 2014-11-24 1840.eml │ │ │ │ ├── [Caliopdev] [benjamin@sonntag.fr: Fwd: ***UNCHECKED*** Caliopen FAQ] - Laurent Chemla - 2014-12-15 1825.eml │ │ │ │ ├── [Caliopdev] [contact+caliopen@etiennesamson.com: Intégration] - Laurent Chemla - 2014-11-24 1840.eml │ │ │ │ ├── [Caliopdev] [groupeiw@gmail.com: Contacter l'équipe CaliOpen] - Laurent Chemla - 2014-11-25 1810.eml │ │ │ │ ├── [Caliopdev] [svetlana.meyer@ensc.fr: Bravo!] - Laurent Chemla - 2014-11-26 1244.eml │ │ │ │ ├── [Caliopdev] [svetlana.meyer@ensc.fr: Re: Bravo!] - Laurent Chemla - 2014-11-26 1246.eml │ │ │ │ └── [Caliopdev] matrice de choix framework JS - Aymeric Barantal - 2014-11-24 1146.eml │ │ │ └── test@caliopen.local/ │ │ │ ├── test_1.eml │ │ │ ├── test_2.eml │ │ │ └── test_3.eml │ │ ├── messages_body/ │ │ │ ├── flat-html-body │ │ │ ├── html-mailinglist │ │ │ ├── html-with-inline-styles │ │ │ └── spam-htmj-and-styles │ │ ├── raw_emails/ │ │ │ ├── email-with-iso-8859-1-encoding │ │ │ ├── html-in-plain-body │ │ │ ├── html-with-inlined-image │ │ │ ├── invalid-utf-8 │ │ │ ├── multipart-html │ │ │ ├── multipart-signed │ │ │ ├── multipart-with-attachment │ │ │ ├── sample-mail.eml.txt │ │ │ ├── signed-and-encrypted │ │ │ ├── simple │ │ │ ├── spam-multipart │ │ │ ├── with-docx-attachment │ │ │ └── with-json-attachment │ │ ├── raw_inbound_msg.cql │ │ ├── twitter/ │ │ │ ├── dm-multimedia.json │ │ │ └── dm.json │ │ └── vcard/ │ │ ├── multi.vcf │ │ ├── rfc2425-1.vcard │ │ ├── rfc2425-2.vcard │ │ ├── rfc2425-3.vcard │ │ ├── rfc2426-1.vcard │ │ ├── rfc2426-2.vcard │ │ ├── rfc2426-3.vcard │ │ ├── rfc2426-4.vcard │ │ └── rfc2426-5.vcard │ ├── gen-swagger-spec.sh │ ├── init.sh │ ├── kubernetes/ │ │ ├── README.md │ │ ├── clean-minikube.sh │ │ ├── configs/ │ │ │ └── dns-config.yaml │ │ ├── deploy-minikube.sh │ │ ├── deployments/ │ │ │ ├── apiv1-deployment.yaml │ │ │ ├── apiv2-deployment.yaml │ │ │ ├── cassandra-deployment.yaml │ │ │ ├── elasticsearch-deployment.yaml │ │ │ ├── frontend-deployment.yaml │ │ │ ├── identity-poller-deployment.yaml │ │ │ ├── imap-worker-deployment.yaml │ │ │ ├── lmtpd-deployment.yaml │ │ │ ├── message-handler-deployment.yaml │ │ │ ├── minio-deployment.yaml │ │ │ ├── nats-deployment.yaml │ │ │ ├── redis-deployment.yaml │ │ │ └── smtp-deployment.yaml │ │ ├── jobs/ │ │ │ ├── cli-admin-creation.yaml │ │ │ ├── cli-dev-creation.yaml │ │ │ ├── cli-mail-import.yaml │ │ │ └── cli-setup.yaml │ │ ├── services/ │ │ │ ├── apiv1-service.yaml │ │ │ ├── apiv2-service.yaml │ │ │ ├── cassandra-service.yaml │ │ │ ├── elasticsearch-service.yaml │ │ │ ├── external-go-service.yaml │ │ │ ├── external-python-service.yaml │ │ │ ├── frontend-service.yaml │ │ │ ├── lmtpd-service.yaml │ │ │ ├── minio-service.yaml │ │ │ ├── nats-service.yaml │ │ │ ├── redis-service.yaml │ │ │ └── smtp-service.yaml │ │ └── volumeclaims/ │ │ ├── db-persistentvolumeclaim.yaml │ │ ├── index-persistentvolumeclaim.yaml │ │ └── store-persistentvolumeclaim.yaml │ ├── make_release │ ├── makefile │ ├── manage_package │ ├── manage_package-requirements.txt │ ├── migrations/ │ │ ├── ES_mappings_v2.json │ │ ├── add_delivered_column_to_raw-message_table.cql │ │ ├── add_temp_id_to_attachment_type.cql │ │ ├── fill_message_is_received.py │ │ ├── index_migration_v0_to_v2.py │ │ ├── index_migration_v2_to_v3.py │ │ ├── index_migration_v3_to_v4.py │ │ ├── index_migration_v4_to_v5.py │ │ ├── index_migration_v5_to_v6.py │ │ ├── set_date_sort_in_db.py │ │ └── update_ecdsa_key.py │ ├── packages.yaml │ ├── publish-images.sh │ ├── registry.conf.template │ ├── run-tests.sh │ ├── setup-virtualenv.sh │ ├── start.sh │ ├── stop.sh │ └── storybook/ │ ├── .storybook/ │ │ ├── addons.js │ │ ├── config.js │ │ └── webpack.config.js │ ├── README.md │ ├── package.json │ └── stories/ │ ├── CHANGELOG.md │ ├── Changelog.jsx │ ├── Guideline/ │ │ ├── index.jsx │ │ └── style.scss │ ├── Welcome.jsx │ ├── components/ │ │ ├── BlockList.jsx │ │ ├── CollectionFieldGroup.jsx │ │ ├── ContactDetails.jsx │ │ ├── FormGrid.jsx │ │ ├── Link.jsx │ │ ├── MessageList.jsx │ │ ├── PasswordStrength.jsx │ │ ├── PiBar.jsx │ │ ├── Reply.jsx │ │ ├── Subtitle.jsx │ │ └── TagsForm.jsx │ ├── index.jsx │ ├── layouts/ │ │ ├── ContactBook.jsx │ │ ├── Devices.jsx │ │ ├── SigninPage.jsx │ │ └── SignupPage.jsx │ └── presenters/ │ ├── Code.jsx │ ├── ComponentWrapper.jsx │ └── index.js ├── doc/ │ ├── architecture/ │ │ ├── Repository_structure.md │ │ └── assets/ │ │ └── stack_frontend_dev_2017-03-09.puml │ ├── devops/ │ │ ├── continous-integration.md │ │ ├── docker-&-registry.md │ │ └── kube_survival_guide.md │ ├── index.md │ ├── install/ │ │ ├── frontend-development.md │ │ ├── minikube-local-development.md │ │ └── native-installation.md │ ├── install.md │ ├── monitoring-debug/ │ │ └── analyse-frontend-bundle.md │ ├── release/ │ │ ├── Communication.md │ │ ├── Guidelines.md │ │ ├── README.md │ │ └── deploy_kubernetes.md │ ├── specifications/ │ │ ├── attachments/ │ │ │ ├── assets/ │ │ │ │ └── management.puml │ │ │ └── index.md │ │ ├── client/ │ │ │ ├── architecture.md │ │ │ ├── frontend-data-flow.md │ │ │ └── routing.md │ │ ├── contact/ │ │ │ ├── assets/ │ │ │ │ └── discover_contact_from_email.uml │ │ │ ├── index.md │ │ │ └── vcard_doc.md │ │ ├── discussions/ │ │ │ ├── assets/ │ │ │ │ └── delete_discussion.uml │ │ │ └── delete_discussion.md │ │ ├── email-protocol/ │ │ │ ├── assets/ │ │ │ │ ├── email-delivery-inbound-rpc.puml │ │ │ │ ├── email-delivery-inbound.puml │ │ │ │ ├── email-delivery-outbound.puml │ │ │ │ ├── email-inbound-delivery-poc.puml │ │ │ │ ├── imap-outbound-process.puml │ │ │ │ └── smtp-delivery-inbound-closeup.puml │ │ │ ├── imap-binaries.md │ │ │ └── index.md │ │ ├── identities/ │ │ │ ├── Remote-identities-creation-diagram.puml │ │ │ ├── index.md │ │ │ └── remote-identities.md │ │ ├── message/ │ │ │ ├── assets/ │ │ │ │ ├── message-create-save-send.puml │ │ │ │ ├── message-create-save-send_nats_async.puml │ │ │ │ └── message_discussion_association.puml │ │ │ └── index.md │ │ ├── messages-drafts-discussions-routes/ │ │ │ └── index-fr.md │ │ ├── messaging-system/ │ │ │ └── index.md │ │ ├── notification/ │ │ │ ├── API-fr.md │ │ │ ├── assets/ │ │ │ │ └── client-message-sequence.puml │ │ │ └── frontend.md │ │ ├── patch/ │ │ │ └── index.md │ │ ├── protocol-implementation.md │ │ ├── pwa/ │ │ │ ├── assets/ │ │ │ │ └── sequence.puml │ │ │ └── pwa.md │ │ ├── remote-identities/ │ │ │ ├── assets/ │ │ │ │ └── twitter-oauth.puml │ │ │ ├── gmail.md │ │ │ ├── oauth.md │ │ │ └── twitter.md │ │ ├── rest-api/ │ │ │ └── index.md │ │ ├── scss-reference.md │ │ ├── search/ │ │ │ └── index.md │ │ ├── user-and-device-identification/ │ │ │ ├── assets/ │ │ │ │ ├── authenticate_new_device.uml │ │ │ │ ├── create_user_and_device.uml │ │ │ │ ├── user_and_device_authentication.uml │ │ │ │ └── user_update_credential.uml │ │ │ ├── index.md │ │ │ └── revoke-devices.md │ │ └── username/ │ │ └── index.md │ ├── tools.md │ └── welcome.md └── src/ ├── backend/ │ ├── Dockerfile.caliopen-go │ ├── Dockerfile.caliopen-python │ ├── Dockerfile.cli │ ├── Dockerfile.cli-ml │ ├── Dockerfile.go-api │ ├── Dockerfile.go-lmtp │ ├── Dockerfile.identity-poller │ ├── Dockerfile.imap-worker │ ├── Dockerfile.mastodon-worker │ ├── Dockerfile.mq-worker │ ├── Dockerfile.py-api │ ├── Dockerfile.twitter-worker │ ├── brokers/ │ │ ├── go.emails/ │ │ │ ├── README.md │ │ │ ├── broker.go │ │ │ ├── email.go │ │ │ ├── encrypt.go │ │ │ ├── inbound.go │ │ │ └── outbound.go │ │ ├── go.mastodon/ │ │ │ ├── broker.go │ │ │ ├── direct_messages.go │ │ │ ├── doc.go │ │ │ ├── inbound.go │ │ │ └── outbound.go │ │ └── go.twitter/ │ │ ├── broker.go │ │ ├── direct_messages.go │ │ ├── doc.go │ │ ├── inbound.go │ │ └── outbound.go │ ├── components/ │ │ ├── py.data/ │ │ │ ├── CHANGES.rst │ │ │ ├── README.rst │ │ │ ├── caliopen_data/ │ │ │ │ ├── __init__.py │ │ │ │ ├── interface.py │ │ │ │ ├── provider.py │ │ │ │ └── store.py │ │ │ ├── requirements.deps │ │ │ ├── setup.cfg │ │ │ └── setup.py │ │ ├── py.pgp/ │ │ │ ├── CHANGES.rst │ │ │ ├── MANIFEST.in │ │ │ ├── README.rst │ │ │ ├── caliopen_pgp/ │ │ │ │ ├── __init__.py │ │ │ │ └── keys/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base.py │ │ │ │ ├── contact.py │ │ │ │ ├── discoverer.py │ │ │ │ ├── hkp.py │ │ │ │ ├── keybase.py │ │ │ │ └── rfc7929.py │ │ │ ├── setup.cfg │ │ │ └── setup.py │ │ ├── py.pi/ │ │ │ ├── CHANGES.rst │ │ │ ├── README.rst │ │ │ ├── caliopen_pi/ │ │ │ │ ├── __init__.py │ │ │ │ ├── features/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── contact.py │ │ │ │ │ ├── device.py │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── histogram.py │ │ │ │ │ │ ├── importance_level.py │ │ │ │ │ │ ├── ingress_path.py │ │ │ │ │ │ └── spam.py │ │ │ │ │ ├── mail.py │ │ │ │ │ └── types.py │ │ │ │ ├── qualifiers/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── base.py │ │ │ │ │ ├── contact.py │ │ │ │ │ ├── device.py │ │ │ │ │ ├── mail.py │ │ │ │ │ ├── mastodon.py │ │ │ │ │ └── twitter.py │ │ │ │ └── tests/ │ │ │ │ ├── fixtures/ │ │ │ │ │ ├── dkim1.eml │ │ │ │ │ ├── pgp_crypted_1.eml │ │ │ │ │ ├── pgpsigned1.elm │ │ │ │ │ ├── spam1.eml │ │ │ │ │ ├── spam2.eml │ │ │ │ │ └── spam3.eml │ │ │ │ ├── test_features.py │ │ │ │ ├── test_importance_level.py │ │ │ │ └── test_spam.py │ │ │ ├── requirements.deps │ │ │ ├── setup.cfg │ │ │ └── setup.py │ │ └── py.tag/ │ │ ├── CHANGES.rst │ │ ├── README.rst │ │ ├── caliopen_tag/ │ │ │ ├── __init__.py │ │ │ ├── models_manager/ │ │ │ │ ├── __init__.py │ │ │ │ ├── data_manager.py │ │ │ │ └── manager.py │ │ │ ├── taggers/ │ │ │ │ ├── __init__.py │ │ │ │ └── tagger.py │ │ │ ├── tests/ │ │ │ │ ├── test_model_manager.py │ │ │ │ └── test_tag.py │ │ │ └── utils.py │ │ ├── requirements.deps │ │ ├── setup.cfg │ │ └── setup.py │ ├── configs/ │ │ ├── apiv1-nginx.conf │ │ ├── apiv1-supervisord.conf │ │ ├── apiv1.ini │ │ ├── apiv2.yaml │ │ ├── caliopen-api.development.ini │ │ ├── caliopen.yaml │ │ ├── caliopen.yaml.template │ │ ├── idpoller.yaml │ │ ├── imapworker.yaml │ │ ├── lmtp.yaml │ │ ├── mastodonworker.yaml │ │ ├── swagger.json │ │ └── twitterworker.yaml │ ├── defs/ │ │ ├── go-objects/ │ │ │ ├── actions_payload.go │ │ │ ├── attachment.go │ │ │ ├── cache.go │ │ │ ├── common.go │ │ │ ├── configs.go │ │ │ ├── constants.go │ │ │ ├── contact.go │ │ │ ├── credentials.go │ │ │ ├── crypto_keys.go │ │ │ ├── device.go │ │ │ ├── discussion.go │ │ │ ├── email.go │ │ │ ├── errors.go │ │ │ ├── external_references.go │ │ │ ├── im.go │ │ │ ├── location.go │ │ │ ├── message.go │ │ │ ├── nats.go │ │ │ ├── notification.go │ │ │ ├── notification_test.go │ │ │ ├── organization.go │ │ │ ├── participant.go │ │ │ ├── participants_test.go │ │ │ ├── phone.go │ │ │ ├── postal_address.go │ │ │ ├── privacy_features.go │ │ │ ├── privacy_index.go │ │ │ ├── provider.go │ │ │ ├── raw_message.go │ │ │ ├── search.go │ │ │ ├── settings.go │ │ │ ├── social_identity.go │ │ │ ├── tag.go │ │ │ ├── tls.go │ │ │ ├── user.go │ │ │ ├── user_identity.go │ │ │ ├── username.go │ │ │ └── uuid.go │ │ ├── nats-messages/ │ │ │ ├── IMAPworkers_FetchOrder.yaml │ │ │ ├── SMTPqueue_ack_msg.yaml │ │ │ ├── UpdateContactPI_msg.yaml │ │ │ ├── inboundSMTP_deliver_msg.yaml │ │ │ └── outboundSMTP_deliver_msg.yaml │ │ ├── notifiers/ │ │ │ └── templates/ │ │ │ ├── email-device-validation.yaml │ │ │ ├── email-onboarding.yaml │ │ │ ├── email-reset-password-link.yaml │ │ │ └── email-welcome.yaml │ │ └── rest-api/ │ │ ├── objects/ │ │ │ ├── Actions.yaml │ │ │ ├── Attachment.yaml │ │ │ ├── Authentication.yaml │ │ │ ├── Contact.yaml │ │ │ ├── ContactIdentity.yaml │ │ │ ├── DefaultDevice.yaml │ │ │ ├── Device.yaml │ │ │ ├── DeviceLocation.yaml │ │ │ ├── Discussion.yaml │ │ │ ├── ECKey.yaml │ │ │ ├── Email.yaml │ │ │ ├── Error.yaml │ │ │ ├── ExternalReferences.yaml │ │ │ ├── IM.yaml │ │ │ ├── Identity.yaml │ │ │ ├── Message.yaml │ │ │ ├── MessageV2.yaml │ │ │ ├── NewContact.yaml │ │ │ ├── NewDevice.yaml │ │ │ ├── NewEmail.yaml │ │ │ ├── NewIM.yaml │ │ │ ├── NewMessage.yaml │ │ │ ├── NewMessageV2.yaml │ │ │ ├── NewOrganization.yaml │ │ │ ├── NewPhone.yaml │ │ │ ├── NewPostalAddress.yaml │ │ │ ├── NewPublicKey.yaml │ │ │ ├── NewSocialIdentity.yaml │ │ │ ├── NewTag.yaml │ │ │ ├── NewUser.yaml │ │ │ ├── NewUserIdentity.yaml │ │ │ ├── Notification.yaml │ │ │ ├── Organization.yaml │ │ │ ├── PI.yaml │ │ │ ├── PIMessage.yaml │ │ │ ├── Participant.yaml │ │ │ ├── ParticipantSuggest.yaml │ │ │ ├── Phone.yaml │ │ │ ├── PostalAddress.yaml │ │ │ ├── PrivacyFeatures.yaml │ │ │ ├── PublicKey.yaml │ │ │ ├── SearchResponse.yaml │ │ │ ├── Settings.yaml │ │ │ ├── ShortContact.yaml │ │ │ ├── SocialIdentity.yaml │ │ │ ├── Tag.yaml │ │ │ ├── User.yaml │ │ │ └── UserIdentity.yaml │ │ ├── paths/ │ │ │ ├── authentications.yaml │ │ │ ├── contacts.yaml │ │ │ ├── contactsV2.yaml │ │ │ ├── devices.yaml │ │ │ ├── discussions.yaml │ │ │ ├── files.yaml │ │ │ ├── hashdiscussion.yaml │ │ │ ├── identities.yaml │ │ │ ├── imports.yaml │ │ │ ├── me.yaml │ │ │ ├── messages.yaml │ │ │ ├── messagesV2.yaml │ │ │ ├── notifications.yaml │ │ │ ├── participants.yaml │ │ │ ├── passwords.yaml │ │ │ ├── providers.yaml │ │ │ ├── raws.yaml │ │ │ ├── search.yaml │ │ │ ├── settings.yaml │ │ │ ├── tags.yaml │ │ │ └── users.yaml │ │ └── swagger-root.yaml │ ├── doc/ │ │ └── api/ │ │ ├── README.md │ │ └── swagger.html │ ├── interfaces/ │ │ ├── NATS/ │ │ │ ├── go.mockednats/ │ │ │ │ └── nats.go │ │ │ └── py.client/ │ │ │ ├── CHANGES.rst │ │ │ ├── MANIFEST.in │ │ │ ├── README.rst │ │ │ ├── caliopen_nats/ │ │ │ │ ├── __init__.py │ │ │ │ ├── delivery.py │ │ │ │ ├── listener.py │ │ │ │ └── subscribers.py │ │ │ ├── requirements.deps │ │ │ ├── setup.cfg │ │ │ └── setup.py │ │ └── REST/ │ │ ├── go.server/ │ │ │ ├── README.md │ │ │ ├── api_server.go │ │ │ ├── cmd/ │ │ │ │ └── caliopen_rest/ │ │ │ │ ├── cli_cmds/ │ │ │ │ │ ├── root.go │ │ │ │ │ └── serve.go │ │ │ │ └── main.go │ │ │ ├── dump_request.go │ │ │ ├── errors.go │ │ │ ├── middlewares/ │ │ │ │ ├── authentication.go │ │ │ │ ├── config.go │ │ │ │ └── swagger.go │ │ │ ├── operations/ │ │ │ │ ├── contacts/ │ │ │ │ │ ├── Identities.go │ │ │ │ │ ├── contacts.go │ │ │ │ │ └── keys.go │ │ │ │ ├── devices/ │ │ │ │ │ └── devices.go │ │ │ │ ├── discussions/ │ │ │ │ │ └── discussions.go │ │ │ │ ├── helpers.go │ │ │ │ ├── identities/ │ │ │ │ │ └── identities.go │ │ │ │ ├── imports/ │ │ │ │ │ └── import.go │ │ │ │ ├── messages/ │ │ │ │ │ ├── actions.go │ │ │ │ │ ├── attachments.go │ │ │ │ │ └── messages.go │ │ │ │ ├── notifications/ │ │ │ │ │ └── notifications.go │ │ │ │ ├── participants/ │ │ │ │ │ ├── discussion.go │ │ │ │ │ └── suggest.go │ │ │ │ ├── providers/ │ │ │ │ │ ├── oauth-test.html │ │ │ │ │ └── providers.go │ │ │ │ ├── search.go │ │ │ │ ├── tags/ │ │ │ │ │ └── tags.go │ │ │ │ └── users/ │ │ │ │ ├── user.go │ │ │ │ └── username.go │ │ │ └── proxy.go │ │ └── py.server/ │ │ ├── CHANGES.rst │ │ ├── MANIFEST.in │ │ ├── README.rst │ │ ├── caliopen_api/ │ │ │ ├── __init__.py │ │ │ ├── base/ │ │ │ │ ├── __init__.py │ │ │ │ ├── config.py │ │ │ │ ├── context.py │ │ │ │ ├── deserializer.py │ │ │ │ ├── errors.py │ │ │ │ ├── exception.py │ │ │ │ └── renderer.py │ │ │ ├── discussion/ │ │ │ │ ├── __init__.py │ │ │ │ ├── config.py │ │ │ │ └── participants.py │ │ │ ├── message/ │ │ │ │ ├── __init__.py │ │ │ │ ├── config.py │ │ │ │ └── message.py │ │ │ └── user/ │ │ │ ├── __init__.py │ │ │ ├── authentication.py │ │ │ ├── config.py │ │ │ ├── contact.py │ │ │ ├── imports.py │ │ │ ├── settings.py │ │ │ ├── user.py │ │ │ └── util.py │ │ ├── requirements.deps │ │ ├── setup.cfg │ │ └── setup.py │ ├── main/ │ │ ├── go.backends/ │ │ │ ├── AttachmentsInterfaces.go │ │ │ ├── CacheInterfaces.go │ │ │ ├── ContactsInterfaces.go │ │ │ ├── CredentialsInterfaces.go │ │ │ ├── DevicesInterfaces.go │ │ │ ├── DiscussionsInterface.go │ │ │ ├── IdentitiesInterface.go │ │ │ ├── KeysInterfaces.go │ │ │ ├── LDAInterfaces.go │ │ │ ├── MessagesInterfaces.go │ │ │ ├── NotificationsInterfaces.go │ │ │ ├── ProvidersInterfaces.go │ │ │ ├── RESTInterfaces.go │ │ │ ├── TagsInterfaces.go │ │ │ ├── UrisInterface.go │ │ │ ├── UsersInterfaces.go │ │ │ ├── backendstest/ │ │ │ │ ├── APIstore.go │ │ │ │ ├── Attachments.go │ │ │ │ ├── Cache.go │ │ │ │ ├── Contacts.go │ │ │ │ ├── Credentials.go │ │ │ │ ├── Devices.go │ │ │ │ ├── Discussions.go │ │ │ │ ├── Identities.go │ │ │ │ ├── Keys.go │ │ │ │ ├── LDA.go │ │ │ │ ├── Messages.go │ │ │ │ ├── Notifications.go │ │ │ │ ├── Providers.go │ │ │ │ ├── Tags.go │ │ │ │ ├── UrisInterface.go │ │ │ │ ├── UserNames.go │ │ │ │ ├── Users.go │ │ │ │ └── testdata.go │ │ │ ├── cache/ │ │ │ │ ├── authentication.go │ │ │ │ ├── cache.go │ │ │ │ ├── devicevalidation.go │ │ │ │ ├── devicevalidation_test.go │ │ │ │ ├── oauthsessions.go │ │ │ │ ├── passwordreset.go │ │ │ │ └── redis.go │ │ │ ├── index/ │ │ │ │ └── elasticsearch/ │ │ │ │ ├── broad_search.go │ │ │ │ ├── contacts.go │ │ │ │ ├── discussions.go │ │ │ │ ├── elasticsearch.go │ │ │ │ ├── messages.go │ │ │ │ └── user_recipients_lookup.go │ │ │ └── store/ │ │ │ ├── cassandra/ │ │ │ │ ├── attachments.go │ │ │ │ ├── cassandra.go │ │ │ │ ├── contacts.go │ │ │ │ ├── contacts_test.go │ │ │ │ ├── credentials.go │ │ │ │ ├── devices.go │ │ │ │ ├── discussions.go │ │ │ │ ├── discussions_test.go │ │ │ │ ├── emails.go │ │ │ │ ├── identities.go │ │ │ │ ├── keys.go │ │ │ │ ├── lookups.go │ │ │ │ ├── messages.go │ │ │ │ ├── notifications.go │ │ │ │ ├── participant_lookup.go │ │ │ │ ├── providers.go │ │ │ │ ├── raw_messages.go │ │ │ │ ├── related.go │ │ │ │ ├── settings.go │ │ │ │ ├── tags.go │ │ │ │ ├── usernames.go │ │ │ │ └── users.go │ │ │ ├── object_store/ │ │ │ │ ├── attachments.go │ │ │ │ ├── minio.go │ │ │ │ ├── objects.go │ │ │ │ └── raw_messages.go │ │ │ └── vault/ │ │ │ ├── credentials.go │ │ │ ├── hvault_interface.go │ │ │ └── vault_client.go │ │ ├── go.main/ │ │ │ ├── caliopen.go │ │ │ ├── contact/ │ │ │ │ ├── contact.go │ │ │ │ ├── contact_test.go │ │ │ │ └── vcard.go │ │ │ ├── facilities/ │ │ │ │ ├── Messaging/ │ │ │ │ │ ├── facility.go │ │ │ │ │ └── facility_test.go │ │ │ │ ├── Notifications/ │ │ │ │ │ ├── batch.go │ │ │ │ │ ├── batch_test.go │ │ │ │ │ ├── email.go │ │ │ │ │ ├── facility.go │ │ │ │ │ ├── queue.go │ │ │ │ │ └── templating.go │ │ │ │ └── REST/ │ │ │ │ ├── RESTfacility.go │ │ │ │ ├── attachment.go │ │ │ │ ├── contacts.go │ │ │ │ ├── contacts_test.go │ │ │ │ ├── devices.go │ │ │ │ ├── devices_test.go │ │ │ │ ├── discussions.go │ │ │ │ ├── draft.go │ │ │ │ ├── identities.go │ │ │ │ ├── keys.go │ │ │ │ ├── message.go │ │ │ │ ├── nats.go │ │ │ │ ├── providers.go │ │ │ │ ├── search.go │ │ │ │ ├── settings.go │ │ │ │ ├── suggest_participants.go │ │ │ │ ├── tags.go │ │ │ │ ├── username.go │ │ │ │ └── users.go │ │ │ ├── helpers/ │ │ │ │ ├── contact.go │ │ │ │ ├── discussion.go │ │ │ │ ├── discussion_test.go │ │ │ │ ├── filesystem.go │ │ │ │ ├── misc.go │ │ │ │ ├── netTest.go │ │ │ │ ├── patch.go │ │ │ │ └── uuid.go │ │ │ ├── messages/ │ │ │ │ └── messages.go │ │ │ ├── pi/ │ │ │ │ ├── identities.go │ │ │ │ └── message.go │ │ │ └── users/ │ │ │ ├── oauth2.go │ │ │ └── password.go │ │ ├── py.main/ │ │ │ ├── CHANGES.rst │ │ │ ├── MANIFEST.in │ │ │ ├── README.rst │ │ │ ├── caliopen_main/ │ │ │ │ ├── __init__.py │ │ │ │ ├── common/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── base.py │ │ │ │ │ │ ├── pubkey.py │ │ │ │ │ │ └── related.py │ │ │ │ │ ├── errors.py │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── normalize.py │ │ │ │ │ │ └── strings.py │ │ │ │ │ ├── interfaces/ │ │ │ │ │ │ ├── IO.py │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── parser.py │ │ │ │ │ │ └── storage.py │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── base.py │ │ │ │ │ │ └── tag.py │ │ │ │ │ ├── parameters/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── pubkey.py │ │ │ │ │ │ ├── tag.py │ │ │ │ │ │ └── types.py │ │ │ │ │ └── store/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── pubkey.py │ │ │ │ │ └── tag.py │ │ │ │ ├── contact/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── core.py │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── contact.py │ │ │ │ │ │ ├── email.py │ │ │ │ │ │ ├── identity.py │ │ │ │ │ │ ├── im.py │ │ │ │ │ │ ├── organization.py │ │ │ │ │ │ ├── phone.py │ │ │ │ │ │ └── postal_address.py │ │ │ │ │ ├── parameters.py │ │ │ │ │ ├── parsers/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── vcard.py │ │ │ │ │ ├── returns.py │ │ │ │ │ └── store/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── contact.py │ │ │ │ │ └── contact_index.py │ │ │ │ ├── device/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── core.py │ │ │ │ │ ├── parameters.py │ │ │ │ │ └── store.py │ │ │ │ ├── discussion/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── discussion.py │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── discussion.py │ │ │ │ │ ├── parameters/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── discussion.py │ │ │ │ │ └── store/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── discussion_index.py │ │ │ │ │ └── discussion_lookup.py │ │ │ │ ├── message/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── external_references.py │ │ │ │ │ │ └── raw.py │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── attachment.py │ │ │ │ │ │ ├── external_references.py │ │ │ │ │ │ └── message.py │ │ │ │ │ ├── parameters/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── attachment.py │ │ │ │ │ │ ├── draft.py │ │ │ │ │ │ ├── external_references.py │ │ │ │ │ │ └── message.py │ │ │ │ │ ├── parsers/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ ├── mail.py │ │ │ │ │ │ ├── mastodon.py │ │ │ │ │ │ └── twitter.py │ │ │ │ │ └── store/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── attachment.py │ │ │ │ │ ├── attachment_index.py │ │ │ │ │ ├── external_references.py │ │ │ │ │ ├── external_references_index.py │ │ │ │ │ ├── message.py │ │ │ │ │ ├── message_index.py │ │ │ │ │ └── raw.py │ │ │ │ ├── notification/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── core.py │ │ │ │ │ └── store.py │ │ │ │ ├── participant/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── participant.py │ │ │ │ │ ├── objects/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── participant.py │ │ │ │ │ ├── parameters/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── participant.py │ │ │ │ │ └── store/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── participant.py │ │ │ │ │ └── participant_index.py │ │ │ │ ├── pi/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── objects.py │ │ │ │ │ └── parameters.py │ │ │ │ ├── protocol/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── core/ │ │ │ │ │ │ ├── __init__.py │ │ │ │ │ │ └── provider.py │ │ │ │ │ └── store/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── provider.py │ │ │ │ ├── tests/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── fixtures/ │ │ │ │ │ │ ├── mail/ │ │ │ │ │ │ │ ├── pgp_crypted_1.eml │ │ │ │ │ │ │ └── pgp_signed_1.eml │ │ │ │ │ │ └── vcard/ │ │ │ │ │ │ ├── multi.vcf │ │ │ │ │ │ ├── rfc2425-1.vcard │ │ │ │ │ │ ├── rfc2425-2.vcard │ │ │ │ │ │ ├── rfc2425-3.vcard │ │ │ │ │ │ ├── rfc2426-1.vcard │ │ │ │ │ │ ├── rfc2426-2.vcard │ │ │ │ │ │ ├── rfc2426-3.vcard │ │ │ │ │ │ ├── rfc2426-4.vcard │ │ │ │ │ │ ├── rfc2426-5.vcard │ │ │ │ │ │ ├── vcard1.vcf │ │ │ │ │ │ ├── vcard2.vcf │ │ │ │ │ │ └── vcard3.vcf │ │ │ │ │ └── parsers/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── test_email.py │ │ │ │ │ ├── test_mail.py │ │ │ │ │ └── test_vcard.py │ │ │ │ └── user/ │ │ │ │ ├── __init__.py │ │ │ │ ├── core/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── identity.py │ │ │ │ │ ├── setups.py │ │ │ │ │ └── user.py │ │ │ │ ├── helpers/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── mergePatch.py │ │ │ │ │ └── validators.py │ │ │ │ ├── objects/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── device.py │ │ │ │ │ ├── identity.py │ │ │ │ │ ├── settings.py │ │ │ │ │ └── tag.py │ │ │ │ ├── parameters/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── identity.py │ │ │ │ │ ├── settings.py │ │ │ │ │ ├── tag.py │ │ │ │ │ └── user.py │ │ │ │ ├── returns/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ └── user.py │ │ │ │ └── store/ │ │ │ │ ├── __init__.py │ │ │ │ ├── identity.py │ │ │ │ ├── tag.py │ │ │ │ ├── user.py │ │ │ │ └── user_index.py │ │ │ ├── requirements.deps │ │ │ ├── setup.cfg │ │ │ └── setup.py │ │ └── py.storage/ │ │ ├── CHANGES.rst │ │ ├── MANIFEST.in │ │ ├── README.rst │ │ ├── caliopen_storage/ │ │ │ ├── __init__.py │ │ │ ├── config.py │ │ │ ├── core/ │ │ │ │ ├── __init__.py │ │ │ │ ├── base.py │ │ │ │ ├── mixin.py │ │ │ │ └── registry.py │ │ │ ├── exception.py │ │ │ ├── helpers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── connection.py │ │ │ │ └── json.py │ │ │ ├── parameters.py │ │ │ ├── returns.py │ │ │ └── store/ │ │ │ ├── __init__.py │ │ │ ├── mixin.py │ │ │ └── model.py │ │ ├── setup.cfg │ │ └── setup.py │ ├── protocols/ │ │ ├── go.imap/ │ │ │ ├── cmd/ │ │ │ │ ├── imapctl/ │ │ │ │ │ ├── cli_cmds/ │ │ │ │ │ │ ├── addremote.go │ │ │ │ │ │ ├── fullfetch.go │ │ │ │ │ │ ├── root.go │ │ │ │ │ │ └── syncremote.go │ │ │ │ │ └── main.go │ │ │ │ └── imapworker/ │ │ │ │ ├── cli_cmds/ │ │ │ │ │ ├── root.go │ │ │ │ │ └── start.go │ │ │ │ └── main.go │ │ │ ├── config.go │ │ │ ├── fetcher.go │ │ │ ├── imap.go │ │ │ ├── imap_test.go │ │ │ ├── lda.go │ │ │ ├── sender.go │ │ │ ├── sender_test.go │ │ │ ├── worker.go │ │ │ └── worker_test.go │ │ ├── go.mastodon/ │ │ │ ├── account.go │ │ │ ├── cmd/ │ │ │ │ └── mastodonworker/ │ │ │ │ ├── cli_cmds/ │ │ │ │ │ ├── root.go │ │ │ │ │ └── start.go │ │ │ │ └── main.go │ │ │ ├── messaging.go │ │ │ └── worker.go │ │ ├── go.smtp/ │ │ │ ├── cmd/ │ │ │ │ └── caliopen_lmtpd/ │ │ │ │ ├── cli_cmds/ │ │ │ │ │ ├── root.go │ │ │ │ │ └── serve.go │ │ │ │ └── main.go │ │ │ ├── config.go │ │ │ ├── envelope.go │ │ │ ├── lda.go │ │ │ ├── lmtpd.go │ │ │ ├── oauth.go │ │ │ ├── protocol.go │ │ │ ├── receiver.go │ │ │ ├── server.go │ │ │ └── submitter.go │ │ └── go.twitter/ │ │ ├── account.go │ │ ├── account_test.go │ │ ├── cmd/ │ │ │ └── twitterworker/ │ │ │ ├── cli_cmds/ │ │ │ │ ├── root.go │ │ │ │ └── start.go │ │ │ └── main.go │ │ ├── messaging.go │ │ ├── messaging_test.go │ │ ├── worker.go │ │ └── worker_test.go │ ├── tools/ │ │ ├── go.CLI/ │ │ │ └── cmd/ │ │ │ └── gocaliopen/ │ │ │ ├── cli_cmds/ │ │ │ │ ├── changeIdentitiyEmailProtocol.go │ │ │ │ ├── changeUserIdentitiesCredentialsKeys.go │ │ │ │ ├── fixMissingParticipants.go │ │ │ │ ├── identitiesMigration.go │ │ │ │ └── root.go │ │ │ └── main.go │ │ ├── py.CLI/ │ │ │ ├── CHANGES.rst │ │ │ ├── README.rst │ │ │ ├── caliopen_cli/ │ │ │ │ ├── __init__.py │ │ │ │ ├── cli.py │ │ │ │ ├── commands/ │ │ │ │ │ ├── __init__.py │ │ │ │ │ ├── compute.py │ │ │ │ │ ├── copy_model.py │ │ │ │ │ ├── create_user.py │ │ │ │ │ ├── dump_indexes_mappings.py │ │ │ │ │ ├── dump_model.py │ │ │ │ │ ├── import_email.py │ │ │ │ │ ├── import_vcard.py │ │ │ │ │ ├── inject_email.py │ │ │ │ │ ├── migrate_index.py │ │ │ │ │ ├── reserved_names.py │ │ │ │ │ ├── resync_index.py │ │ │ │ │ ├── resync_shard_index.py │ │ │ │ │ ├── setup.py │ │ │ │ │ ├── setup_notifications_ttls.py │ │ │ │ │ ├── setup_storage.py │ │ │ │ │ └── shell.py │ │ │ │ └── utils/ │ │ │ │ ├── __init__.py │ │ │ │ └── user_token.py │ │ │ ├── requirements.deps │ │ │ ├── setup.cfg │ │ │ └── setup.py │ │ ├── py.ML/ │ │ │ ├── CHANGES.rst │ │ │ ├── README.rst │ │ │ ├── caliopen_climl/ │ │ │ │ ├── __init__.py │ │ │ │ └── cli.py │ │ │ ├── requirements.deps │ │ │ ├── setup.cfg │ │ │ └── setup.py │ │ ├── py.doc/ │ │ │ ├── CHANGES.rst │ │ │ ├── README.rst │ │ │ ├── caliopen_api_doc/ │ │ │ │ ├── __init__.py │ │ │ │ ├── config.py │ │ │ │ └── swagger-ui/ │ │ │ │ ├── css/ │ │ │ │ │ ├── print.css │ │ │ │ │ ├── reset.css │ │ │ │ │ ├── screen.css │ │ │ │ │ ├── style.css │ │ │ │ │ └── typography.css │ │ │ │ ├── index.html │ │ │ │ ├── lang/ │ │ │ │ │ ├── ca.js │ │ │ │ │ ├── el.js │ │ │ │ │ ├── en.js │ │ │ │ │ ├── es.js │ │ │ │ │ ├── fr.js │ │ │ │ │ ├── geo.js │ │ │ │ │ ├── it.js │ │ │ │ │ ├── ja.js │ │ │ │ │ ├── ko-kr.js │ │ │ │ │ ├── pl.js │ │ │ │ │ ├── pt.js │ │ │ │ │ ├── ru.js │ │ │ │ │ ├── tr.js │ │ │ │ │ ├── translator.js │ │ │ │ │ └── zh-cn.js │ │ │ │ ├── lib/ │ │ │ │ │ ├── backbone-min.js │ │ │ │ │ ├── es5-shim.js │ │ │ │ │ ├── handlebars-4.0.5.js │ │ │ │ │ ├── highlight.9.1.0.pack.js │ │ │ │ │ ├── highlight.9.1.0.pack_extended.js │ │ │ │ │ ├── marked.js │ │ │ │ │ ├── object-assign-pollyfill.js │ │ │ │ │ └── swagger-oauth.js │ │ │ │ ├── o2c.html │ │ │ │ └── swagger-ui.js │ │ │ ├── setup.cfg │ │ │ └── setup.py │ │ └── py.migrate/ │ │ ├── CHANGES.rst │ │ ├── README.rst │ │ ├── caliopen_migrate/ │ │ │ ├── __init__.py │ │ │ ├── cli.py │ │ │ ├── shards.py │ │ │ ├── user.py │ │ │ └── welcome_message.py │ │ ├── setup.cfg │ │ └── setup.py │ └── workers/ │ └── go.remoteIDs/ │ ├── cmd/ │ │ └── idpoller/ │ │ ├── cli_cmds/ │ │ │ ├── root.go │ │ │ └── start.go │ │ └── main.go │ ├── identities.go │ ├── identities_test.go │ ├── idpoller.go │ ├── idpollertest/ │ │ └── testsreplies.go │ ├── jobs.go │ ├── jobs_test.go │ ├── messaging.go │ ├── messaging_test.go │ ├── scheduler.go │ └── scheduler_test.go └── frontend/ ├── maintenance/ │ ├── Dockerfile │ ├── README.md │ ├── config/ │ │ └── nginx-config-maintenance.conf │ ├── package.json │ └── src/ │ ├── assets/ │ │ ├── css/ │ │ │ └── style.css │ │ ├── js/ │ │ │ └── init.js │ │ └── scss/ │ │ ├── params/ │ │ │ ├── _fonts.scss │ │ │ ├── _grid.scss │ │ │ ├── _images.scss │ │ │ └── _variables.scss │ │ └── style.scss │ └── index.html ├── not_found/ │ ├── 404.html │ └── assets/ │ └── app.client.e4ae8e333ea54a53ba14.css └── web_application/ ├── .babelrc ├── .dockerignore ├── .eslintrc.json ├── .gitignore ├── .prettierignore ├── .prettierrc.js ├── .stylelintrc.yml ├── CONTRIBUTING.md ├── Dockerfile ├── Dockerfile.caliopen-node ├── README.md ├── __mocks__/ │ ├── fileMock.js │ └── styleMock.js ├── bin/ │ ├── dev-server │ └── server ├── config/ │ ├── client.default.js │ ├── server.default.js │ └── server.env-var.js ├── lingui.config.ts ├── locale/ │ ├── de/ │ │ └── messages.json │ ├── en/ │ │ └── messages.json │ ├── es/ │ │ └── messages.json │ └── fr/ │ └── messages.json ├── package.json ├── postcss.config.js ├── public/ │ └── privacy-policy.html ├── server/ │ ├── api/ │ │ ├── index.js │ │ └── lib/ │ │ ├── api.ts │ │ └── sub-request-manager.js │ ├── app.ts │ ├── assets/ │ │ └── index.js │ ├── auth/ │ │ ├── index.js │ │ ├── lib/ │ │ │ ├── cookie.ts │ │ │ ├── redirect.ts │ │ │ └── seal.ts │ │ ├── middlewares/ │ │ │ ├── decode-cookie.ts │ │ │ └── index.ts │ │ └── router/ │ │ ├── index.js │ │ ├── signin.js │ │ └── signup.ts │ ├── config/ │ │ └── index.js │ ├── error/ │ │ ├── components/ │ │ │ └── Error/ │ │ │ └── index.jsx │ │ ├── consts.ts │ │ ├── index.js │ │ └── middlewares/ │ │ └── catch-error.js │ ├── express-react/ │ │ ├── create-engine.js │ │ ├── index.js │ │ └── view.js │ ├── index.js │ ├── logger/ │ │ ├── getLogger.js │ │ ├── index.js │ │ └── middlewares/ │ │ └── httpLog.js │ └── ssr/ │ ├── components/ │ │ └── Bootstrap.tsx │ ├── index.js │ └── ssr-middleware.ts ├── src/ │ ├── App.tsx │ ├── app.scss │ ├── components/ │ │ ├── ActionBar/ │ │ │ ├── components/ │ │ │ │ ├── ActionBarButton/ │ │ │ │ │ └── index.tsx │ │ │ │ └── ActionBarWrapper/ │ │ │ │ ├── index.tsx │ │ │ │ └── styles.scss │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── AdvancedSelectFieldGroup/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── AppLoader/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Badge/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── BlockList/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Brand/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Button/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Callout/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Checkbox/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── CheckboxFieldGroup/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Confirm/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── DatePickerGroup/ │ │ │ ├── index.jsx │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── DefList/ │ │ │ ├── index.jsx │ │ │ ├── index.spec.jsx │ │ │ └── style.scss │ │ ├── Dropdown/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ ├── services/ │ │ │ │ ├── getDropdownStyle.spec.ts │ │ │ │ └── getDropdownStyle.ts │ │ │ └── style.scss │ │ ├── DropdownMenu/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── FieldErrors/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── FieldGroup/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── Fieldset/ │ │ │ ├── components/ │ │ │ │ └── Legend/ │ │ │ │ └── index.jsx │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── FileSize/ │ │ │ ├── index.spec.tsx │ │ │ └── index.tsx │ │ ├── FormGrid/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Icon/ │ │ │ ├── __snapshots__/ │ │ │ │ └── index.spec.tsx.snap │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── InfiniteScroll/ │ │ │ └── index.jsx │ │ ├── InputFile/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── InputFileGroup/ │ │ │ ├── components/ │ │ │ │ └── File/ │ │ │ │ └── index.jsx │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── InputText/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Label/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── Link/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── MenuBar/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── MessageDate/ │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── Modal/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── NavList/ │ │ │ ├── components/ │ │ │ │ └── NavItem.tsx │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── PageTitle/ │ │ │ ├── index.jsx │ │ │ └── presenter.jsx │ │ ├── ParticipantsIconLetter/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── PasswordStrength/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── PiBar/ │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── PlaceholderBlock/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── PlaceholderList/ │ │ │ ├── index.scss │ │ │ └── index.tsx │ │ ├── RadioFieldGroup/ │ │ │ ├── index.jsx │ │ │ ├── index.spec.jsx │ │ │ └── style.scss │ │ ├── RawButton/ │ │ │ └── index.tsx │ │ ├── Section/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── SelectFieldGroup/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── SidebarLayout/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── Spinner/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Subtitle/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Switch/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── TextBlock/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── TextFieldGroup/ │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── TextList/ │ │ │ ├── components/ │ │ │ │ └── TextItem.tsx │ │ │ ├── index.spec.jsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Textarea/ │ │ │ ├── index.jsx │ │ │ ├── index.spec.jsx │ │ │ └── style.scss │ │ ├── TextareaFieldGroup/ │ │ │ ├── index.jsx │ │ │ ├── index.spec.jsx │ │ │ └── style.scss │ │ ├── Title/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── VerticalMenu/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ └── index.js │ ├── global.d.ts │ ├── hooks/ │ │ └── forwardedRef.ts │ ├── image.d.ts │ ├── index.jsx │ ├── layouts/ │ │ ├── AboutPage/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── AuthPage/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── ErrorBoundary/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── Page/ │ │ │ ├── components/ │ │ │ │ ├── Footer/ │ │ │ │ │ ├── footer.scss │ │ │ │ │ └── index.jsx │ │ │ │ ├── HorizontalScroll/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── InstallButton/ │ │ │ │ │ └── index.jsx │ │ │ │ ├── Navbar/ │ │ │ │ │ └── components/ │ │ │ │ │ ├── ApplicationTab/ │ │ │ │ │ │ ├── application-tab.scss │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── ContactAssociationTab/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── ContactTab/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── DiscussionTab/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── ItemButton/ │ │ │ │ │ │ ├── index.jsx │ │ │ │ │ │ └── style.scss │ │ │ │ │ ├── ItemLink/ │ │ │ │ │ │ ├── index.jsx │ │ │ │ │ │ └── style.scss │ │ │ │ │ ├── NavbarItem/ │ │ │ │ │ │ ├── index.jsx │ │ │ │ │ │ └── style.scss │ │ │ │ │ ├── SearchTab/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── Tab/ │ │ │ │ │ │ ├── index.jsx │ │ │ │ │ │ └── style.scss │ │ │ │ │ └── index.js │ │ │ │ ├── Navigation/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ ├── style.scss │ │ │ │ │ └── withTabs.jsx │ │ │ │ ├── NotificationCenter/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── TakeATour/ │ │ │ │ ├── components/ │ │ │ │ │ ├── Guide/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ ├── Tour/ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ └── TourPortal/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── index.js │ │ │ │ ├── presenter.jsx │ │ │ │ └── style.scss │ │ │ ├── header.scss │ │ │ ├── index.jsx │ │ │ ├── navbar.scss │ │ │ └── style.scss │ │ ├── PageContainer/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── SearchResults/ │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── Settings/ │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ └── User/ │ │ ├── index.js │ │ ├── presenter.jsx │ │ └── styles.scss │ ├── modules/ │ │ ├── a11y/ │ │ │ ├── index.js │ │ │ └── services/ │ │ │ └── tabIndexes.js │ │ ├── avatar/ │ │ │ ├── components/ │ │ │ │ ├── AuthorAvatarLetter/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── index.spec.jsx │ │ │ │ ├── AvatarLetter/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── services/ │ │ │ │ │ │ └── stylesheet-helper/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── index.spec.js │ │ │ │ │ └── style.scss │ │ │ │ ├── AvatarLetterWrapper/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── ContactAvatarLetter/ │ │ │ │ ├── index.jsx │ │ │ │ └── index.spec.jsx │ │ │ ├── index.js │ │ │ └── services/ │ │ │ └── stylesheet-helper/ │ │ │ ├── index.js │ │ │ └── index.spec.js │ │ ├── contact/ │ │ │ ├── actions/ │ │ │ │ ├── deleteContacts.js │ │ │ │ ├── getContact.ts │ │ │ │ ├── loadMoreContacts.ts │ │ │ │ └── updateContact.js │ │ │ ├── components/ │ │ │ │ ├── ContactList/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── ContactItem/ │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── style.scss │ │ │ │ │ │ └── ContactItemPlaceholder.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ └── WithContacts/ │ │ │ │ ├── index.js │ │ │ │ └── presenter.jsx │ │ │ ├── consts.ts │ │ │ ├── hoc/ │ │ │ │ └── withContacts.jsx │ │ │ ├── hooks/ │ │ │ │ └── useContacts.ts │ │ │ ├── index.ts │ │ │ ├── query.ts │ │ │ ├── selectors/ │ │ │ │ └── contactSelector.ts │ │ │ ├── services/ │ │ │ │ ├── addAddressToContact.js │ │ │ │ ├── form.ts │ │ │ │ ├── format.spec.ts │ │ │ │ ├── format.ts │ │ │ │ └── identityTypes.js │ │ │ ├── store/ │ │ │ │ ├── index.ts │ │ │ │ ├── reducer.ts │ │ │ │ └── selectors.ts │ │ │ └── types.d.ts │ │ ├── control/ │ │ │ ├── components/ │ │ │ │ ├── ComposeButton/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── ComposeContactButton/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── presenter.jsx │ │ │ │ ├── CreateContactButton/ │ │ │ │ │ └── index.jsx │ │ │ │ └── PageActions/ │ │ │ │ ├── action-btns.scss │ │ │ │ ├── index.jsx │ │ │ │ └── style.scss │ │ │ └── index.js │ │ ├── device/ │ │ │ ├── actions/ │ │ │ │ ├── requestDevice.js │ │ │ │ ├── requestDevices.js │ │ │ │ ├── revokeDevice.js │ │ │ │ ├── saveDevice.js │ │ │ │ └── verifyDevice.js │ │ │ ├── hooks/ │ │ │ │ ├── useDevice.ts │ │ │ │ └── useDevices.ts │ │ │ ├── index.ts │ │ │ ├── selectors.ts │ │ │ ├── services/ │ │ │ │ ├── clientDevice.ts │ │ │ │ ├── ecdsa/ │ │ │ │ │ └── index.ts │ │ │ │ ├── signature/ │ │ │ │ │ ├── index.spec.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── status.js │ │ │ │ └── storage/ │ │ │ │ └── index.ts │ │ │ └── types.d.ts │ │ ├── discussion/ │ │ │ ├── actions/ │ │ │ │ └── requestDiscussionIdForParticipants.js │ │ │ ├── hooks/ │ │ │ │ └── useDiscussion.ts │ │ │ ├── index.js │ │ │ ├── query.ts │ │ │ └── selectors/ │ │ │ ├── discussionDraftSelector.js │ │ │ ├── discussionIdSelector.js │ │ │ ├── discussionSelector.js │ │ │ └── discussionsSelector.ts │ │ ├── draftIdentity/ │ │ │ ├── hooks/ │ │ │ │ └── useAvailableIdentities.ts │ │ │ └── index.ts │ │ ├── draftMessage/ │ │ │ ├── actions/ │ │ │ │ ├── consolidateParticipants.js │ │ │ │ ├── getDefaultIdentity.js │ │ │ │ ├── getDefaultIdentity.spec.js │ │ │ │ ├── reply.ts │ │ │ │ ├── requestDraft.ts │ │ │ │ ├── requestParticipantSuggestions.spec.ts │ │ │ │ ├── requestParticipantSuggestions.ts │ │ │ │ ├── saveDraft.ts │ │ │ │ └── sendDraft.ts │ │ │ ├── components/ │ │ │ │ ├── AttachmentManager/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── Recipient/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ └── presenter.spec.jsx │ │ │ │ ├── RecipientList.scss │ │ │ │ ├── RecipientList.spec.tsx │ │ │ │ ├── RecipientList.tsx │ │ │ │ └── RecipientSelector.tsx │ │ │ ├── index.js │ │ │ ├── models.ts │ │ │ ├── selectors/ │ │ │ │ └── draft.ts │ │ │ ├── services/ │ │ │ │ ├── calcSyncDraft.spec.ts │ │ │ │ ├── calcSyncDraft.ts │ │ │ │ ├── changeAuthorInParticipants.js │ │ │ │ ├── changeAuthorInParticipants.spec.js │ │ │ │ ├── filterIdentities.js │ │ │ │ ├── filterIdentities.spec.js │ │ │ │ ├── getIdentityProtocol.js │ │ │ │ ├── isValidRecipient.js │ │ │ │ ├── isValidRecipient.spec.js │ │ │ │ └── validate.ts │ │ │ └── types.d.ts │ │ ├── encryption/ │ │ │ ├── actions/ │ │ │ │ ├── decryptMessage.js │ │ │ │ ├── encryptMessage.js │ │ │ │ ├── fetchRemoteKeys.js │ │ │ │ └── getRecipientKeys.js │ │ │ ├── components/ │ │ │ │ ├── AskPassphraseForm/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── CheckDecryption/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── LockedMessage/ │ │ │ │ ├── index.jsx │ │ │ │ └── style.scss │ │ │ ├── index.js │ │ │ ├── selectors/ │ │ │ │ ├── message.ts │ │ │ │ └── publicKey.js │ │ │ └── services/ │ │ │ └── keyring/ │ │ │ └── remoteKeys.js │ │ ├── file/ │ │ │ ├── actions/ │ │ │ │ ├── deleteDraftAttachment.js │ │ │ │ └── uploadDraftAttachments.js │ │ │ ├── index.js │ │ │ └── services/ │ │ │ ├── index.js │ │ │ └── uploadFileAsFormField.js │ │ ├── form/ │ │ │ ├── components/ │ │ │ │ └── FormikPersist.tsx │ │ │ └── services/ │ │ │ └── validators.ts │ │ ├── i18n/ │ │ │ ├── components/ │ │ │ │ └── I18nLoader.tsx │ │ │ ├── index.js │ │ │ └── services/ │ │ │ ├── getBestLocale.js │ │ │ ├── getLanguage.js │ │ │ └── getUserLocales.js │ │ ├── identity/ │ │ │ ├── actions/ │ │ │ │ ├── getIdentities.js │ │ │ │ ├── getLocalIdentities.js │ │ │ │ └── getRemoteIdentities.js │ │ │ ├── components/ │ │ │ │ └── WithIdentities/ │ │ │ │ ├── index.js │ │ │ │ └── presenter.jsx │ │ │ ├── hoc/ │ │ │ │ └── withIdentities.jsx │ │ │ ├── hooks/ │ │ │ │ └── useIdentities.ts │ │ │ ├── index.js │ │ │ ├── selectors/ │ │ │ │ └── identitiesSelector.js │ │ │ ├── services/ │ │ │ │ └── identityToParticipant.js │ │ │ └── types.d.ts │ │ ├── message/ │ │ │ ├── actions/ │ │ │ │ ├── createMessage.js │ │ │ │ ├── deleteMessage.js │ │ │ │ ├── fetchMessages.js │ │ │ │ ├── getDraft.spec.ts │ │ │ │ ├── getDraft.ts │ │ │ │ ├── getLastMessage.js │ │ │ │ ├── getLastMessage.spec.js │ │ │ │ ├── getMessage.js │ │ │ │ ├── getMessages.js │ │ │ │ ├── getParentMessage.js │ │ │ │ ├── requestDiscussion.js │ │ │ │ ├── requestMessages.js │ │ │ │ └── setMessageRead.js │ │ │ ├── components/ │ │ │ │ └── ParticipantLabel/ │ │ │ │ ├── index.js │ │ │ │ └── presenter.jsx │ │ │ ├── hooks/ │ │ │ │ └── useMessage.ts │ │ │ ├── index.js │ │ │ ├── models/ │ │ │ │ ├── Message.ts │ │ │ │ └── Participant.ts │ │ │ ├── query.ts │ │ │ ├── selectors/ │ │ │ │ └── messageSelector.js │ │ │ ├── services/ │ │ │ │ ├── findUserParticipant.js │ │ │ │ ├── findUserParticipant.spec.js │ │ │ │ ├── getLastMessageFromArray.js │ │ │ │ ├── isUserParticipant.js │ │ │ │ ├── isUserParticipant.spec.js │ │ │ │ └── sortMessages.js │ │ │ └── types.d.ts │ │ ├── notification/ │ │ │ ├── components/ │ │ │ │ ├── MessageNotificationHandler/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── presenter.jsx │ │ │ │ └── NotificationProvider/ │ │ │ │ ├── index.js │ │ │ │ └── presenter.jsx │ │ │ ├── index.js │ │ │ ├── selectors/ │ │ │ │ └── messageNotificationsSelector.js │ │ │ └── services/ │ │ │ └── notification.worker.js │ │ ├── pi/ │ │ │ ├── components/ │ │ │ │ ├── BackgroundImage/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── o-background-image.scss │ │ │ │ │ └── style.scss │ │ │ │ ├── MultidimensionalPi/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── PiGraph/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── PiScore/ │ │ │ │ │ └── index.tsx │ │ │ │ └── Ratings/ │ │ │ │ ├── index.jsx │ │ │ │ └── style.scss │ │ │ ├── index.jsx │ │ │ ├── services/ │ │ │ │ ├── pi/ │ │ │ │ │ ├── index.spec.ts │ │ │ │ │ └── index.ts │ │ │ │ └── svg/ │ │ │ │ ├── index.js │ │ │ │ └── index.spec.jsx │ │ │ └── types.d.ts │ │ ├── publicKey/ │ │ │ ├── actions/ │ │ │ │ ├── saveUserPublicKeyAction.js │ │ │ │ └── updatePublicKey.js │ │ │ └── index.js │ │ ├── pwa/ │ │ │ ├── components/ │ │ │ │ ├── InstallPromptConsumer.tsx │ │ │ │ └── InstallPromptProvider.tsx │ │ │ ├── contexts/ │ │ │ │ └── InstallPromptContext.ts │ │ │ └── index.js │ │ ├── remoteIdentity/ │ │ │ ├── actions/ │ │ │ │ ├── createIdentity.js │ │ │ │ ├── deleteIdentity.js │ │ │ │ └── updateIdentity.js │ │ │ ├── components/ │ │ │ │ ├── ProviderIcon/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── WithProviders/ │ │ │ │ ├── index.js │ │ │ │ └── presenter.jsx │ │ │ ├── hoc/ │ │ │ │ ├── withAuthorize.jsx │ │ │ │ ├── withAuthorizePopup.jsx │ │ │ │ └── withProviders.jsx │ │ │ ├── index.js │ │ │ ├── model/ │ │ │ │ └── Identity.js │ │ │ ├── selectors/ │ │ │ │ ├── identitiesSelector.js │ │ │ │ ├── identitySelector.js │ │ │ │ └── identityStateSelector.js │ │ │ └── services/ │ │ │ └── getProvider.js │ │ ├── routing/ │ │ │ ├── components/ │ │ │ │ ├── AuthenticatedLayout/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── withAuthenticatedProps.jsx │ │ │ │ ├── RoutingConsumer.jsx │ │ │ │ ├── RoutingProvider.jsx │ │ │ │ └── SwitchWithRoutes/ │ │ │ │ ├── index.jsx │ │ │ │ └── index.spec.jsx │ │ │ ├── contexts/ │ │ │ │ └── RoutingContext.js │ │ │ ├── hoc/ │ │ │ │ ├── withPush.jsx │ │ │ │ ├── withReplace.jsx │ │ │ │ ├── withRouteParams.jsx │ │ │ │ └── withSearchParams.jsx │ │ │ ├── hooks/ │ │ │ │ └── useSearchParams.ts │ │ │ ├── index.js │ │ │ └── services/ │ │ │ ├── findTabbableRouteConfig.js │ │ │ ├── flattenRouteConfig.js │ │ │ ├── flattenRouteConfig.spec.jsx │ │ │ ├── getRouterHistory.js │ │ │ ├── getSearchParams.spec.ts │ │ │ ├── getSearchParams.ts │ │ │ ├── signout.js │ │ │ └── url/ │ │ │ ├── CrappyURLSearchParams.js │ │ │ ├── CrappyURLSearchParams.spec.js │ │ │ ├── QueryStringSerializer.js │ │ │ ├── buildURL.js │ │ │ └── index.js │ │ ├── scroll/ │ │ │ ├── components/ │ │ │ │ └── ScrollDetector/ │ │ │ │ ├── index.js │ │ │ │ └── index.js.w_detection │ │ │ ├── hoc/ │ │ │ │ ├── withScrollManager.jsx │ │ │ │ └── withScrollTarget.jsx │ │ │ ├── hooks/ │ │ │ │ └── useScrollToMe.ts │ │ │ ├── index.js │ │ │ ├── services/ │ │ │ │ ├── getTop.js │ │ │ │ ├── getViewPortTop.js │ │ │ │ └── scrollTop.js │ │ │ └── vendors/ │ │ │ └── scroll-doc.js │ │ ├── search/ │ │ │ ├── components/ │ │ │ │ └── SearchField/ │ │ │ │ ├── index.js │ │ │ │ ├── presenter.jsx │ │ │ │ └── style.scss │ │ │ └── index.js │ │ ├── settings/ │ │ │ ├── components/ │ │ │ │ └── WithSettings/ │ │ │ │ ├── index.js │ │ │ │ ├── presenter.jsx │ │ │ │ └── presenter.spec.jsx │ │ │ ├── hoc/ │ │ │ │ └── withSettings.js │ │ │ ├── hooks/ │ │ │ │ └── useSettings.ts │ │ │ ├── index.js │ │ │ ├── selectors/ │ │ │ │ └── settings.ts │ │ │ ├── services/ │ │ │ │ └── getDefaultSettings/ │ │ │ │ └── index.js │ │ │ └── types.d.ts │ │ ├── tab/ │ │ │ ├── components/ │ │ │ │ ├── TabConsumer/ │ │ │ │ │ └── index.jsx │ │ │ │ └── TabProvider/ │ │ │ │ └── index.jsx │ │ │ ├── contexts/ │ │ │ │ └── TabContext.js │ │ │ ├── hoc/ │ │ │ │ ├── withCloseTab.jsx │ │ │ │ ├── withCurrentTab.jsx │ │ │ │ └── withUpdateTab.jsx │ │ │ ├── hooks/ │ │ │ │ ├── useCloseTab.ts │ │ │ │ └── useCurentTab.ts │ │ │ ├── index.js │ │ │ ├── model/ │ │ │ │ └── Tab.js │ │ │ └── services/ │ │ │ └── getTabUrl.js │ │ ├── tags/ │ │ │ ├── components/ │ │ │ │ ├── ManageEntityTags.spec.tsx │ │ │ │ ├── ManageEntityTags.tsx │ │ │ │ ├── TagFieldGroup/ │ │ │ │ │ ├── index.spec.jsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── TagItem/ │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ └── index.spec.tsx.snap │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ └── TagsForm/ │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── style.scss │ │ │ ├── hoc/ │ │ │ │ └── withTags/ │ │ │ │ └── index.jsx │ │ │ ├── hooks/ │ │ │ │ └── useTags.ts │ │ │ ├── index.ts │ │ │ ├── query.ts │ │ │ ├── services/ │ │ │ │ ├── getTagLabel/ │ │ │ │ │ ├── index.spec.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── getTagNamesInCommon.spec.ts │ │ │ │ ├── getTagNamesInCommon.ts │ │ │ │ ├── searchTags.spec.ts │ │ │ │ └── searchTags.ts │ │ │ ├── store/ │ │ │ │ ├── index.ts │ │ │ │ ├── reducer.ts │ │ │ │ └── selectors.ts │ │ │ └── types.d.ts │ │ ├── user/ │ │ │ ├── actions/ │ │ │ │ └── getUser.js │ │ │ ├── components/ │ │ │ │ ├── SigninForm/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── SubmitButton.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── SignupForm/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── PiwikModal.tsx │ │ │ │ │ ├── form-validator.spec.ts │ │ │ │ │ ├── form-validator.ts │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── UserInfo/ │ │ │ │ │ ├── UserInfo.spec.tsx │ │ │ │ │ ├── index.js │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── UserMenu/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── next-feature-button.scss │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ ├── presenter.spec.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── WithUser/ │ │ │ │ ├── index.js │ │ │ │ └── presenter.jsx │ │ │ ├── hoc/ │ │ │ │ └── withUser.jsx │ │ │ ├── hooks/ │ │ │ │ └── useUser.ts │ │ │ ├── index.ts │ │ │ ├── selectors/ │ │ │ │ └── userSelector.ts │ │ │ ├── services/ │ │ │ │ ├── deleteUser.js │ │ │ │ ├── isAuthenticated/ │ │ │ │ │ └── index.js │ │ │ │ ├── signup/ │ │ │ │ │ └── index.js │ │ │ │ └── usernameNormalizer/ │ │ │ │ └── index.js │ │ │ ├── store/ │ │ │ │ ├── index.ts │ │ │ │ ├── reducer.ts │ │ │ │ └── selectors.ts │ │ │ └── types.d.ts │ │ ├── userNotify/ │ │ │ ├── actions/ │ │ │ │ └── notify.js │ │ │ ├── hoc/ │ │ │ │ └── withNotification.jsx │ │ │ └── index.js │ │ └── view/ │ │ ├── actions/ │ │ │ └── requestMessages.js │ │ ├── components/ │ │ │ └── WithViewModel/ │ │ │ └── index.jsx │ │ ├── config.js │ │ ├── index.js │ │ ├── models/ │ │ │ └── View.js │ │ └── selectors/ │ │ └── viewSelector.js │ ├── scenes/ │ │ ├── About/ │ │ │ ├── components/ │ │ │ │ └── StylezedScreenshot/ │ │ │ │ └── index.tsx │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── ApplicationSettings/ │ │ │ ├── components/ │ │ │ │ ├── ContactSettings/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── presenter.jsx │ │ │ │ ├── DesktopNotificationSettings/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── InterfaceSettings/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── presenter.jsx │ │ │ │ ├── MessageSettings/ │ │ │ │ │ ├── index.js │ │ │ │ │ └── presenter.jsx │ │ │ │ └── NotificationSettings/ │ │ │ │ ├── index.js │ │ │ │ └── presenter.jsx │ │ │ ├── index.jsx │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── ContactAssociation/ │ │ │ ├── contact-association.scss │ │ │ ├── index.spec.tsx │ │ │ └── index.tsx │ │ ├── DevicesSettings/ │ │ │ ├── components/ │ │ │ │ ├── DeviceForm/ │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── DeviceInformation/ │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── DeviceSettings/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── RevokeDevice/ │ │ │ │ │ ├── index.spec.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ └── VerifyDevice/ │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── style.scss │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Discussion/ │ │ │ ├── components/ │ │ │ │ ├── AddParticipantsToContactBook/ │ │ │ │ │ ├── add-participants-dropdown.scss │ │ │ │ │ └── index.jsx │ │ │ │ ├── DownloadFileProgression/ │ │ │ │ │ └── index.jsx │ │ │ │ ├── InstantMessage/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── instant-message-aside.scss │ │ │ │ │ ├── instant-message-author.scss │ │ │ │ │ ├── instant-message-participants.scss │ │ │ │ │ └── style.scss │ │ │ │ ├── MailMessage/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── mail-message-details.scss │ │ │ │ │ └── style.scss │ │ │ │ ├── Message.tsx │ │ │ │ ├── MessageAttachments/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── MessageList/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── MessagePi/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── MessageRecipients.tsx │ │ │ │ ├── ProtocolSwitch/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── QuickDraftForm/ │ │ │ │ │ ├── components/ │ │ │ │ │ │ └── ToggleAdvancedFormButton/ │ │ │ │ │ │ ├── index.jsx │ │ │ │ │ │ └── toggle-advanced-draft-button.scss │ │ │ │ │ ├── draft-message-quick.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── ReplyExcerpt/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── TagList/ │ │ │ │ ├── index.jsx │ │ │ │ └── style.scss │ │ │ ├── discussion-action-bar.scss │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ ├── style.scss │ │ │ └── types.d.ts │ │ ├── ForgotPassword/ │ │ │ ├── components/ │ │ │ │ └── ForgotPasswordForm/ │ │ │ │ ├── index.jsx │ │ │ │ ├── presenter.jsx │ │ │ │ └── style.scss │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── presenter.spec.jsx │ │ ├── NewDeviceInfo/ │ │ │ ├── index.jsx │ │ │ └── style.scss │ │ ├── NewDraft/ │ │ │ ├── components/ │ │ │ │ ├── DraftDiscussion/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── useDraftDiscussion.tsx │ │ │ │ └── DraftMessage/ │ │ │ │ ├── components/ │ │ │ │ │ ├── IdentitySelector.tsx │ │ │ │ │ └── Recipients.tsx │ │ │ │ ├── draft-message-advanced.scss │ │ │ │ ├── draft-message-placeholder.scss │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── RemoteIdentitySettings/ │ │ │ ├── components/ │ │ │ │ ├── AuthButton/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── LastConnection/ │ │ │ │ │ └── index.jsx │ │ │ │ ├── NewIdentity/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── new-identity.scss │ │ │ │ │ ├── provider-email-button.scss │ │ │ │ │ └── provider-list.scss │ │ │ │ ├── ProviderButton/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── ProviderButtonContainer/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── RemoteIdentity/ │ │ │ │ │ └── index.jsx │ │ │ │ ├── RemoteIdentityDetails/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── RemoteIdentityEmail/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── RemoteIdentityOauth/ │ │ │ │ │ └── index.jsx │ │ │ │ └── Status/ │ │ │ │ └── index.jsx │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── ResetPassword/ │ │ │ ├── components/ │ │ │ │ └── ResetPasswordForm/ │ │ │ │ ├── index.jsx │ │ │ │ ├── presenter.jsx │ │ │ │ └── style.scss │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── presenter.spec.jsx │ │ ├── SearchResults/ │ │ │ ├── components/ │ │ │ │ ├── ContactResultItem/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── Highlights/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ ├── index.spec.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── MessageResultItem/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.scss │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── SettingsSignatures/ │ │ │ ├── components/ │ │ │ │ └── SignatureForm/ │ │ │ │ ├── index.jsx │ │ │ │ └── presenter.jsx │ │ │ ├── index.jsx │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── Signin.tsx │ │ ├── Signup.tsx │ │ ├── TagsSettings/ │ │ │ ├── components/ │ │ │ │ ├── TagInput/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ └── TagSearch/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.scss │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── Timeline/ │ │ │ ├── components/ │ │ │ │ ├── DiscussionItem/ │ │ │ │ │ ├── discussion-item-content.scss │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── DiscussionSelector/ │ │ │ │ ├── index.jsx │ │ │ │ └── style.scss │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ ├── style.scss │ │ │ └── timeline-action-bar.scss │ │ ├── UserPrivacy/ │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── UserProfile/ │ │ │ ├── components/ │ │ │ │ ├── ProfileForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ └── ProfileInfo/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.scss │ │ │ ├── index.spec.tsx │ │ │ ├── index.tsx │ │ │ └── style.scss │ │ ├── UserSecurity/ │ │ │ ├── components/ │ │ │ │ ├── LoginDetails/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── OpenPGPForm.scss │ │ │ │ ├── OpenPGPGenerateForm.tsx │ │ │ │ ├── OpenPGPImportForm.tsx │ │ │ │ ├── OpenPGPKey/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── OpenPGPPrivateKeys/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── PasswordDetails/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ ├── PasswordForm/ │ │ │ │ │ ├── index.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── TFAForm/ │ │ │ │ └── index.jsx │ │ │ ├── index.jsx │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── ValidateDevice/ │ │ │ ├── index.js │ │ │ ├── presenter.jsx │ │ │ └── style.scss │ │ ├── View/ │ │ │ ├── components/ │ │ │ │ ├── MessageItem/ │ │ │ │ │ ├── index.js │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ └── style.scss │ │ │ │ └── MessageSelector/ │ │ │ │ ├── index.jsx │ │ │ │ └── style.scss │ │ │ ├── index.jsx │ │ │ ├── style.scss │ │ │ └── withCurrentView.jsx │ │ ├── contact/ │ │ │ ├── Contact.tsx │ │ │ ├── ContactBook/ │ │ │ │ ├── components/ │ │ │ │ │ ├── ImportContact/ │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── presenter.jsx │ │ │ │ │ ├── ImportContactButton/ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ImportContactForm/ │ │ │ │ │ │ ├── index.jsx │ │ │ │ │ │ ├── presenter.jsx │ │ │ │ │ │ └── style.scss │ │ │ │ │ └── TagList/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── contact-book-menu.scss │ │ │ │ ├── index.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── query.spec.tsx │ │ │ │ ├── query.ts │ │ │ │ └── style.scss │ │ │ ├── ContactForm.tsx │ │ │ ├── EditContact.spec.tsx │ │ │ ├── EditContact.tsx │ │ │ ├── NewContact.spec.tsx │ │ │ ├── NewContact.tsx │ │ │ ├── components/ │ │ │ │ ├── AddFormFieldForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── AddressDetails/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── AddressForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── BirthdayDetails/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── BirthdayForm/ │ │ │ │ │ ├── index.ts │ │ │ │ │ └── presenter.tsx │ │ │ │ ├── ContactPageWrapper.tsx │ │ │ │ ├── ContactProfileForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── ContactTitleField/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── EmailDetails/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── EmailForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── FormCollection/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── IdentityDetails/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── IdentityForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── ImDetails/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── ImForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── OrgaDetails/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── OrgaForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── PhoneDetails/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── PhoneForm/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── PublicKeyForm/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── presenter.tsx │ │ │ │ │ └── style.scss │ │ │ │ ├── PublicKeyList/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── style.scss │ │ │ │ └── ReduxedInputFileGroup/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.scss │ │ │ ├── contact-action-bar.scss │ │ │ ├── contact-main-title.scss │ │ │ ├── services/ │ │ │ │ ├── contactValidation.jsx │ │ │ │ ├── contactValidation.spec.jsx │ │ │ │ ├── handleContactSaveErrors.spec.ts │ │ │ │ └── handleContactSaveErrors.ts │ │ │ └── style.scss │ │ └── error/ │ │ ├── PageError.tsx │ │ ├── PageNotFound.tsx │ │ ├── components/ │ │ │ └── CaliopenAscii.tsx │ │ └── style.scss │ ├── services/ │ │ ├── api-client/ │ │ │ ├── index.ts │ │ │ └── types.d.ts │ │ ├── api-location/ │ │ │ └── index.js │ │ ├── api-patch/ │ │ │ ├── index.js │ │ │ └── index.spec.js │ │ ├── asciify.js │ │ ├── asciify.spec.js │ │ ├── browser-notification/ │ │ │ └── index.js │ │ ├── capitalize.js │ │ ├── config.ts │ │ ├── encode-utils/ │ │ │ ├── index.js │ │ │ └── utf8ArrayToString.js │ │ ├── encryption/ │ │ │ ├── index.js │ │ │ └── index.spec.js │ │ ├── event-manager/ │ │ │ └── index.js │ │ ├── filter-contacts/ │ │ │ ├── index.js │ │ │ └── index.spec.js │ │ ├── importance-level/ │ │ │ └── index.js │ │ ├── localStorage/ │ │ │ └── index.js │ │ ├── message/ │ │ │ ├── index.js │ │ │ └── index.spec.js │ │ ├── mime/ │ │ │ └── index.js │ │ ├── openpgp-keychain-repository/ │ │ │ └── index.js │ │ ├── openpgp-manager/ │ │ │ ├── api.ts │ │ │ ├── errors.ts │ │ │ ├── index.spec.ts │ │ │ └── index.ts │ │ ├── protocols-config/ │ │ │ └── index.ts │ │ ├── renderReduxField/ │ │ │ └── index.jsx │ │ └── username-utils/ │ │ ├── username-availability.ts │ │ ├── username-validity.spec.ts │ │ └── username-validity.ts │ ├── store/ │ │ ├── actions/ │ │ │ ├── message.js │ │ │ └── timeline.js │ │ ├── configure-store.ts │ │ ├── middlewares/ │ │ │ ├── axios-middleware.ts │ │ │ ├── crash-reporter-middleware.js │ │ │ ├── decryption-middleware.js │ │ │ ├── discussions-middleware.js │ │ │ ├── encryption-middleware.js │ │ │ ├── freeze.js │ │ │ ├── importance-level-middleware.js │ │ │ ├── messages-middleware.js │ │ │ └── search-middleware.js │ │ ├── modules/ │ │ │ ├── device.ts │ │ │ ├── discussion.ts │ │ │ ├── draft-message.spec.ts │ │ │ ├── draft-message.ts │ │ │ ├── encryption.ts │ │ │ ├── i18n.js │ │ │ ├── importance-level.js │ │ │ ├── local-identity.js │ │ │ ├── message.js │ │ │ ├── message.spec.js │ │ │ ├── notification.js │ │ │ ├── participant-suggestions.ts │ │ │ ├── provider.js │ │ │ ├── public-key.js │ │ │ ├── remote-identity.js │ │ │ ├── search.js │ │ │ ├── settings.js │ │ │ └── view.js │ │ ├── reducer.ts │ │ └── selectors/ │ │ ├── device.js │ │ ├── getModuleStateSelector.js │ │ ├── message.js │ │ ├── provider.js │ │ ├── settings.js │ │ ├── tab.js │ │ └── timeline.js │ ├── styles/ │ │ ├── base/ │ │ │ ├── fonts.scss │ │ │ └── reset.scss │ │ ├── common.scss │ │ ├── config/ │ │ │ ├── config.scss │ │ │ └── theme/ │ │ │ ├── dark.scss │ │ │ └── light.scss │ │ ├── object/ │ │ │ ├── o-avatar.scss │ │ │ ├── o-callout.scss │ │ │ ├── o-clickable.scss │ │ │ ├── o-date-picker.scss │ │ │ ├── o-form-element.scss │ │ │ ├── o-hidden-element.scss │ │ │ ├── o-navigation.scss │ │ │ ├── o-pi-border.scss │ │ │ ├── o-reset-html-message.scss │ │ │ └── o-triangle.scss │ │ ├── util/ │ │ │ ├── breakpoint.scss │ │ │ ├── flex-grid.scss │ │ │ └── u-gradient.scss │ │ └── vendor/ │ │ ├── bootstrap_font-awesome.scss │ │ ├── bootstrap_foundation-sites.scss │ │ ├── bootstrap_react-redux-notify.scss │ │ └── foundation-sites/ │ │ ├── _config.scss │ │ └── _flex-grid.scss │ └── types.d.ts ├── template/ │ ├── index.ejs │ └── index.html ├── test/ │ ├── fixtures/ │ │ ├── contacts/ │ │ │ ├── data.json │ │ │ └── index.ts │ │ ├── device/ │ │ │ └── index.ts │ │ ├── tags/ │ │ │ └── data.json │ │ └── user/ │ │ ├── data.json │ │ └── index.ts │ ├── functional/ │ │ ├── features/ │ │ │ ├── 00_home-spec.js │ │ │ ├── 10_discussion-spec.js │ │ │ ├── 20-message-list-spec.js │ │ │ ├── 21-reply-to-messag-spec.js │ │ │ ├── 22-compose-spec.js │ │ │ ├── 23-delete-message-spec.js │ │ │ ├── 24-scroll-spec.js │ │ │ ├── 25-assoc-participant-contact-spec.js │ │ │ ├── 30-settings-spec.js │ │ │ ├── 35-remote-identitiy-settings-spec.js │ │ │ ├── 40-new-contact-spec.js │ │ │ ├── 50-search-spec.js │ │ │ ├── 60-tag-spec.js │ │ │ ├── 70-device-spec.js │ │ │ ├── 80-account-spec.js │ │ │ └── 90_notification-spec.js │ │ ├── protractor.conf.js │ │ └── utils/ │ │ ├── navigation.js │ │ ├── timeline.js │ │ ├── user-util.js │ │ └── window.js │ ├── msw-handlers/ │ │ ├── contacts.ts │ │ ├── settings.ts │ │ ├── tags.ts │ │ └── user.ts │ ├── providers.tsx │ ├── server.ts │ └── unit/ │ ├── lingui-react.jsx │ └── setup.ts ├── tsconfig.json └── webpack/ ├── config.js ├── webpack.common.js ├── webpack.config.browser.js └── webpack.config.server.js